1 / 16

オーディオフレームワークの変更

オーディオフレームワークの変更. 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.

geneva
Download Presentation

オーディオフレームワークの変更

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. オーディオフレームワークの変更 TAMURA Kent <kent@NetBSD.org>

  2. Agenda • Sample rate conversion (aurateconv) • struct audio_format (auconv) • Audio filter pipeline (kent-audio1) • High Definition Audio (azalia) • In-kernel audio mixing (kent-audio2)

  3. Audio architecture of NetBSD 1.5 or prior userland uiomove audio_ringbuffer auconv, mulaw DMA

  4. Sample rate conversion • Mar. 2002, NetBSD 1.6 or later • モチベーション • 自分のPCでauichが認識されるのに/dev/audioが開けない • USBオーディオ機器も同様 • 問題 • NetBSDではμ-law, 8kHz, モノラル のサポートが必須だが、ハードウェアが8kHzモノラルをサポートしていない • 解決策 • 周波数変換とステレオ⇔モノラル変換を実装8kHzモノラルをサポートしていないデバイスへの救済策という位置付け

  5. Audio architecture of NetBSD 1.6 and 2.x userland uiomove auconv, mulaw aurateconv audio_ringbuffer DMA

  6. struct audio_format • Nov. 2004, NetBSD 3.0 or later • 問題 • 各オーディオドライバの *_set_params() に似たようなコードが散在 • フレームワークが変換ルーチンを用意しているフォーマットなのに、*_set_params() でサポートし忘れるとユーザには使えない • 解決策 • ハードウェアの能力を表現する構造体struct audio_formatと、その情報から変換ルーチンを自動的に選ぶサポート関数を用意

  7. 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. 8 bit PCM 16 bit PCM 24/24 bit PCM 24/32 bit PCM precision validbits

  9. Audio filter pipeline • Dec. 2004 - Jan. 2005, NetBSD 3.0 or later • 問題 • フォーマット変換ルーチンのインタフェイスが汚ない • 録音と再生でインタフェイスが異なる • 変換は1つしか適用できない • 解決策 • オーディオ変換器一般を表現するインタフェイスを定義 • 録音と再生の区別をなくす • 複数の変換を適用可能 • aurateconvもこのインタフェイスで表現 • リバーブ、ソフトウェアボリューム、PCM以外での周波数変換の可能性

  10. 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

  11. High Definition Audio • Jun. 2005, NetBSD 3.0 or later • モチベーション • 息抜き • 問題 • High Definition Audioのドライバがない • 解決策 • 書いた • 解決してない問題 • 24/32bitフォーマットを指定する手段がない

  12. In-kernel audio mixing • Under development, NetBSD 4.0? 5.0? • 解決したい問題 • オーディオデバイスが1つしかなくても、複数の音が再生できるといいね • EsounD, artsd のようにユーザランドで対処する手段があるが、遅延が大きいのでWindowsやFreeBSDみたいにカーネルでサポートしたい • PEACE用に、DirectSound APIのネイティヴサポートをしたい

  13. 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

  14. In-kernel audio mixingの要件 • 再生を合成する。録音は排他使用。 • ユーザランドとのインタフェイスは変更しない(が、挙動は多少変更せざるを得ない) • ハードウェア用ドライバへの変更は極力少なくする

  15. In-kernel audio mixing実装の課題 • audio.cはゴチャゴチャしすぎ • 簡単にはPCMに変換できない(つまり、合成も周波数変換もできない)フォーマットがある  AUDIO_ENCODING_MPEG_* • mmap()をどう扱うか

  16. Comments? • mmap()は、変換や合成を何もしないモードでのみサポートすればいいのでは • ハードウェアの能力を正確にユーザランドに使える手段はやっぱり必要 • ASIOみたいな低レイテンシのためにmmap()は必要 • DirectSoundみたいなAPIを(PEACE以外でも)用意すればいいんじゃないか

More Related