3

アレイを使用して無線信号を処理し、生のPCMオーディオを取得します。私は必死にFmodExを使用してこのオーディオを再生しようとしています。

基本的に、スレッドセーフな方法でアクセスできる循環バッファに対応するストリームを作成することは可能でしょうか?使用する方法に関する基本的な情報をいただければ幸いです。

いいえの場合、他のWindows 7 APIでそのトリックを実行できますか?(ASIO、Wasapi ...)

Thx°-°

4

1 に答える 1

2

データは継続的(常に更新)であると想定しているため、データを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でバッファを再生するために必要なのはこれだけです。

于 2010-11-09T22:47:17.850 に答える