帮我查查下面的代码把

NsKen 2001-10-27 10:21:11
为什么放了第一个buffer就没有了?不会继续更新buffer急需播放


int NSOUND_API wav_opened_count = 0; //打开了多少Wav
int NSOUND_API cache_size;
NSOUND_API unsigned char * wav_cache; //缓冲
HWAVEOUT hwo;
bool bPlaying;
WAVECHANNEL channel[MAXCHANNEL];

bool NSOUND_API ns_open_dev(HWND hWnd,int bit,int sample,int cache){
MMRESULT mmres;
UINT devId;

WAVEFORMATEX fmt;
fmt.nChannels = bit / 8;
fmt.nSamplesPerSec = sample;
fmt.wBitsPerSample = 8;
fmt.nAvgBytesPerSec = fmt.nChannels * fmt.wBitsPerSample * sample;

fmt.nBlockAlign = fmt.nChannels * fmt.wBitsPerSample / 8;
fmt.wFormatTag = 1;



for (devId = 0; devId < waveOutGetNumDevs(); devId++){
mmres = waveOutOpen(&hwo, devId,&fmt, (DWORD)NotifyCallback,0,CALLBACK_FUNCTION);
if (mmres == MMSYSERR_NOERROR)
break;
}
if (mmres != MMSYSERR_NOERROR) {
return false;
}
// 初始化channel
for(int i = 0; i<MAXCHANNEL;i++){
channel[i].remained = 0;
channel[i].wave = NULL;
}
bPlaying = false;




cache_size = cache;
wav_cache = new unsigned char[cache_size];

return true;
}

void NSOUND_API ns_close_dev(){
waveOutReset(hwo);
delete[] wav_cache;
waveOutClose(hwo);
}




NSOUNDHANDLE NSOUND_API ns_load_wave(TCHAR * file){
HANDLE hFile;
WAVEFORMATEX m_Format;
hFile = CreateFile(file,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile == INVALID_HANDLE_VALUE) return NULL;
DWORD size = GetFileSize(hFile,0);
size -= WF_HEADER_SIZE;

DWORD bytes;
BYTE aHeader[WF_HEADER_SIZE];
/*if(ReadFile(hFile,&aHeader,sizeof(WF_HEADER_SIZE),&bytes,NULL)!=TRUE)return NULL;*/
ReadFile(hFile,&aHeader,sizeof(WF_HEADER_SIZE),&bytes,NULL);
m_Format.wFormatTag = *((WORD*) (aHeader + WF_OFFSET_FORMATTAG));
m_Format.nChannels = *((WORD*) (aHeader + WF_OFFSET_CHANNELS));
m_Format.nSamplesPerSec = *((DWORD*) (aHeader + WF_OFFSET_SAMPLESPERSEC));
m_Format.nAvgBytesPerSec = *((DWORD*) (aHeader + WF_OFFSET_AVGBYTESPERSEC));
m_Format.nBlockAlign = *((WORD*) (aHeader + WF_OFFSET_BLOCKALIGN));
m_Format.wBitsPerSample = *((WORD*) (aHeader + WF_OFFSET_BITSPERSAMPLE));
unsigned char *data = new unsigned char[size];
ReadFile(hFile,data,size,&bytes,NULL);
/* if(ReadFile(hFile,data,size,&bytes,NULL)!=TRUE){
delete[] data;
return NULL;
}*/
CloseHandle(hFile);
WAVEDATA *wave = new WAVEDATA();
wave->length = size;
wave->data = data;
return wave;
}
bool NSOUND_API ns_close_wave(NSOUNDHANDLE hWav){
delete[] hWav->data;
delete hWav;
return true;
}
bool NSOUND_API ns_play_wave(NSOUNDHANDLE hWav){
for(int i = 0; i<MAXCHANNEL;i++){
if(channel[i].remained < 1){
channel[i].remained = hWav->length;
channel[i].wave = hWav;
break;
}
}
OnWavePlay();
return true;;
}

void OnWavePlay(){
if(bPlaying == true)return;
_play_wave();
}


void _play_wave(){
// clear buffer
register int x;
memset(wav_cache,0,cache_size);
bool bVolid = false;
register int i;
for(i =0;i<MAXCHANNEL;i++){
if(channel[i].remained > 0){
if(bVolid == false){
int size = MIN<int>(channel[i].remained,cache_size);
unsigned char *wav = channel[i].wave->data + channel[i].wave->length - channel[i].remained;
memcpy(wav_cache,wav,size);
channel[i].remained -= size;
bVolid = true;
}else{
int size = MIN<int>(channel[i].remained,cache_size);
unsigned char *wav = channel[i].wave->data + channel[i].wave->length - channel[i].remained;
for(register int i=0;i<size;i++){
//将两组WAV文件数据相加,并检测数据大小是否合法,如果//数据大小越界,则分别取最大值和最小值
x=(((*(wav_cache+i))+(*(wav+i))))/128;
if(x<0)x=0;
if(x>255)x=255;
*(wav_cache+i)=(unsigned char)(x);
}
channel[i].remained -= size;
bVolid = true;
}

}
}

if(bVolid == false) return;
WAVEHDR m_WaveHdr;

ZeroMemory(&m_WaveHdr, sizeof(WAVEHDR));
m_WaveHdr.lpData = (LPSTR)wav_cache;
m_WaveHdr.dwBufferLength = cache_size;
m_WaveHdr.dwUser = 0;
m_WaveHdr.dwFlags = 0;
m_WaveHdr.dwLoops = 0;
m_WaveHdr.dwBytesRecorded = 0;
m_WaveHdr.lpNext = 0;
m_WaveHdr.reserved = 0;
MMRESULT mmres = waveOutPrepareHeader(hwo, &m_WaveHdr, sizeof(WAVEHDR));
if (mmres != MMSYSERR_NOERROR) {
return;
}

mmres = waveOutWrite(hwo, &m_WaveHdr, sizeof(WAVEHDR));
if (mmres != MMSYSERR_NOERROR) {
return;
}
bPlaying = true;
}

void CALLBACK NotifyCallback(HWAVEOUT hWaveOut,UINT nMsg,DWORD dwInst,DWORD dwParam1,DWORD dwParam2){
WAVEHDR* pWaveHdr = ( (WAVEHDR*)dwParam1 );
switch (nMsg){
case MM_WOM_OPEN: return; break;

/* multimedia device opened */
case MM_WOM_CLOSE: return; break;

/* buffer has completed */
case MM_WOM_DONE:
OnCompleted((WAVEHDR *)dwParam1);
return;
break;
case MM_WIM_DATA:
OnCompleted((WAVEHDR *)dwParam1);
return;
break;
}
}

void OnCompleted(WAVEHDR *hdr){
waveOutUnprepareHeader(hwo, hdr, sizeof(WAVEHDR));
bPlaying = false;
_play_wave();
}
...全文
48 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
EA2002 2001-10-29
  • 打赏
  • 举报
回复
UP

    ●╭○╮  
/█∨█\ 
    ∏ ∏    
  天若有情天亦老  
EA2002(E)(A)(2)(0)(0)(2)
Copyright 2001 Microsoft

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