謝罪

今まで間違ったことを言っていた可能性大。
少なくとも私の環境ではvm-sound-OSSのコードを殆ど修正しなくても全二重が実現出来ました。

言い訳

  1. 最新版のOSSについてはマニュアルが無いように見受けられる。古い版のマニュアルには同一デバイスを同時に開いてはならないと書いてある。
  2. vm-sound-OSSは読み込み用に/dev/dspを、書き込み用に/dev/dsp1それが駄目なら/dev/dspを開く。
  3. 多くの場合/dev/dspは/dev/dspNに対するリンクではなく、それ自体が独立したデバイスとなっている。そして、多くの場合、/dev/dsp1ではマイクで拾った音を拾ったりするデバイスではない。従って多くの場合、録音が出来ない。
  4. /dev/dsp1を諦めて/dev/dspで録音を試みると、コード中のassertで撃沈される。この挙動はコード中のコメントとは矛盾しているように思うが、コード自身は同時に同一のデバイス(を表現する構造体)を開ける仕組みになはなっていないため、assert自体は正当である。
  5. 上述ののように、同時に同一のデバイスを開くことは出来ないのに、そのパターンを考慮した無意味なコードが散在している。
  6. 要するに、きっと、多くの人が好き勝手にコードを入れているためだと思うが、全体として意味不明なコードになってる。

結局何が悪いのか

/dev/dspが/dev/dspN へリンクになっているのがきっと本来の姿。
そうでない設定がデフォルトになるLinuxディストリビューションを使っているのが敗因。
/dev/dspが/dev/dspNへのリンクになっていれば、下のような(改造ではなく)カスタマイズを行う必要はない。

解決方法

これはOSSALSAのバージョンにもよっては駄目かもしれません。
少なくともマニュアルに書いてあった記述には反すると思うし。
ただ、元々のvm-sound-OSSの作者の意図はこれのはず。


以下のような部分があるので
 struct dsp dev_dsp1 = { "/dev/dsp1", -1 };
 struct dsp dev_dsp = { "/dev/dsp", -1 };
/dev/dspを読み書き両用に使いたいなら、これを
 struct dsp dev_dsp1 = { "/dev/dsp", -1 };
 struct dsp dev_dsp = { "/dev/dsp", -1 };
のようにする。
或いは、/dev/dspに対するシンボリックリンクを何処かに作って、
それを指し示すようにする。

改造

同一デバイスを複数回開くことはせず、
読み書き両用に使うというやつのを作ってみたのですが、
お蔵入り決定。