我使用數組來處理無線電信號並獲取原始PCM音頻。我拼命嘗試使用Fmod Ex播放此音頻。C&Fmod Ex - 實時播放PCM陣列/緩衝區
基本上,是否有可能創建一個對應於我的循環緩衝區的流,我可以以線程安全的方式訪問?任何有關使用什麼方法的基本信息將不勝感激。
如果不是,其他Windows 7 API可以訣竅嗎? (ASIO,WASAPI ...)
THX° - °
我使用數組來處理無線電信號並獲取原始PCM音頻。我拼命嘗試使用Fmod Ex播放此音頻。C&Fmod Ex - 實時播放PCM陣列/緩衝區
基本上,是否有可能創建一個對應於我的循環緩衝區的流,我可以以線程安全的方式訪問?任何有關使用什麼方法的基本信息將不勝感激。
如果不是,其他Windows 7 API可以訣竅嗎? (ASIO,WASAPI ...)
THX° - °
我假設你的數據是連續的(時刻更新),所以你會希望它傳輸到FMOD,要做到這一點,你可以覆蓋文件回調特定的聲音。 FMOD API usercreatedsound示例是一個很好的例子。如果您只想播放靜態緩衝區,只需填寫描述數據的createdoundexinfo結構,使用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的數據,按要求定製,並給出了兩個函數回調讀取和SETPOSITION這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播放你的緩衝區。
感謝您指出這個例子,不幸的是CHM文檔中沒有提及這些例子:) – speps 2011-11-24 19:28:31