Воспроизведение нескольких WAV файлов под WinCE.
От: Аноним  
Дата: 21.12.03 17:55
Оценка:
Есть проблема: нужно воспроизвести два wav файла одновременно.PlaySound не подходит.
Следовательно нужно через waveOutOpen.
Ниже выдерка из кода.Не могу понять в чем ошибка.Компилится без ошибок,
а звука нет.Кто может выручите.Может у кого есть пример кода?

вызов такой:
WaveFile player(TEXT("player.wav"));
player.Play(false);


А вот сами функции и выдержки кода:
#include <windows.h>
#include <stdio.h>

    char *lpfile;
    int file_size;
    WAVEFORMATEX wfex;
    HWAVEOUT hwo;
    WAVEHDR whdr;


WaveFile::WaveFile(LPCTSTR szFileName)
{

TCHAR PathName[MAX_PATH];                                 
TCHAR FullName[MAX_PATH];
ULONG    HighByt;                              

GetModuleFileName(NULL, PathName,MAX_PATH );               
PathName[lstrlen(PathName) - 8] = TEXT('\0');               

wsprintf(FullName, TEXT("%s%s"), PathName, szFileName);     

hFile  = CreateFile(FullName, GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,   
                                 NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
    file_size=GetFileSize (hFile, NULL) ; 

    lpfile = new char [file_size];
    // 'Copy' the file to memory
ReadFile(hFile,&lpfile , sizeof(lpfile), &HighByt, NULL);
CloseHandle(hFile);
  
ZeroMemory(&wfex,sizeof(WAVEFORMATEX));
   
    // Fill WAVEFORMATEX with the data from the file
  
     wfex.wFormatTag         =WAVE_FORMAT_PCM;
     wfex.nChannels            =1;
     wfex.nSamplesPerSec  =44100;
     wfex.nBlockAlign        =wfex.wBitsPerSample/8*wfex.nChannels;
     wfex.nAvgBytesPerSec =wfex.nSamplesPerSec*wfex.nBlockAlign;
     wfex.wBitsPerSample     =16;

    return;
}


WAVEHDR* WaveFile::Play(bool loop)
{
    WAVEHDR *whdr = new WAVEHDR;
    ZeroMemory((void*)whdr, sizeof(WAVEHDR));

    whdr->lpData = lpfile+HEADER_SIZE;
    whdr->dwBufferLength = file_size-HEADER_SIZE;
    whdr->dwUser = true;
    whdr->dwFlags = 0;

    // Find a waveOut device and open it
    for(UINT devid = 0; devid < waveOutGetNumDevs(); devid++)
    {
        if(devid == waveOutGetNumDevs())
            // Error, no free devices found
            return NULL;
        waveOutOpen(&hwo, WAVE_MAPPER, &wfex,NULL, NULL, CALLBACK_NULL);
            // Usable device found, stop searching
            break;
    
    }
    waveOutSetVolume(hwo, 0xFFFFFFFF);
    waveOutPrepareHeader(hwo, whdr, sizeof(WAVEHDR));
    waveOutWrite(hwo, whdr, sizeof(WAVEHDR));
    do {}
    while (!(whdr->dwFlags & WHDR_DONE)); // inefficient busy wait!
    waveOutUnprepareHeader(hwo, whdr, sizeof(whdr));

   //Close the WAVE device.
    waveOutClose(hwo);
    
    

    return whdr;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.