新しいものを表示

結構汎用的だと思うけど><
一回ライブラリ作っておいて互換性も保ち続ければ次にオーディオ再生したい時にそのライブラリにファイル投げてPlayってするだけで音ならせるし、曲名とかも取得できる><

orange さんがブースト

というか私がライブラリ作るときはアプリケーションの性質を想定せず「ライブラリ自体がどうあるべきか」を考えて作るので、その場合はプレイヤーはライブラリが単独で使い物になるレベルに到達するまでは手をつけない

スレッドを表示
orange さんがブースト

アプリを作るときどこからライブラリにするかは場合によるのでなんとも言えないけど、基本的に音楽プレイヤーは “汎用的でない” ものなので、汎用的でないアプリケーションのために過度に「早すぎる抽象化」を施した実装をしたくないという気持ちがある

実際には、バラックな実験コードな第一段階のアプリ作って、そのコードをリファクタリングしながらライブラリを構築していって、基本機能がライブラリに移っていくみたいな流れで作るかも><
バラックな実験コードはぐちゃぐちゃで、ライブラリ化していく時に再利用と将来性を意識した書き方に変える感じで、そういう風に作ったライブラリを長期間あちこちで使い回したりする感じ><

アプリ作るときのやり方の違いでもあるのかも?><
オレンジは例えばオーディオプレイヤーアプリを作る場合は、オーディオプレイヤーを簡単に作れるライブラリを作りながらそのフロントエンドを作るみたいな方式で作るかも><
オーディオプレイヤーに限らず使い捨てではないアプリ作る時はだいたいそんな感じかも><

orange さんがブースト

あと、そもそも音楽プレイヤーの文脈であれば「エントリとして選択できるものはだいたい決まっている」か「任意の key-value pairs を扱える」のどちらかの仕様であると思われるので、形式やファイルごとのメタデータの構造差はアプリケーション側のスキーマ設計で完全に吸収される

orange さんがブースト

たぶんその辺りはアプリケーションかライブラリかで相当変わる

オレンジ方式は、『音楽』が『音声データ』と『曲名等のメタデータ』を持つ(『...』がそれぞれ型)だけど、
らりおさん方式だと、『メタデータも持つ音楽』が『音声データ』を持ってるみたいな構造になってるの興味深いかも><
オレンジの発想だとメタデータこそフォーマットが安定しない(ある形式ではジャンル名があったり、音圧の情報が追加されてたり)って発想があるので、上位にある『音楽』型が将来仕様変更が少なくなるように、メタデータは別の型へのハンドルにするって発想かも><

オレンジ方式の「フラットに持つデータは複雑にさせずツリー状ににしよう><」って設計、深くなった時にすごいことになるというデメリットがあるし、命名が冗長的だと結構とんでもない事になる><(よくなってる><;)

デザパタブームの時に学んだ内容もう1ミリも覚えてなくてほぼ自己流になってる><;

orange さんがブースト

デザパタ自体は既に定まってしまった残念な言語仕様に対する workaround 的な面があるので仕方ないっちゃ仕方ないんだけど、「デザパタがあって素晴らしい! デザパタを使いましょう!」みたいにさもデザパタが正の存在であるかのように喧伝する連中が鬱陶しすぎる (暴言)

あとオレンジが書いたみたいな方式とかオレンジの傾向ってつまり「データをなるべくツリー状に扱いたい」 かつ 「それぞれは明示的に命名された型であることが望ましい(無名の型や既成の型はある程度避ける)」みたいな感じの発想になってるかも><

実際のライブラリだとStreamになってる事多いかも><
ファイルかオンラインかハードウェアからきたやつかとか区別無く扱いたいのと、デコーダを外部用意する構造にする必要が多い(説明難しい><;)ので「適切なデコーダがStreamからデータ読む」みたいにするかも><

orange さんがブースト

ネットワーク経由のデータとかを扱いたい可能性を考えると -File よりは -Handle か -Uri かな

orange さんがブースト

や、音楽プレイヤーの文脈で言うならさらに Sound は再生しながらストリーミング読み込みという感じになりそうなので、波形データの部分的読み出しやデコードを担当する SoundStream みたいな型を用意することになるだろうけど。

スレッドを表示
orange さんがブースト

内部的にファイルハンドルとかファイルパスのみを持つようなやつを MusicHandle とか MusicFile と命名しといて、

MusicFile::meta(&mut self) -> Music
MusicFile::sound(&mut self) -> Sound

みたいな感じの API にするかなぁ。
&mut なのは std::fs::File は読み込みでも変更されるから

スレッドを表示
orange さんがブースト

たぶんここで MusicMeta や MusicInfo という名前にはしない

スレッドを表示
orange さんがブースト

だったら

struct Sound {
channels: u8,
len: Duration,
repeat: bool,
waveform: Vec<u8>,
}
struct Music {
title: Option<String>,
artist: Vec<String>,
// ...
}
という感じかなぁ (Sound あるいはそのハンドルが Music に含まれるかは要件次第)

この事例ではそう><
曲名とかって再生とか技術的な面(?)では直接は関係ないけど、でもプレイヤーとしてはくっつけて扱う方が便利じゃん?><

orange さんがブースト

channels とか len とか repeat がメタデータだと思ってたけど、曲のメタデータの話か

古いものを表示
:realtek:

思考の /dev/null