wav檔播放不連續問題 |
尚未結案
|
aniey_123
一般會員 發表:2 回覆:0 積分:0 註冊:2005-03-17 發送簡訊給我 |
請問一下
因為我的應用程式有特殊需求,需要將一個數分鐘的wav檔,以一次100ms的方式分別播放出來,所以必須先把wav放入memory中,再依次放出來,但聲音會有間斷的結果,請問有什麼方法解決呢?
程式碼如下喔
//--------------------------------------------------------- WAVEHDR replay_header; WAVEFORMATEX replay_format; HWAVEOUT replay_handle; FILE* fp_voice_in; long replay_index; long replay_len; char* replay_buf; //--------------------------------------------------------- void ReplayWav(void) { Wav_Load_Voice(); replay_index = 0; replay_format.wFormatTag = WAVE_FORMAT_PCM; replay_format.nChannels = 1; replay_format.nSamplesPerSec = 8000; replay_format.wBitsPerSample = 8; replay_format.nAvgBytesPerSec = 8000; replay_format.cbSize = 0; replay_format.nBlockAlign = 1; replay_header.dwFlags = 0; replay_header.reserved = 0; replay_header.lpData = replay_buf; replay_header.dwBufferLength = 8000 / 10; // 100ms if(waveOutOpen(&replay_handle, WAVE_MAPPER, &replay_format, NULL, NULL, WAVE_FORMAT_QUERY) != MMSYSERR_NOERROR) printf(" waveOutOpen 1 Fault \n"); if(waveOutOpen(&replay_handle, WAVE_MAPPER, &replay_format, (DWORD)waveOutProc, NULL, CALLBACK_FUNCTION | WAVE_FORMAT_DIRECT) != MMSYSERR_NOERROR) printf(" waveOutOpen 2 Fault \n"); if(waveOutPrepareHeader(replay_handle, &replay_header, sizeof(WAVEHDR)) != MMSYSERR_NOERROR) printf(" waveOutPrepareHeader Fault \n"); Wav_PlayVoice(); } //--------------------------------------------------------- void CALLBACK waveOutProc(HWAVEIN hwi, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2) { if(uMsg == WOM_DONE) { replay_index = 8000 / 10; // 100ms if(replay_index >= replay_len) replay_index = 0; Wav_PlayVoice(); } } //--------------------------------------------------------- void Wav_PlayVoice(void) { replay_header.lpData = &replay_buf[replay_index]; if(waveOutWrite(replay_handle, &replay_header, sizeof(WAVEHDR)) != MMSYSERR_NOERROR) printf(" waveOutWrite Fault \n"); } #define voice_IN_FILENAME "music_1.wav" //--------------------------------------------------------- void Wav_Load_Voice(void) { if((fp_voice_in = fopen(voice_IN_FILENAME, "rb")) == NULL) printf(" [ %s ] could not be open. \n", voice_IN_FILENAME); fseek(fp_voice_in, 0, SEEK_END); replay_len = ftell(fp_voice_in); printf(" Input voice Buffer Len : %d \n", replay_len); if(!(replay_buf = (char*)ippsMalloc_8s(replay_len))) printf(" Could not Alloc memory to In Buffer. \n"); fseek(fp_voice_in, 0, SEEK_SET); fread(replay_buf, 1, replay_len, fp_voice_in); } //--------------------------------------------------------- |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |