16,472
社区成员
发帖
与我相关
我的任务
分享
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
void CALLBACK waveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
{
switch(uMsg)
{
case WOM_DONE:
break;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
HWAVEOUT hDevice;
HANDLE hFile = CreateFile(L"D:\\ws.wav",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
long int nFilelen=GetFileSize(hFile,NULL);
DWORD dwRead=0;
DWORD nChannels=0;
DWORD nSamplesPerSec=0;
long int nAvgBytesPerSec=0;
DWORD nBlockAlign = 0;
DWORD wBitsPerSample = 0;
long int nFileSize = 0;
SetFilePointer(hFile,0x16,NULL,FILE_BEGIN);
ReadFile(hFile,&nChannels,2,&dwRead,NULL);
SetFilePointer(hFile,0x18,NULL,FILE_BEGIN);
ReadFile(hFile,&nSamplesPerSec,2,&dwRead,NULL);
SetFilePointer(hFile,0x1c,NULL,FILE_BEGIN);
ReadFile(hFile,&nAvgBytesPerSec,4,&dwRead,NULL);
SetFilePointer(hFile,0x20,NULL,FILE_BEGIN);
ReadFile(hFile,&nBlockAlign,2,&dwRead,NULL);
SetFilePointer(hFile,0x22,NULL,FILE_BEGIN);
ReadFile(hFile,&wBitsPerSample,2,&dwRead,NULL);
SetFilePointer(hFile,0x28,NULL,FILE_BEGIN);
ReadFile(hFile,&nFileSize,4,&dwRead,NULL);
CloseHandle(hFile);
WAVEFORMATEX waveformat;
waveformat.cbSize = sizeof(WAVEFORMATEX);
waveformat.nAvgBytesPerSec = nAvgBytesPerSec;
waveformat.nBlockAlign = nBlockAlign;
waveformat.nChannels = nChannels;
waveformat.nSamplesPerSec = nSamplesPerSec;
waveformat.wBitsPerSample = 2*wBitsPerSample;
waveformat.wFormatTag = WAVE_FORMAT_PCM;
DWORD test = 0;
if(MMSYSERR_NOERROR != (test=waveOutOpen(NULL,WAVE_MAPPER,(WAVEFORMATEX*)&waveformat,NULL,NULL,WAVE_FORMAT_QUERY)))
{
MessageBox(NULL,L"Open Error!",L"Error",0);
return 1;
}
if(MMSYSERR_NOERROR!=(test=waveOutOpen(&hDevice,WAVE_MAPPER,(WAVEFORMATEX*)&waveformat,/*(DWORD)waveOutProc*/NULL,0,/*CALLBACK_FUNCTION*/NULL)))
{
return 1;
}
FILE *file=fopen("D:\\ws.wav","rb");
//fseek(file,44,SEEK_SET);
WAVEHDR wavehdr;
ZeroMemory(&wavehdr,sizeof(wavehdr));
wavehdr.dwBufferLength = nFilelen-44;
wavehdr.lpData = (char*)(file+44);//这个地方用的对不?
test =waveOutPrepareHeader(hDevice,&wavehdr,sizeof(wavehdr));//这里返回11,不知道怎么改了。
test=waveOutWrite(hDevice,&wavehdr,sizeof(wavehdr));
Sleep(1000*60);
return 0;
}
wavehdr.lpData = (char*)(file+44);//这个地方用的对不?
这句改成
wavehdr.lpData =/* (char*)(file+44)*/new char[nFilelen-44+1];
以后的函数就可以返回正确的值,但是仍然播放不出音乐。这个指针到底该怎么设啊?