2010-11-08 56 views
3

我使用數組來處理無線電信號並獲取原始PCM音頻。我拼命嘗試使用Fmod Ex播放此音頻。C&Fmod Ex - 實時播放PCM陣列/緩衝區

基本上,是否有可能創建一個對應於我的循環緩衝區的流,我可以以線程安全的方式訪問?任何有關使用什麼方法的基本信息將不勝感激。

如果不是,其他Windows 7 API可以訣竅嗎? (ASIO,WASAPI ...)

THX° - °

回答

2

我假設你的數據是連續的(時刻更新),所以你會希望它傳輸到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播放你的緩衝區。

+0

感謝您指出這個例子,不幸的是CHM文檔中沒有提及這些例子:) – speps 2011-11-24 19:28:31