160 likes | 263 Views
オーディオフレームワークの変更. TAMURA Kent <kent@NetBSD.org>. Agenda. Sample rate conversion (aurateconv) struct audio_format (auconv) Audio filter pipeline (kent-audio1) High Definition Audio (azalia) In-kernel audio mixing (kent-audio2). Audio architecture of NetBSD 1.5 or prior. userland. uiomove.
E N D
オーディオフレームワークの変更 TAMURA Kent <kent@NetBSD.org>
Agenda • Sample rate conversion (aurateconv) • struct audio_format (auconv) • Audio filter pipeline (kent-audio1) • High Definition Audio (azalia) • In-kernel audio mixing (kent-audio2)
Audio architecture of NetBSD 1.5 or prior userland uiomove audio_ringbuffer auconv, mulaw DMA
Sample rate conversion • Mar. 2002, NetBSD 1.6 or later • モチベーション • 自分のPCでauichが認識されるのに/dev/audioが開けない • USBオーディオ機器も同様 • 問題 • NetBSDではμ-law, 8kHz, モノラル のサポートが必須だが、ハードウェアが8kHzモノラルをサポートしていない • 解決策 • 周波数変換とステレオ⇔モノラル変換を実装8kHzモノラルをサポートしていないデバイスへの救済策という位置付け
Audio architecture of NetBSD 1.6 and 2.x userland uiomove auconv, mulaw aurateconv audio_ringbuffer DMA
struct audio_format • Nov. 2004, NetBSD 3.0 or later • 問題 • 各オーディオドライバの *_set_params() に似たようなコードが散在 • フレームワークが変換ルーチンを用意しているフォーマットなのに、*_set_params() でサポートし忘れるとユーザには使えない • 解決策 • ハードウェアの能力を表現する構造体struct audio_formatと、その情報から変換ルーチンを自動的に選ぶサポート関数を用意
struct audio_format • 24/24bitフォーマットと24/32bitフォーマットが区別できない問題 validbits, precision • スピーカー位置の問題 channel_mask • これらについて能力を記述する手段は用意したが、ユーザランドから指定する手段はない struct audio_format { void *driver_data; int32_t mode; u_int encoding; u_int validbits; u_int precision; u_int channels; u_int channel_mask; u_int frequency_type; u_int frequency[AUFMT_MAX_FREQUENCIES]; };
8 bit PCM 16 bit PCM 24/24 bit PCM 24/32 bit PCM precision validbits
Audio filter pipeline • Dec. 2004 - Jan. 2005, NetBSD 3.0 or later • 問題 • フォーマット変換ルーチンのインタフェイスが汚ない • 録音と再生でインタフェイスが異なる • 変換は1つしか適用できない • 解決策 • オーディオ変換器一般を表現するインタフェイスを定義 • 録音と再生の区別をなくす • 複数の変換を適用可能 • aurateconvもこのインタフェイスで表現 • リバーブ、ソフトウェアボリューム、PCM以外での周波数変換の可能性
Audio architecture of NetBSD 3.x userland uiomove audio_stream stream_filter_t audio_stream stream_filter_t audio_stream stream_filter_t audio_stream DMA
High Definition Audio • Jun. 2005, NetBSD 3.0 or later • モチベーション • 息抜き • 問題 • High Definition Audioのドライバがない • 解決策 • 書いた • 解決してない問題 • 24/32bitフォーマットを指定する手段がない
In-kernel audio mixing • Under development, NetBSD 4.0? 5.0? • 解決したい問題 • オーディオデバイスが1つしかなくても、複数の音が再生できるといいね • EsounD, artsd のようにユーザランドで対処する手段があるが、遅延が大きいのでWindowsやFreeBSDみたいにカーネルでサポートしたい • PEACE用に、DirectSound APIのネイティヴサポートをしたい
userland userland uiomove uiomove audio_stream stream_filter_t audio_stream audio_stream audiomix The same audio_params audio_stream stream_filter_t audio_stream DMA
In-kernel audio mixingの要件 • 再生を合成する。録音は排他使用。 • ユーザランドとのインタフェイスは変更しない(が、挙動は多少変更せざるを得ない) • ハードウェア用ドライバへの変更は極力少なくする
In-kernel audio mixing実装の課題 • audio.cはゴチャゴチャしすぎ • 簡単にはPCMに変換できない(つまり、合成も周波数変換もできない)フォーマットがある AUDIO_ENCODING_MPEG_* • mmap()をどう扱うか
Comments? • mmap()は、変換や合成を何もしないモードでのみサポートすればいいのでは • ハードウェアの能力を正確にユーザランドに使える手段はやっぱり必要 • ASIOみたいな低レイテンシのためにmmap()は必要 • DirectSoundみたいなAPIを(PEACE以外でも)用意すればいいんじゃないか