トップページunix
1001コメント297KB

NetBSD その10

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。05/01/22 04:44:31
    ,,-‐''""''ー--е        巛 ヽ
  ..|""       . .||         〒 !
 . .;;|.  NetBSD .|| イヤッッホォォォオオォオウ!
:.: .;;|        ...||         / /
.::..::;:;|    ,ノ""""||    ∧_∧ / /
.:::::;;:| ,/" ∧_∧n||   (´∀` / /
  ""   ( ´∀`/ )   ,-     f
      /  ._/ /||   / ュヘ    |
     /  __/( ) 〈_} )   |
     /   ( と)  ∧_∧   !
    / / ̄\ \\(´∀` ),ヘ  |  n
  ___/ /    \ \      ヽ    ( E)     ``もちろんNetBSDです。''
  (__/       \ |     /ヽ ヽ_//      http://www.netbsd.org/

お約束、関連リンクは>>2-10あたり
0598名無しさん@お腹いっぱい。05/03/12 00:30:35
>>595
ハードウェアデバイスの動作クロックが厳密に同期していれば
read/writeするプログラムを書けば見掛け上は可能だろうけど、
厳密に同期していないなら録音が相対的に速すぎてバッファが溢れるか、
あるいは遅すぎて底を突いて音的に破綻する。

差を埋めるにはアプリ側で無段階サンプリングレートコンバータの
ような仕組みが必要。uaudioのレイテンシは60ms固定だったかなぁ?
DMA割り込みでコールバックするような仕組みを作ってレイテンシを
追い込めるようにできたら神だね。
0599名無しさん@お腹いっぱい。05/03/12 00:47:03
>>597
おお、できました。
bsがレイテンシになってるみたいです。
bs=1にしてもそこそこ遅延するので、使えないかもしれませんが。
ddくらい思いつきたかった。

>>598
無知なのでサパーリ分かりませんが、ユーザランドはもちろんのこと
カーネルランドで組み込むことも難しいってことでしょうか?
ここら辺は Windowsや Macと比べてどうなんですかねえ。
0600名無しさん@お腹いっぱい。05/03/12 01:04:52
>>599
VSTiやASIOと呼ばれているAPIがコールバックベースじゃなかったかな。
仕様書を読んでないので嘘吐いてるかも知れないが。

それとaudioの書き込みで操作するカーネル側のバッファには、動作に
ヒステリシスがある。audio(4)の説明を読んでみそ。
0601名無しさん@お腹いっぱい。05/03/12 01:46:10
「ヒステリシス」って聞き慣れない言葉だなー
物理化学方面の言葉かな…
0602名無しさん@お腹いっぱい。05/03/12 02:07:02
履歴現象、とかいうと余計意味わからん罠
0603名無しさん@お腹いっぱい。05/03/12 02:30:53
>>598
厳密に同期してなくても、ずれがバッファ容量を
越えるまでは動作するから、ある有限時間の間は
OKなのでは?

あと、入力側が遅い場合には、出力に無音状態が入る
だけなので、まあ許されるんじゃないの? まあこの
無音のことを指して音的に破綻って言ってる気はする
けど。
0604名無しさん@お腹いっぱい。05/03/12 14:29:39
>>598
ユーザーランドでも一応できるよ。
audio系の場合レイテンシの制約が厳しいから、
どれくらい使いものになるかは分からんけど。
1. まず、しばらくの間入力した内容をプログラム内の
 バッファに蓄積する。(このぶん遅延が生じる)
2. non-blocking モードで、入力する。
3. non-blocking モードで、出力する。
4. これを続けていると、入力と出力の速度に差がある
 場合、バッファリングしているサイズが増減する。
 入力側が速いとバッファサイズがどんどん増えるし、
 逆だとバッファサイズがどんどん減っていく。
 この増減の傾向を関知したら、あとはサンプリング
 速度変換をかければいい。
この方面よく知らないんだけど、バッファが増えて
くるようなら、単に適当に間引き、減るようなら
適当に水増しする(適当な箇所を選び、前後のデータ
の中間値を水増しする)だけじゃ駄目? 音質悪い?
060560405/03/12 14:44:43
>>598ではなくて>>599ですた。
0606名無しさん@お腹いっぱい。05/03/12 18:26:26
>>604
ユーザランドで処理するとしたらselect(2)で監視しながらぐるぐる
ループする感じですかね?

サンプルレート変換例としてはゼロ値挿入で192kHzぐらいに
嵩増ししてからFIRでアンチエイリアスして間引きながら出力とか。
かなり計算が重くなりそうだね。
http://www.analog.com/en/prod/0,2877,765%255F807%255FAD1896,00.html

あるいは入力を折れ線グラフと見立てて1次補間とか。aurateconv?
0607名無しさん@お腹いっぱい。05/03/12 18:37:53
そういえば、aurateconv の線型補間をもっと質のいいものに換えようっ
て動きはないんですかね。

0608名無しさん@お腹いっぱい。05/03/12 19:08:13
> ユーザランドで処理するとしたらselect(2)で監視しながらぐるぐる
> ループする感じですかね?

うん、non-blocking モードだから、select(2)とかpoll(2)とか
kqueue(2)とか使わないとまずいす。
0609名無しさん@お腹いっぱい。05/03/12 22:52:39
ecasound改良してよ
0610名無しさん@お腹いっぱい。05/03/12 23:00:35
>>600
VSTiはよく分かりませんがASIOというのがまさにレイテンシを小さくするためのドライバ
らしいですね。

>>604
なるほど。そもそも入力と出力の速度に差があるのはどうしてなんでしょうか?

USBオーディオインターフェイスが UA-3FXというやつなんですが、
/dev/audio1が使えても /dev/sound1に対して読み書きをした瞬間ハングしたり、
起動中に一度はずすと、もう一度つないでもそのデバイスでは認識されなくなったりします。
0611名無しさん@お腹いっぱい。05/03/13 00:32:35
>>610
ハードウェアが基準とするクロックが異なれば、同じ周波数の音声デー
タを扱っていても微妙にずれるんでないかな。例えば AC'97 codec は
24.576MHz、USB は 48MHz を基準にして動いてます。

> /dev/audio1が使えても /dev/sound1に対して読み書きをした瞬間ハングしたり、
> 起動中に一度はずすと、もう一度つないでもそのデバイスでは認識されなくなったりします。

それはバグだろう。send-pr どうぞ。
0612名無しさん@お腹いっぱい。05/03/13 00:53:27
>>610
各サウンドカードは普通は独立した水晶で動いているから(PCIバス同期な
デバイスも存在するかもしれないけど…)、仮に同じ周波数規格の水晶を
基準にしていたとしても個体のバラツキや温度等に依存して速度に微妙な
差がある。ひとつのデバイスを読み書きオープンしてfull-duplexで使った
場合でも読みだし側と書き込み側の速度がぴったり同じという保証はない。
このあたりはハードウェア依存。

UA-1000のようなマルチポート型の機材ならポート間で厳密に同期して
いると思う…けどUA-1000は多分動かないな。ehciドライバで等時転送が
未実装のようなので。
■ このスレッドは過去ログ倉庫に格納されています