如果您希望流式傳輸原始數據,而不是PCM數據,您可以通過覆蓋FMOD文件系統來實現這一點。有兩種方法可以實現這一點,第一種方法是通過在CreateSoundExInfo結構中設置文件回調,如果這是針對一個特定文件的。第二個是你可以爲所有FMOD文件操作全局設置文件系統(例如你想用多個文件來完成)。
我會解釋後者,但切換到前者雖然是微不足道的。有關完整的示例,請參閱「filecallbacks」FMOD示例。
函數指針:
private FMOD.FILE_OPENCALLBACK myopen = new FMOD.FILE_OPENCALLBACK(OPENCALLBACK);
private FMOD.FILE_CLOSECALLBACK myclose = new FMOD.FILE_CLOSECALLBACK(CLOSECALLBACK);
private FMOD.FILE_READCALLBACK myread = new FMOD.FILE_READCALLBACK(READCALLBACK);
private FMOD.FILE_SEEKCALLBACK myseek = new FMOD.FILE_SEEKCALLBACK(SEEKCALLBACK);
回調:
private static FMOD.RESULT OPENCALLBACK([MarshalAs(UnmanagedType.LPWStr)]string name, int unicode, ref uint filesize, ref IntPtr handle, ref IntPtr userdata)
{
// You can ID the file from the name, then do any loading required here
return FMOD.RESULT.OK;
}
private static FMOD.RESULT CLOSECALLBACK(IntPtr handle, IntPtr userdata)
{
// Do any closing required here
return FMOD.RESULT.OK;
}
private static FMOD.RESULT READCALLBACK(IntPtr handle, IntPtr buffer, uint sizebytes, ref uint bytesread, IntPtr userdata)
{
byte[] readbuffer = new byte[sizebytes];
// Populate readbuffer here with raw data
Marshal.Copy(readbuffer, 0, buffer, (int)sizebytes);
return FMOD.RESULT.OK;
}
private static FMOD.RESULT SEEKCALLBACK(IntPtr handle, int pos, IntPtr userdata)
{
// Seek your stream to desired position
return FMOD.RESULT.OK;
}
實現:
// Usual init code here...
result = system.setFileSystem(myopen, myclose, myread, myseek, 2048);
ERRCHECK(result);
// Usual create sound code here...
感謝您的回答,將與OGG這項工作?因爲我沒有原始格式的文件... – 2010-08-09 03:11:46
沒有這個解決方案只是爲PCM,我將提供壓縮數據的情況下的另一個答案。 – 2010-08-09 05:47:08