1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
   | CWaveFile::CWaveFile()
{
	//Init tout à Zéro
	m_lpfile = NULL;
	m_hwo = NULL;
	m_dwDurationTime = 0;
	m_hEventDone = NULL;
	ZeroMemory( &m_wfex, sizeof(WAVEFORMATEX) );
	ZeroMemory( &m_whdr, sizeof(WAVEHDR) );
}
 
 
CWaveFile::~CWaveFile()
{
	//arreter la diffusion en cours
	Stop();
 
	//fermer le device
	Close();	
 
	//Libération mémoire et handle allouée
	if( m_lpfile)
		delete [] m_lpfile;
	if( m_hEventDone )
		CloseHandle( m_hEventDone );
}
 
 
MMRESULT CWaveFile::Open(LPCSTR szFileName, UINT uDeviceID /*=WAVE_MAPPER*/)
{
    // Open and read the wave file
    FILE* f = fopen(szFileName, "rb");
    if(!f)				// Error, file not found.        
        return MMSYSERR_ERROR;
 
    // Determine the file size
    fseek(f, 0, SEEK_END);
    long fileLen = ftell(f);
 
    // Rewind the pointer to the begginning so we can read it
    fseek(f, 0, SEEK_SET);
 
    // Request enough memory to store the entire file
    m_lpfile = new char [fileLen];
 
    // 'Copy' the file to memory
    fread(m_lpfile, sizeof(char), fileLen, f);
 
    // Close the file, we won't need it anymore
    fclose(f);
 
	// Fill WAVEFORMATEX with the data from the file
    m_wfex.wFormatTag         = *((WORD* )(m_lpfile + OFFSET_FORMATTAG     ));
    m_wfex.nChannels          = *((WORD* )(m_lpfile + OFFSET_CHANNELS      ));
    m_wfex.nSamplesPerSec     = *((DWORD*)(m_lpfile + OFFSET_SAMPLESPERSEC ));
    m_wfex.nAvgBytesPerSec    = *((DWORD*)(m_lpfile + OFFSET_AVGBYTESPERSEC));
    m_wfex.nBlockAlign        = *((WORD* )(m_lpfile + OFFSET_BLOCKALIGN    ));
    m_wfex.wBitsPerSample     = *((WORD* )(m_lpfile + OFFSET_BITSPERSAMPLE ));
	m_wfex.cbSize = 0;
 
	// Fill the WAVEHDR structure
	m_whdr.lpData = m_lpfile+HEADER_SIZE;
	m_whdr.dwBufferLength = fileLen-HEADER_SIZE;
 
	//Durée prévu (en millisecondes)
	m_dwDurationTime = (float)m_whdr.dwBufferLength / m_wfex.nSamplesPerSec / (m_wfex.wBitsPerSample/8) * 1000;
 
	// Open and configure the device
	return waveOutOpen(&m_hwo, uDeviceID, &m_wfex, (DWORD)WaveOutProc, (DWORD)this, CALLBACK_FUNCTION);
} | 
Partager