ASIO

ASIO4ALL on x64

Windows 7 (x64) にASIO4ALL (x64)をインストールしたのですが、IASIO::setSampleRate()が必ず失敗します。 IASIO::setSampleRate()しなければ動くようで、どうもdouble引数の受け渡しがうまくいっていない模様。 Winampのout_asio(x64).dllも動かないので自…

Boost.Asio + Coroutine

まもなくBoost 1.35 RC1リリースということで、Boost.Asioを弄ってみました。 Boost.Asioの非同期メカニズムはよくできているんですが、処理待ちのたびにコールバックするためどうしても処理の流れが分かりにくくなります。 そこで、Hamigaki.Coroutineを使…

続 pcm_formatの修正

ASIOのサンプルフォーマットには次のような種類があります。(リトルエンディアン整数のみ抜粋) ASIOSTInt16LSB 16ビット整数 ASIOSTInt24LSB 24ビット整数 ASIOSTInt32LSB 32ビット整数(下位8ビットは0固定) ASIOSTInt32LSB16 32ビット整数(上位16ビットは0…

asio::driver_list

ASIOドライバの列挙を実装できました。 namespace hamigaki { namespace audio { namespace asio { struct driver_info { std::string clsid; // クラスID std::string name; // ドライバ名 }; HAMIGAKI_AUDIO_DECL std::vector<driver_info> driver_list(); } } } // End</driver_info>…

続cygwinでASIO

IASIOのメンバ呼び出しをインラインアセンブラで書き直しました。もう全然C++じゃないです。 inline ::ASIOBool asio_init(::IASIO* this_ptr, void *sys_handle) { ::ASIOBool result; __asm__ ( "mov %2, %%eax\n\t" "push %%eax\n\t" "mov %1, %%ecx\n\t"…

cygwinでASIO?

ASIOサポートをソースツリーにマージして、Cygwin/MinGWでも動くように調整中です。 Cygwin/MinGWでコンパイルまではできましたが、実行するとコアダンプします。 サンクや仮想メモリ周りが怪しい気がして、サンクをはずして動かしてみましたが、効果なしで…

バグ取りとかメンバの追加とか

ここ数日の検討結果をコードに反映させました。今日の成果物日記に書いてない変更で大きなところは、multiplexer/demultiplexerのcomponent()メソッドでしょうか。 class multiplexer_impl { public: template<typename Source> void push(const Source& src, std::streamsize</typename>…

続 ASIOのバッファサイズ

よく考えると、2のn乗だけを扱うのであれば、最小値と最大値だけ返せば済む気がしてきました。 class asio_device { public: // 最小バッファサイズと最大バッファサイズを返す。 std::pair<long,long> minmax_buffer_size() const; };あるいは全部まとめて、 struct as</long,long>…

ASIOのバッファサイズ

ASIOには指定可能なバッファサイズを取得するASIOGetBufferSize関数があります。 ASIOError ASIOGetBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity);ここで、 minSize 設定可能な最小バッファサイズ maxSize 設定可能な…

asio_source

今日はasio_sourceの実装に取り掛かりました。 asio_sourceを追加すると、昨日の再生/停止問題がさらに複雑になります。 次のような場合を考えます。 // SourceとSinkを1個ずつ作成 asio.create_buffers(1, 1); // キャプチャしたデータをすぐに再生 io_ex::…

複数ストリームの再生と停止

asio_sinkのstart()とstop()周りを修正しました。今日の成果物asio_sinkはチャンネル毎に別のストリームになるように設計しています。そして、個々のストリームはシングルスレッドで順に書き込んでも、マルチスレッドで並行して書き込んでも動くようになって…

続asio_sink

ステレオ再生が出来ない原因が分かりました。問題はasio_sinkではなく、demultiplexerにありました。 demultiplexerを使わず、次のようにスレッドを使って再生するとうまくいきました。 asio.create_buffers(0, 2); // ド io_ex::background_copy copy0( io:…

asio_sink

まだ作りかけですが、何とかモノラル再生ができたのでアップしました。今日の成果物ステレオだとうまく鳴らないので、どこかバグっています。 #include <hamigaki/detail/windows/com_library.hpp> #include <hamigaki/audio/asio.hpp> #include <hamigaki/audio/sine_wave.hpp> #include <boost/iostreams/copy.hpp> #include <boost/iostreams/restrict.hpp> namespace audio = hamigaki::aud…</boost/iostreams/restrict.hpp></boost/iostreams/copy.hpp></hamigaki/audio/sine_wave.hpp></hamigaki/audio/asio.hpp></hamigaki/detail/windows/com_library.hpp>

作り直し

やっぱり、どう考えてもダブルバッファリングなしでは無理です。ノイズが入ります。 Winampプラグインもライブラリ内でさらにバッファリングしているようです。このバッファを小さくすると、実際に音が鳴らなくなりました。おそらく、ちゃんとしたASIO対応デ…

やっと音が鳴りました

まだ、asio_sinkの実装中。ようやく音は鳴ったのですが、ノイズしかでません。 自分の環境だとPCMフォーマットはASIOSTInt32LSB固定なので、とりあえずハードコーディングで進めています。根本的にフォーマットの扱いを間違えている気がします。ヘッダを見る…

ASIO SDKとグローバル変数

ASIOと言っても、今回はAudio Streaming I/Oの方です。 S.F. Programmingさんの話だと、ASIOのサポートはaudioライブラリとしては必要なもののようです。 これまで名前ぐらいしか知りませんでしたが、調べてみました。自分のサウンドカードは(多分)ASIOに対…