アレイを使用して無線信号を処理し、生のPCMオーディオを取得します。私は必死にFmodExを使用してこのオーディオを再生しようとしています。
基本的に、スレッドセーフな方法でアクセスできる循環バッファに対応するストリームを作成することは可能でしょうか?使用する方法に関する基本的な情報をいただければ幸いです。
いいえの場合、他のWindows 7 APIでそのトリックを実行できますか?(ASIO、Wasapi ...)
Thx°-°
データは継続的(常に更新)であると想定しているため、データをFMODにストリーミングする必要があります。これを行うには、特定のサウンドのファイルコールバックをオーバーライドできます。FMODAPIのusercreatedsoundの例でこれを行う良い例があります。静的バッファを再生するだけの場合は、データを説明するcreatesoundexinfo構造体に入力し、FMOD_OPENMEMORYフラグを使用して、createSoundを介してname_or_dataとしてデータへのポインタを渡します。以下は、より複雑なストリームの場合の例です。
サウンドを作成するときは、FMOD_CREATESOUNDEXINFOを使用してデータの詳細を指定し、それをcreateStreamに渡します。これは基本的に、FMOD_OPENUSERを使用し、デコードサイズを設定し、FMOD_OPENMEMORYの代わりにデータを読み取るためのコールバックを指定し、name_or_data paramを介してデータを渡すことを除いて、静的サンプルケースを実行する方法であることに注意してください。
FMOD_CREATESOUNDEXINFO exinfo;
memset(&createsoundexinfo, 0, sizeof(FMOD_CREATESOUNDEXINFO));
exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO); /* required. */
exinfo.decodebuffersize = 44100; /* Chunk size of stream update in samples. This will be the amount of data passed to the user callback. */
exinfo.length = 44100 * channels * sizeof(signed short) * 5; /* Length of PCM data in bytes of whole song (for Sound::getLength) */
exinfo.numchannels = channels; /* Number of channels in the sound. */
exinfo.defaultfrequency = 44100; /* Default playback rate of sound. */
exinfo.format = FMOD_SOUND_FORMAT_PCM16; /* Data format of sound. */
exinfo.pcmreadcallback = pcmreadcallback; /* User callback for reading. */
exinfo.pcmsetposcallback = pcmsetposcallback; /* User callback for seeking. */
result = system->createStream(NULL, FMOD_OPENUSER, &exinfo, &sound);
ERRCHECK(result);
ここでは、PCM16 44khzデータを提供し、必要に応じてカスタマイズし、読み取りと設定のための2つの関数コールバックを提供します。これは、FMODが呼び出して、バッファーを探すか、バッファーから何かを読み取るように要求します。
FMOD_RESULT F_CALLBACK pcmreadcallback(FMOD_SOUND *sound, void *data, unsigned int datalen)
{
// Read from your buffer here...
return FMOD_OK;
}
FMOD_RESULT F_CALLBACK pcmsetposcallback(FMOD_SOUND *sound, int subsound, unsigned int position, FMOD_TIMEUNIT postype)
{
// Seek to a location in your data, may not be required for what you want to do
return FMOD_OK;
}
FMODでバッファを再生するために必要なのはこれだけです。