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

Re: Playing multiple sound



井上です。

Naoto Takahashi <ntakahas@...> writes:

> Linuxに限らないんですが、esoundっていうライブラリがありまして、これを
> 使うと音を再生するソフトウェアの要求を一度に複数個受け取れるようになり
> ます。

実は、BEPのLinuxスピーチサーバはこれを利用することが一応できるようにし
ています。3月最初まではこれでがんばっていたのですが、プログラミング上
の問題とかVMWareでesound経由の音がまともに出ないとかあって、今はデバイ
スに直接書いてます。
> ただし、この複数再生機能が裏目に出ることもあるよ
> うです。たとえばEmacsからfestivalを起動して複数の文を一度に読ませると、
> 前の文を読み終わらないうちに次の文を読み始めたりすることがあります。つ
> まり1番目の文の終わりの部分と、2番目の文の始まりの部分が重なって再生さ
> れてしまうということです。聖徳太子なら問題ないのでしょうが…。

きっとesdのソケットを文が終わっても閉じずに再利用すればタイミングは保
証されると思います。
ただし、
・esdのソケットに書き込んでしまってから音が出終わるまでに時間差がある。
・送ってしまった音を任意の時点で止めることができない。(resetを行う
ioctlが実装されていない)
というかなりつらい問題があります。一応latencyとかを得る関数などあるの
ですが、うまく動いた経験がありません。
BEPでは出ている音声を即時に停止できるかどうかが操作性を大きく左右しま
す。
そこで、BEPでは別のスレッドから現在しゃべっているソケットのIDを取得し
てボリュームを0に絞らせて、ソケットを閉じ、また別のソケットを開く
という手順で即時停止を行っていました。
しかし、これだと上に書かれているように、複数の分が同時に読まれてしまう
問題が起きます。そこで、書き込みを行う側でしゃべっている時間に相当する
遅延を置くようにしました。しかし今度はこれが原因で(なぜか)クリックノ
イズが入るようになってしまいました。。。
さらに私のマルチスレッドプログラミングの未熟さから、これを行うとかなり
サーバが不安定になってしまいます・・・

という経緯もあって、現在の最新のソースではesoundを使わないのが初期値に
なっています。
できればだんだんと同時再生ができるデバイスやドライバが増えてくれると非
常に助かるのでした。

-- 
                    Koichi Inoue, ARGV
                    E-Mail: inoue@...
                    ICQ UIN: 74900690