[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

OSSプログラミング



西本@京都工芸繊維大学です。

ちょっと前の井上さんの話に関連するのですが、
Linux のサウンド出力関係で、いま起きている現象を書きます。

Dell Inspiron 3000 というノートパソコンに 
RedHat Linux 6.1 改訂日本語版(FTP版)をフルインストールで
入れて、OSS のプログラミングを試しているところです。
オーディオは Crystal 4237B というチップなので、
sndconfig でそのように設定をしました。
play で wave ファイルを再生することもできるようになり、
「打ち込み君」の音声合成部分も動作しました。

ところが、再起動すると、出力する音が断続的に欠落するようになり、
「こんにちはこれからキーボードの入力練習を始めます」が
「こんにちはこれ・を始めます」のような鳴り方になるのです。
しかし sndconfig を実行し直せば、この障害は解消されます。

これはドライバの初期化の問題かなとも思うのですが、
このような経験をされたことはありますか?
商用版の OSS や ALSA を導入すれば解決するのか、
あるいは OSS のプログラミングで、バッファサイズの取り方
(いまはまったくデフォルトからいじっていません)を変えれば
回避できるのか、ちょっと検討がつかない、という状況です。

こちらでもいろいろな環境で試してみたいと思うのですが、
なにか心当たりがあればお教えいただければ幸いです。

ちなみに私は下記のサイトの OSS/Lite の情報を参考にしています。
基本的にはこのとおりにやれば音は出ています。
http://www.geocities.com/SiliconValley/Horizon/3991/sp.html

以下、井上さんが以前お書きになっていた話ですが、

> ちょうど今私も悩んでいるところです。
> いきなり質問で恐縮ですがタイムリーなので。
> 今困っているのは必要なところで音声出力をぶちっと切ることができないところ
> です。
> 
> 停止要求があったかどうかのチェック(あれば「stopping」と出力してオーディ
> オデバイスをクローズしbreak)
> 波形合成
> 波形書き込み(/dev/dsp)
> 
> というループを別スレッドで回しているのですが、停止要求のビットをたてても
> 急には止まってくれません。おそらくその段階までに波形がかなりデバイスにバッ
> ファリングされているのだと思うのですが、これをフラッシュして、発音させず
> に泊める方法はないでしょうか。
> わかったら教えてください。

私もいまスレッドを使うようにプログラムを直そうと思い、
pthreads の勉強をしています。
井上さんの実装を参考にさせていただけませんか?

で、OSS の方ですが、
http://www.opensound.com/pguide/audio.html
を読むと、下記のように書かれています。

ioctl(audio_fd, SNDCTL_DSP_SYNC, 0) can be used when application wants
to wait until last byte written to the device has been played (it
doesn't wait in recording mode). After that the call resets (stops)
the device and returns back to the calling program. Note that this
call may take several seconds to execute depending on the amount of
data in the buffers. close() calls SNDCTL_DSP_SYNC automaticly.

ioctl(audio_fd, SNDCTL_DSP_RESET, 0) stops the device immediately and
returns it to the state where it can accept new parameters.

ioctl(audio_fd, SNDCTL_DSP_POST, 0) is light weight version of
SNDCTL_DSP_SYNC. It just tells to the driver that there is likely to
be a pause in the output. This makes it possible to the device to
handle the pause more intelligently.

ということで、
ioctl(audio_fd, SNDCTL_DSP_SYNC, 0)
を使わないで、
ioctl(audio_fd, SNDCTL_DSP_RESET, 0)
を使えばバッファのキャンセルができるのでは?

私もあとで試してみます。

==
西本卓也 (助手) / 京都工芸繊維大学 電子情報工学科
京都市左京区松ヶ崎御所海道町 (〒606-8585)
http://www-vox.dj.kit.ac.jp/nishi/
nishi@...