全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:900
推到 Plurk!
推到 Facebook!

wav檔播放不連續問題

尚未結案
aniey_123
一般會員


發表:2
回覆:0
積分:0
註冊:2005-03-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-25 13:43:55 IP:221.169.xxx.xxx 未訂閱
請問一下 因為我的應用程式有特殊需求,需要將一個數分鐘的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);
}    //---------------------------------------------------------     
系統時間:2024-05-02 13:20:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!