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

S.F. Page

Programming,Music,etc...

WASAPIラッパー

WASAPIラッパーを1つの実装で4つのタイプ(排他タイマー・排他イベント・共有タイマー・共有イベント)をtypedefできるようにしてみた。 排他・共有のポリシー、イベント・タイマーのポリシーを作り、wasapi_baseクラスのテンプレートパラメータにするというや…

バグつぶし&WASAPIラッパー

BUGはやっぱり凡ミスであった。あともう1個、音が歪むことがあるのだがこれはまだ原因不明である。なぜか一旦Stop(),Reset()すると直ったりする。 設定変更してみてわかったこと。E-mu0404は排他モードではPatchMixで設定したサンプルレート以外は指定できな…

バグつぶし

設定をいろいろ変えることができるようにしたらBUGが出た。原因は、途中で設定は変更されないことを前提にコードを書いていたから。まあぼちぼち潰していこう。

WASAPI共有モードのレイテンシ

ドライバ設定画面はそこそこ動いている。私のハードの場合内蔵サウンドとE-mu0404の2種類のデバイスを選択できる。でもデバイスを指定するのではなくてWASAPIではあくまで端子(エンドポイント)単位である。アプリ側で出力を自由に切り替えられるのはWASAP…

結構な変更

ドライバ設定ダイアログの実装だが、あちこちのクラスに不備があり結構な変更となってしまっている。今はドライバの設定がなんとかできる感じにまで来ているけれどまだ7割くらいの完成度だ。まあぼちぼちやることにする。 今更気づいたのだけれど、再生レイ…

タブウィンドウはとりあえず出来た。

タブ表示はとりあえず出来た。以前に実装したもの以外はまだハリボテだが。 ドライバの設定画面。 これからドライバ切り替え部分を実装していく。ドライバは再生中でも切り替えができるようにしたいけどうまくいくかな。 ソースコード

やっぱりWAVEFORMATEXTENSIBLEの指定ミスだった。

やっぱりWAVEFORMATEXTENSIBLEのパラメータ指定ミスだった。WAVE_FORMAT_EXTENSIBLEのFormat.wFormatTagにWAVE_FORMAT_EXTENSIBLE、SubFormatにKSDATAFORMAT_SUBTYPE_PCMを設定する必要がある。Format.wFormatTagにWAVE_FORMAT_PCMを指定してはいけない。 後…

wasapi_device_managerの実装

wasapi_device_manager WASAPIデバイスを管理するクラスを今実装中である。エンドポイントデバイスを列挙して一時的にIAudioClientを作成しサポートしている出力フォーマットを調査、wasapi_device_manager::device_info構造体に格納する。 ソースコード 軽…

WASAPI周りのコードの改造

サンプルレートコンバータを組み込むにあたり、WASAPI周りのコードを改造することにした。立ち上げるとデフォルト・デバイスを自動的に選択するようになっているけれど、それに加えて普通のアプリみたくデバイス選択・再生サンプルビット数選択・サンプルレ…

IAudioClient::GetMixedFormat

サンプルレート変換を実装し始めた。まずSecret Rabbit Codeを試すことにした。 デフォルト再生フォーマットでWASAPIを初期化して、読み込むデータのフォーマットをデフォルト再生フォーマットに変換するようにコードを変更する。このデフォルト再生フォーマ…

WASAPI 排他モード・共有モードを切り替えられるようにした。

聴き比べがしたくなって、WASAPI排他モード・共有モードを切り替えられるようにした。 ソースコード 共有モード・排他モードを聴き比べてみると 聴き比べた結果だがほとんど差を感じなかった。なんとなく共有モードだと音量が補正されているような気もするが…

プロセスの優先順位

WASAPI排他モードにしてからWAVファイルを再生しているときに他のアプリのスクロールバーをいじったりCtrl+Alt+Delを押してタスクマネージャを起動すると音が歪んでしまう。一旦歪むとずっと歪んだままだ。再生を停止して、再生しなおすと直る。 なんとなく…

WASAPI排他・タイマーモードにしてみた。

出力をWASAPI排他・タイマーモードにしてみた。ほとんどコードは変わらない。サンプリングレート変換のコードを取り除いたのみである。 ソースコード レイテンシは10msに設定している。音を聴いてみると確かに原音そのままって感じがする。

サンプル周波数変換 - デジタルLPF

デジタルLPFを作ろうとしているが、理屈を理解したいので勉強しているけど難しい。 LPFは自分×係数と1つ前×係数、2つ前×係数...を足しあわせて、足しこんだサンプルの個数で割り算するような感じである。フィルタにはFIRとIIRというフィルタがあり、FIRはフ…

リピート再生を実装した。

リピート再生を実装した。 ソースコード とりあえずリピート再生はできているが、コードの見直しをしないといけないだろう。再生位置の情報のもたせ方とかも少し考えなおさなければいけない。何かおかしな感じがする。 コードの見直しをした後、いよいよサン…

次はどうしようか。

次はいろいろなサンプル・フォーマットに対応できるように読み込んだ後に変換処理を加えようかなと思っていたが、その前にリピート再生機能を作っておこうかな。リピート再生処理は入れたから後はUIにチェックボックスを入れて、UIイベント処理を作るだけだ…

再生位置の移動処理を組み込んでみた。

再生位置の移動処理を組み込んでみた。 ソースコード 動きとしてはそこそこだが、なんか再生がおかしい気もする。スライダーをサブクラス化して作ろうと思ったけどそこまでしなくてもTB_THUMBPOSITION 、TB_THUMBTRACK、TB_ENDTRACK メッセージがメインダイ…

非同期ファイル読み込みにとりかかろうとしている

ファイル読み込み部分を非同期バージョンに変更しようとした矢先のこの暑さ。朝から朦朧としている。年寄りにはきついのだ、暑さは。 wasapi共有モードでは異なるさまざまなサンプル・フォーマットへの対応が楽にできそうな感じがしたのだがそうでもないこと…

サンプルレート変換を組み込んでみた。

初期化処理にサンプルレート変換を組み込んでみた。 // WASAPIの初期化処理 // IMMDeviceEnumeratorの取得 THROW_IF_ERR( CoCreateInstance( __uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&device_enumerator_))); // デフォル…

とりあえず音を鳴らしてみた。

とりあえず音を鳴らすところまでは出来た。 ソースコード変更部分 ソース全体 ファイルの選択、状態に応じたUI表示、ファイル読み込みおよび再生・一時停止・停止部分を実装した。UI部分はWindows API全開である。ただキーボードによるUIコントロール間の移…

WinAudioサンプル

SDKのバージョン6だったか忘れたのだが、WASAPIのサンプルとしてWinAudioサンプルというのがあった。 これはWASAPIのいろいろな設定を試しながら録音・再生できるというもの。画面を観ていただくとわかると思うけど、共有・排他モードやMMCSSのモード、レイ…

ぼちぼちと実装を始める。

ぼちぼちと実装を始めることにする。 ファイルの読み込み部分はboost.asioか、もしくはAPIでゴリゴリ書くかする。スレッドはboost.threadで管理する。読み込んだファイルの再生はwasapiを以前いじった時のテストコードをベースに作る。最初は共有モードで作…

準備終わり。

コード整理してスケルトンにする作業は終わり。以前書いたDirect3D11のお試しコードをコメントアウトしただけだが。コメントアウトするかコードそのものを削除するか迷ったがコメントアウトすることにした。非同期の読み込み~wasapiの再生ができたらそれを…

オーバーラップ I/Oか別スレッドで読み込むか

非同期でファイルを読み込む方法はWindowsではオーバーラップI/Oを使うか、読み込み自体を別スレッドで行うかすればよいだろう。今回はオーバーラップI/Oを使って実装してみたいと思い色々調べているうちにオーバーラップI/Oって今回の要件では使えないので…

大きなWAVファイルを非同期で読み込み、WASAPIで再生してみる。

