読者です 読者をやめる 読者になる 読者になる

S.F. Page

Programming,Music,etc...

WASAPI

Windows 10におけるオーディオ機能

ちょっと前から気になっていたこと。Windows 10のオーディオ機能は果たして今どうなっているのかということ。 Windows 10ではWASAPIも地味だがグレードアップしており、共有モードでのレイテンシーが改善されているらしい。Store アプリは基本的には共有モー…

Windows 10 Insider Preview 10576

Build 10576 がリリースされていた。例によってアップデートによりその存在を知った。今回の目玉はDLNAだ。Edgeを使えば動画をDLNAに対応しているTVに送り、視聴することができる。自宅のTVはDLNAに対応しているから使えそうだ。まあでもPCのモニタもそこそ…

ツールのアイデア

今Buzzでカバー曲を作ってアマレココでキャプチャーし、さらにそれをWindows ムービーメーカーに取り込んでキャプションをつけてYoutubeにアップしている。 BuzzもアマレココもとてもよくできたツールなんだけどVSTがてんこ盛りになってくると私のPCでも相当…

キャプチャしながら再生するプログラムの作成(10)

マイク入力をキャプチャする部分のBUGも大きなものは取れた。まだ挙動は怪しいが。キャプチャ・インターフェースの初期化に失敗したときの処理がまったく入っていなかったのが原因だった。キャプチャ入力を早く試したかったので初期化は成功するという前提で…

キャプチャしながら再生するプログラムの作成(8)

ぼちぼちと直していたのだが、オーディオ・キャプチャ部分以外は割と動くようになった。ほとんどがBUG。エラー処理をきちんとしていないとか、COMポインタのRelease忘れとかそんなのだ。 ソースコード

キャプチャしながら再生するプログラムの作成(2) - DeviceWatcherクラスを使ってデバイスの列挙・監視をする。

サウンドデバイス列挙するのにDeviceInformationCollectionを使っていたけど、サウンドデバイスの抜き差しにも対応したいのでDeviceWatcherクラスを使ってデバイスの列挙・監視をしてみようと思う。 Core Audio APIを使えばIMMDeviceCollection,IMMDevice,IM…

キャプチャしながら再生するプログラムの作成(1)

キャプチャしながらWAVファイルを再生するプログラムをきちんと作っていく。 今日は今までのコードでIMMDeviceを使っていたところをWinRTの同等クラス(Windows::Devices::Enumeration::DeviceInformationとか)に置き換えたり、スマートポインタをWRLのComPtr…

ようやく音を鳴らすことができた。

古いコードをコンパイルしなおしてなんとかWindows 8で動くようになった。変更したのは以下の通り。 boost.atomicを使うのをやめ、std::atomicに変更した。 boost.threadを使うのをやめ、std::threadに変更した。 WinRT APIを使えるようにした。 WAVファイル…

音を鳴らしながらキャプチャしてみる。

昔作り散らかしたWASAPIコードをWindows 8上でコンパイルし直している。ブログのポストをみるとどうもキャプチャしながら音を鳴らすことまではできていたようだ。なぜかまるで記憶にない。なのでコードを読んで思いだしているところである。 AudacityやBuzz…

WASAPIのコードをマージした。

ラップしたライブラリにいままで作りためたWASAPIコードを追加した。コードの内容はすっかり忘れているのでコメントをつけながら読んでいくことにする。

音楽再生スレッドのリアルタイム性能について | Phile-webコミュニティ

音楽再生スレッドのリアルタイム性能について | Phile-webコミュニティ. Windowsにおけるリアルタイム音声再生の留意点。再生アプリであれば今のところこの記事の内容でほぼ網羅されているのではないかなと思う。 レイテンシ(≒バッファサイズ)はDAWなんか…

音源部分を作成中

ゲーム用の音源を作成し始めた。フィルターも実装するつもりだ。フィルターの理屈がまだわかっていないがソースコードだけは大量にネットにあるのでそれらを参考にして「えいやっ」で作ってしまおうと思っている。今は構造を考えながらヘッダにクラス定義を…

WASAPI共有モードで実装しなおした

XAudio2で実装しかけたが、やっぱりWASAPI共有モードで出力することにした。サンプルフォーマットはfloatに固定しサンプルレートの違いは音源部分で吸収することにした。 ソースコード サンプルフォーマットをfloatにしたのはWASAPI共有モードのミキサ部分が…

IAudioClient2::Initialize2 メソッド はない

IAudioClient2::Initialize2 method. ドキュメントにはあるIAudioClient2::Initialize2メソッドだが、実際のIAudioClient2の定義にはなかった。今後実装されるのだろうか。

IAudioClockAdjustmentはMetro Style Appでは使用できない

サンプリングレートを変換するIAudioClockAdjustmentはMetro Style Appでは使用できない。なんでだろう。 これがないととても不便なんだけど。。自前で実装するしかないのか。。

Metro Apps はWASAPI排他モードをサポートしないようだ

