0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

FreeBSDのサウンドドライバ調査編

Last updated at Posted at 2021-11-23

ディスクリプターのリングを作りDMAが動くようになったのですが、割り込みでchn_intr()を呼び出すと、DMAがunder runしてしまいます。

割り込みはDMAでバッファが空になり、再充填のために呼ばれます。

いろいろデバッグライトを入れて、確認したところ割り込みでchn_intr()で1つバッファを埋めてる間に3つ空になっています。これでは間に合うわけがありません。

chn_intr()はsys/dev/sound/pcm/channel.cにあります。

chnで始まる関数はchannel.cでsndbufで始まる関数はbuffer.cにあります。pcmインターフェースは名前の付け方に一貫性がない感じがします。

処理は

chn_intr() -> chn_wrfeed() -> sndbuf_feed()

と行われます。sndbuf_feed()の中の、

        do {
                cnt = FEEDER_FEED(feeder, channel, to->tmpbuf,
                    min(count, maxfeed), from);
                if (cnt == 0)
                        break;
                sndbuf_acquire(to, to->tmpbuf, cnt);
                count -= cnt;
#ifdef SND_DIAGNOSTIC
                cycle++;
#endif
        } while (count != 0);

FEEDER_FEEDで大きく時間を使ってしまっているようです。FEEDER_FREEDはkobj interfaceでCore AudioでいうところのAudio Unitのようなもので、フォーマット変換などをしているようです。

小言ですがFEEDER_FEEDも馬から落ちて落馬してみたいで、センス悪いですね。

なんか回避策ないかな。。。

よくよく考えてみると、割込みハンドラの中でフォーマット変換するってありえない。

以下でログが出るようになります。

% sudo sysctl hw.snd.verbose=4

/dev/sndstatにも情報が追加されます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?