以前からやりたかった、大きなWAVファイルを非同期(オーバーラップ)ファイルI/Oで読み込みつつWASAPIで再生するコードを書いてみることにする。 非同期ファイルI/OについてはAPIを直接使うか、BOOST.ASIOを使って少しずつ読み込み、バッファに保存する。バッ…

オーディオ・セッション

はじめに オーディオ・セッションについて、MSDNのAudio Sessionsを意訳?して、図表を入れたり文章を追記してみた。 http://msdn.microsoft.com/en-us/library/dd370796(v=VS.85).aspx オーディオ・セッションとは オーディオ・セッションとはまとめて制御…

オーディオ・セッションを読む

今週頭からMSDNのAudio Sessionsを読んでいる。共有モードに関することなので今まであまり興味はなかったのだが、読んでみると結構面白い。でも内容は少しわかりづらいので自分なりにまとめ直しているところである。 このドキュメントを読むとIMMDeviceとIAu…

Windows Audio Session API

ミニタイマーのアラーム音だが、今はMessageBeepである。次にSIDエミュレータを使って音を鳴らしてみようとしている。SIDエミュレータはreSIDをベースにして、それを鳴らすためのWASAPIのラッパーの構造をどうしようかといろいろなソースコードを見ていると…

ビットパーフェクト

帰りの電車の中で、なんとなくビットパーフェクトとかを考えていた。 ビットパーフェクトな再生というと、デジタルオーディオデータがオーディオインターフェースのD/Aコンバータまで途中で改変されることなく送られるということである。Windows7は通常ミキ…

WASAPI 共有モードのサンプルコード(タイマモード)

WASAPIの共有モードのタイマモードで440Hzのサイン波を10秒ほど再生するサンプルを書いてみた。 排他モードのサンプルを2・3行書き換えるだけで共有モードに変更できた。 異なるところは、初期化の部分。 IAudioClient::IsFormatSupported()とIAudioClient…

Device Topologies API(1)

前から気になっていた、Device Topologies APIについてのお勉強。ヘルプを翻訳しながら理解した部分をまとめてみた。まずはサンプル・コードの手前までの部分。 参考および引用:MSDN Library - Device Topologies http://msdn.microsoft.com/en-us/library/…

WASAPI デバイス・ロール

WASAPIではデバイス・ロールというものがある。 2つ以上のデバイスがあるPCでオーディオ・コンテンツを再生する場合、そのオーディオ・コンテンツを再生するのに最適なデバイスを選択できるようにすることが目的である。 ロールとしては次の3種類ある。 コ…

WASAPI 排他モードサンプル(タイマモード)

WASAPI排他モードサンプル(タイマモード)を作ってみた。 タイマモードはバッファへの書き込みタイミングを自分でコントロールする。 SDKのサンプルではイベントのタイムアウトを使用しているけど、今回はSleepでコントロールすることにした。バッファは大…

WASAPI 排他モードサンプル(イベントモード)

WASAPIの備忘録がわりに排他モードのサンプルプログラムを書いてみた。 SDKサンプルを参考に、スレッドを使わずシンプルな内容にしてみた。 // #include <SDKDDKVer.h> #include "targetver.h" #include <iostream> #include <tchar.h> #include "objbase.h" #include <comdef.h> #include "avrt.h" #in</comdef.h></tchar.h></iostream></sdkddkver.h>…

WASAPI 処理フロー

忘れ気味なので、サンプルを元にWASAPI排他モードで再生する時の処理フローをまとめておくことにする。 <イベント駆動のとき> IMMDeviceEnumeratorを得る IMMDeviceEnumeratorからIMMDeviceCollectionを得る IMMDeviceCollectionからIMMDeviceを得る IMMDe…

タイマモードとイベントモード

WASAPIのタイマモードとイベントモードってなんだっけと思って、久しぶりにWASAPIのサンプルコードをチェック。 RenderExclusiveEventDriven RenderExclusiveTimerDriven 両方共タイミング管理をイベントオブジェクトと行うのだけれど、 ・タイマモード バッ…

PlayPcmWin

色々な誘惑によってサウンド・プログラミングが滞っている今日この頃。 なんとなくWASAPIの情報を集めてみたくなったのでぐぐってみた。 ・WASAPI排他モードでWAVファイルを再生するプログラムPlayPcmWinのページ http://code.google.com/p/bitspersamplecon…

