Contents ...
udn網路城邦
在bcb使用WinAPI函式撥放PCM資料
2010/01/24 11:03
瀏覽250
迴響0
推薦0
引用0
問題:我有一個pcm檔案(純資料檔),我要如何使用BCB/VC++的WindowsAPI函式撥放這個PCM格式的資料


解答:
        char Example_Wave[]=
        {
                0x52,0x49,0x46,0x46,//RIFF標誌
                0x44,0x93,0x6F,0x00,//文件長度,這邊是 7312196 byte
                0x57,0x41,0x56,0x45,//Wave標誌
                0x66,0x6D,0x74,0x20,//fmt標誌
                0x10,0x00,0x00,0x00,//non
                0x03,0x00,          //格式類別
                0x02,0x00,          //channel 數量
                0x80,0xBB,0x00,0x00,//取樣頻率,這邊是bb80h = 48000
                0x00,0xDC,0x05,0x00,//波形音頻數據傳送速率,其值為通道數×每秒數據位數×每樣
                                    //本的數據位數/8。播放軟件利用此值可以估計緩衝區的大小。
                0x08,0x00,          //數據塊的調整數(按字節算的),其值為通道數×每樣本的數據位值/8。
                                    //播放軟件需要一次處理多個該值大小的字節數據,以便將其值用於緩衝區的調整。
                0x20,0x00,          //每樣本的數據位數,表示每個聲道中各個樣本的數據位數。這邊是32 bytes
                                    //如果有多個聲道,對每個聲道而言,樣本大小都一樣。
                0x64,0x61,0x74,0x61,//數據標記符”data”
                0x20,0x93,0x6F,0x00 //語音數據的長度 7312160 byte
        };
        struct WaveForm
        {
                char szRiffID[4];  // 'R','I','F','F'
                int dwRiffSize;
                char szRiffFormat[4]; // 'W','A','V','E'
                char  szFmtID[4]; // 'f','m','t',' '
                int dwFmtSize;
                short wFormatTag;
                short wChannels;
                int dwSamplesPerSec;
                int dwAvgBytesPerSec;
                short wBlockAlign;
                short wBitsPerSample;
                char szDataID[4]; // 'd','a','t','a'
                int dwDataSize;
        }*Wave;
        Wave = (struct WaveForm*) Example_Wave;

        TMemoryStream *pcm = new TMemoryStream;
        pcm->LoadFromFile(OpenDialog1->FileName);
        Wave->dwDataSize = pcm->Size;
        Wave->dwRiffSize = pcm->Size+36;

        TMemoryStream *wav2 = new TMemoryStream;
        wav2->Write(Wave,sizeof(struct WaveForm));
        wav2->Write(pcm->Memory,pcm->Size);
        PlaySound((char *)wav2->Memory, 0, SND_SYNC | SND_MEMORY);
        delete pcm;
        delete wav2;

限會員,要發表迴響,請先登入