// waveOut___lab_nowindow.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <windows.h>
// C 运行时头文件
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include <conio.h>
#include <math.h>
#include<mmeapi.h>
#define BUFFER_COUNT 4
typedef struct
{
char riff[4];
long riffSize;
char wave[4];
char fmt[4];
long fmtSize;
INT16 FormatTag;//0x0001
INT16 chanel;
long one_second_hz;
long one_second_data;
INT16 BlockAlign;//BlockAlign数据块对齐单位(每个采样需要的字节数)
INT16 per_sample_bit;
char data[4];
long dataSize;
} WAV_HEAD;
HWAVEOUT hWaveOut;
INT16* mem = NULL;
WAVEHDR whdr;
void CALLBACK waveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2);
void CALLBACK waveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{
switch (uMsg) {
case WOM_OPEN:
break;
case WOM_DONE:
{
}
break;
case WOM_CLOSE:
break;
default:
break;
}
}
int main()
{
HANDLE hFile;
WAV_HEAD wav;
BOOL R;
DWORD num = 0, round_robin = 0;
bool success;
int ss = sizeof(WAV_HEAD);
hFile = CreateFile(L"I:\\lab.wav", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
R = ReadFile(hFile, &wav, sizeof(WAV_HEAD), &num, NULL);
if (R)
{
DWORD fSize = GetFileSize(hFile, &num);
INT16* buffer = new INT16[(fSize - 44) / 2];
round_robin = fSize - 44;
R = ReadFile(hFile, buffer, fSize - 44, &num, NULL);
mem = buffer;
}
DWORD dummy;
// Open the sound card
WAVEFORMATEX waveformatex;
waveformatex.wFormatTag = WAVE_FORMAT_PCM;
;
waveformatex.nChannels = wav.chanel; // Stereo
waveformatex.nSamplesPerSec = wav.one_second_hz;
waveformatex.nAvgBytesPerSec = wav.one_second_data; // 2 channels, 2 bytes per each sample
waveformatex.nBlockAlign = wav.BlockAlign; // 2 channels, 2 bytes per 1 sample in each channel
waveformatex.wBitsPerSample = wav.per_sample_bit;
waveformatex.cbSize = 0;
whdr.lpData = (LPSTR)mem;
whdr.dwBufferLength = round_robin;
whdr.dwBytesRecorded = 0;
whdr.dwUser = 0;
whdr.dwFlags = 0;
whdr.dwLoops = 0;
auto result = waveOutOpen(&hWaveOut, WAVE_MAPPER, &waveformatex, (DWORD_PTR)waveOutProc, (DWORD_PTR)&dummy, CALLBACK_FUNCTION | WAVE_FORMAT_DIRECT);
waveOutPrepareHeader(hWaveOut, &whdr, sizeof(whdr));
waveOutWrite(hWaveOut, &whdr, sizeof(whdr));
if (result != MMSYSERR_NOERROR)
{
return false;
}
char d;
while(d!='q')
{
d=getchar();
}
waveOutReset(hWaveOut);
waveOutClose(hWaveOut);
}