Juce::AudioIODeviceのWASAPI実装(16)

とりあえず音が鳴り、マイクが使えるようになったけれど、まだまだToDoが、、、。 ・16bit以上のサンプルビット対応(24bit,32bit) ・96Khzサンプル周波数の対応(現状だとなぜか死ぬ) ・ボリュームコントロールAPIの利用 ・Device Topology APIいじり な…

WASAPI - About the Windows Core Audio APIs(2)

(参考) http://msdn.microsoft.com/en-us/library/dd316780(VS.85).aspx ■オーディオAPIのユーザモードコンポーネント化 Core Audio APIはユーザモードコンポーネントとして実装されている。 これはカーネルモードで動作していた時にくらべて信頼性が向上…

WASAPI - About the Windows Core Audio APIs

いまさらながらWindows Core Audio APIについてのポイントを押さえるためのメモ。 ■低レイテンシ・音とびのないオーディオ再生。 ■オーディオデバイスの個々の役割がカテゴライズされている(console, multimedia, and communications) ■オーディオ端子の抽…

Juce::AudioIODeviceのWASAPI実装(15)

ようやくキャプチャ側も音が出るようになった。 ようやくTALのボコーダが試せるようになった! レイテンシが少ないので快適だ。

Juce::AudioIODeviceのWASAPI実装(14)

ようやく、雑音がでなくなった。原因はEventオブジェクト作成時の引数のミス。だがまだ問題はある。 なぜかレイテンシが3msのとき以外は音がひずんでしまう。おそらくBugだろうけど。

Juce::AudioIODeviceのWASAPI実装(13)

相変わらず雑音を振りまいている。 Twitterに少しハマってしまってるのもあるが、1日があっという間に過ぎてしまう。 あーせっかくの長期休暇も6日間が過ぎてしまった。

Juce::AudioIODeviceのWASAPI実装(12)

ようやく死なずに動くようになったが、音はノイズまみれ。 MIDIキーボードの音階に応じて、ピッチは変化しているようだ。

Juce::AudioIODeviceのWASAPI実装(11)

ぼちぼちと実装を見直しつつ行っている。 IAudioClientにはIsFormatSupported メソッドがある。 HRESULT IsFormatSupported( [in] AUDCLNT_SHAREMODE ShareMode, [in] const WAVEFORMATEX *pFormat, [out] WAVEFORMATEX **ppClosestMatch ); 1つ目のパラメ…

Juce::AudioIODeviceのWASAPI実装(10)

JUCEにはAudioIODeviceという基本クラスがあり、DirectSoundやASIOはこれを継承し、具象クラスとして実装されている。 以前にも書いたが、JUCEの作者はすでにWASPIの共有モードでのAudioIODevice具象クラスWASAPIIODeviceを作成している。掲示板で見る限り良…

Juce::AudioIODeviceのWASAPI実装(9)

ぼちぼちと実装を進めている。 もう少しで音が出せそうだ。 まあ、僕のペースはご承知のとおり、気分や状況によって変わるのでいつになるかわからないが、。 WASAPIというかWindows Core Audioは後発だけあってよくできていると思う。そういう意味でVistaは…

Juce::AudioIODeviceのWASAPI実装(8)

レイテンシ指定できるようにAudioDeviceSettingsPanelを改造することにした。残念ながら、この部分についてはカスタマイズ方法はライブラリ側では用意されていないので、juceライブラリのソースコードをコピーして変更した。

Juce::AudioIODeviceのWASAPI実装(7)

実装はあちこち回り道して遅々として進まない。 ようやくバッファサイズの列挙ができたところだ。 JUCEのデフォルトで持っているオーディオデバイスのセレクタクラス(AudioDeviceSelector) の場合レイテンシはバッファサイズ指定がデフォルトで、WASAPIの場…

Juce::AudioIODeviceのWASAPI実装(6)

ようやくデバイスの一覧が表示可能に。 でもまだハリボテ状態。