昨日今日とWASAPIの初期化コードを書いていた。排他モードで音を鳴らそうと思ったのだけれど、IsFormatSupportedでエラー:AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWEDとなってしまう。共有モードでは問題ない。 void makeWaveFormat(WAVEFORMATEXTENSIBLE& forma…

音源を作ることにする

グラフィックはこれくらいで十分な気もするので、次に音源を作ることにする。WAVやMP3を再生するだけならライブラリで十分まかなえそうだけれど、ここはあえてソフトウェアシンセサイザですべての効果音・BGMを演奏させることにする。 今回はオリジナルの波…

出た!STAの例外

wasapi管理クラスをテストしたら出た!STAに関する例外! スレッドモデルのルールに抵触しそうなことはまだしてないんだけどね。。というかまだルールもわかっていないので抵触しているのかさえもわからない状態。スレッドモデルのところはきっちり押さえと…

WASAPI管理クラスのコンパイルは通るようになった。

WASAPI管理クラスのコンパイルは通るようになった。 これをMetro UIと結び付ける必要があるのだが、面倒臭いんだよね。データバインドを使いたいところだけど、WASAPI管理クラスはref classじゃないので簡単にはできなさそう。ref classを使うとデータバイン…

WaitForSingleObject

WASAPIでイベント駆動モードで動かすためにはイベントを待つ必要があるのでWaitForSingleObjectを使っていたのだけれどMetro Styleでは使えなくなっていた。WaitForSingleObjectExに移行せよということのようだ。Metro Styleへの移行とともに古いAPIを淘汰す…

Code View デバッガ

VS11のデバッガを使っていて、つくづく思うのはCode Viewでデバッガ環境が変わったなということ。 私はゲームがアセンブラで作られていた時代にゲーム会社に3年ほど勤めていたのだけれど、その時にはソースコードにブレークポイントを設定して止めたり、ステ…

コードの変更

以前作ったCore Audio管理クラス群をWindows8に移植し始めた。今のところ、 __com_ptrはMicrosoft::WRL::ComPtrに変更 MMDeviceによるデバイス列挙はWindows::Devices::Enumerationに変更 IAudioClient2のActivateはActivateAudioInterfaceに変更 eDataFlow…

ActivateAudioInterfaceは使える。

ドキュメント化されていないActivateAudioInterfaceの件。このAPIからIAudioClient2インターフェースを取得することができる。 DeviceInformationからIAudioClient2を取得する方法が分かったので、以前作ったものをベースにWASAPI管理クラスを作っていくこと…

シーケンサ部分の作成 - タブダイアログのみ

タブ周りのコードを整理し、ハリボテのシーケンサタブを作成してみた。これから中身を実装していくつもり。そのまえにMC-4のドキュメントを読まないとね。。 シーケンサを動かすには今のウィンドウサイズでは小さいのでリサイズ可能にするつもりだけど、まだ…

タブダイアログのクラス化

シーケンサ部分を作る前にタブが増えてきたのでタブ周りのコードを整理することにした。 タブコントロールはタブ内に表示されるものはすべて自前で作成する必要がある。タブは切り替えてくれるけれど、タブの中身は切り替えてくれないのである。私は「How to…

サウンド・チップを鳴らしてみようかな

前からやりたかったSIDやらMAMEの中にあるサウンド・チップエミュレーションコードを取り込んで鳴らしてみようかなと思っている。

考え事

キャプチャが動いてそこそこ安定したところで次はどうしようかと思案中。 いろいろやりたいことをリストアップしてみると 出力データのエクスポート サンプリングレートコンバート デジタルフィルタ(IIR,FIR) フーリエ変換による周波数解析 いろいろなオー…

少しいじった

やっぱりミキサ処理を出力処理と同時に行うことにした。結果キャプチャの遅れがかなり少なくなった。 次は何しようかなと考えている。フィルタやFFTをやるにはまだ知識が足りていない。

ようやくキャプチャできるようになった。

ようやくキャプチャできるようになった。まだメモリ破壊のBUGは残っているが。なんで起こるのかはよくわかっていない。気がつくとヒープが壊れている。 聴いてみた感じだがキャプチャ->キャプチャキュー->ミキサ->ミキサキュー->出力となるのでWASAPIが持つ…

音は鳴るようになった

ようやく音は鳴るようになった。でもまだマイク入力(キャプチャー)は動かしていない。WAVデータとタイミングを合わせてミックスしないといけないので少し考えないといけない。

やっぱり1発では動かない。

WAVファイルを読み込み非同期で再生しながら、マイク入力をキャプチャし、ミックスして出力に送ろうとしている。ようやくコンパイルが終わり動かしてみたらスピンロックを多用しているのが効いたかCPU負荷が98%近くまで上昇しPCが死亡。恐ろしいプログラムだ…

もう少しでできそう

マイク入力(キャプチャデバイス)とWAVファイルデータをミックスして出力するように改造している。もう少しでできそうなのだがヤル気が萎えてきているせいで遅々として進まない。寒いせいだろうか。 マイク入力(キャプチャデバイス)とWAVファイルデータを…

大幅な作り直し

今までの延長線上で作りなおそうと思ったけれど、クラスの構造から大幅に見なおすことにした。具体的には下記の図のように改造しようとしている。 それぞれの四角は個別のクラスとして実装し直す。それぞれは別々のスレッドで動作する。スレッド間でデータを…

What happens when audio rendering fails? - Larry Osterman's WebLog - Site Home - MSDN Blogs

What happens when audio rendering fails? - Larry Osterman's WebLog - Site Home - MSDN Blogs. あ、そうだIAudioSessionControlの実装を忘れていた。これ読んで思い出した。

キャプチャ対応の進捗や今後とか

キャプチャ対応だが今週末の土日でなんとか鳴るかなと言った進み具合である。 一応方向性としては再生アプリではなく、DAW/トラッカーのようなものをめざしている。なのでそれを構築するために必要な知識を得つつ、巷のコードを参考にしながら興味のある機能…

キャプチャデバイスのサポートと出力部分の見直し

キャプチャデバイスのサポート部分の実装をしつつ、出力部分の見直しをしている。 今まではWAVファイルの読み込みや再生に合わせて出力をコントロールしていた。再生を停止すると出力もストップするといった具合に。でもキャプチャデバイスをサポートすると…

テンプレートで遊んでいる。

WASAPIのラップクラスを改造してキャプチャクライアントを作っている。キャプチャであってもレンダラであっても排他であっても共有であってもコードはほとんど同じ。ベースとなるクラスを作って派生したり、コピペでクラス名やコードちょこちょこ変えて作っ…

ぼちぼちと実装中

入力部分をぼちぼち実装中。出力とは初期化処理はほとんど変わらない。違うのはキャプチャデータを取得する部分だけだ。ループバックキャプチャもあわせて実装しようかなと考えている。

入力部分をぼちぼち作る

入力部分をボチボチ作っている。今日中の完成は無理かなー。

バッファ周りの処理の改良は一段落

バッファ周りの処理の改良は一段落した。共有モードの問題も解消している。続いてキャプチャークライアントを作ろうと思っている。wasapiのラッパークラスにコードを付け加えて作ろうかなと思っている。レンダラーとほとんど同じコードなので。 MSDNにも書い…

バッファ周りの処理の改良

バッファ周りの処理を改良し始めている。タイマーモード(pushモード)時の動作を安定させるため。元々排他・イベントモードをメインに使う想定で実装していたのでタイマーモード、特に共有モードでの動作がいいかげんであった。 排他・イベント(pull)モード…

バッファについて調べている。

基本に立ち返りバッファやレイテンシについて調べているところ。そんなに認識違いはないのだけれど忘れている部分もあるので復習のつもりでやっている。このあたりを深堀りするには「WaveRTミニポートドライバ」などをじっくり読むのがいいのではということ…

不具合の原因はバッファサイズに関する理解不足

音が途切れる原因が判明した。やはりバッファサイズに関する理解不足に起因したものであった。バッファサイズやレイテンシに関しては再度MSDNを読んで理解し直そうかと思う。GetSreamLatecyの意味とか、PeriodPerBufferとかBufferDurationとかBufferSizeとか…

不具合

再生時エンドポイントデバイスによって不具合が発生している。具体的に言うとHigh Definition Audioの共有モードで定期的な間隔で音切れが発生する。なぜか10msのバッファサイズでは発生しない。今のところ原因は不明である。ちなみにPlayPcmWinでは問題なか…

WASAPIキャプチャークライアントを作ってみることにする。

ちょっとWASAPIキャプチャークライアントを作ってみることにする。WAVファイルとミキシングして出力できたらいいなと考えている。

設定内容を保存する

設定ダイアログの内容をファイルに保存して、起動時に読み込み反映するコードを追加した。 保存のコードはBoost.Serializationを使用して実装した。以前このライブラリを使っていたのだけれどすっかり忘れてしまっていたので思い出しながらの実装。デストラ…

少しBugつぶし

Stopボタンを押したときにハングアップするBugを修正した。 ソースコード スレッド間を協調させる実装がいまいちな感じ。改良したい。。 設定ダイアログでいろいろ試してみた。 私の環境では2つのオーディオ・インターフェースがあるので、いろいろ設定して…

FFTに取り組む

「フーリエの冒険」や「やる夫で学ぶデジタル信号処理」を読んでフーリエ変換は理解できたような気がしてきたので、FFTを実装してDirect2Dで周波数スペクトルを表示してみることにする。 これがあるとサンプル周波数変換がきちんとできているかも確認できる…

固定小数点演算はどうか

理屈も正確に把握していないのに何だが、サンプルレート変換(リサンプル)は重い処理のようである。リアルタイムで処理することは今時のCPUでは問題ないようだ。それでも10~20%位はCPU負荷をかけるようだ。まあそれくらいならいいかもしれないけれど。Secr…

ようやくサンプルレート変換へ

ドライバ設定部分も落ち着いたので、サンプルレート変換を組み込んでいくことにする。 変更したソースコード