如何用低级音频api播放wav文件 ?

captainwh 2002-11-12 12:27:20
是用waveOutWrite进行wav文件的播放,我不知道取得一个wav文件的数据后如何将音频数据播放出来, 请问WAVEFORMATEX和WAVEHDR结构如何设置?最好给个例子程序。
...全文
220 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
AthlonxpX86 2003-04-12
  • 打赏
  • 举报
回复
该贴被强行结贴
wj59 2002-11-14
  • 打赏
  • 举报
回复

但为什么不用PlaySound?
AthlonxpX86 2002-11-13
  • 打赏
  • 举报
回复
//接上楼
// 确定文件是PCM 格式文件
if (pFormat->wFormatTag != WAVE_FORMAT_PCM)
{
// 波形音频不是PCM格式音频
LocalUnlock( hFormat );
LocalFree( hFormat );
mmioClose(hmmio, 0);
return FALSE;
}

// 确定波形音频输出设备支持该格式
if (waveOutOpen(&m_hWaveOut, WAVE_MAPPER, pFormat, 0, 0L,
WAVE_FORMAT_QUERY))
{
// 波形音频输出设备不支持该格式
LocalUnlock( hFormat );
LocalFree( hFormat );
mmioClose(hmmio, 0);
return FALSE;
}

// 从格式子块移出,上升到'RIFF'块
mmioAscend(hmmio, &mmckinfoSubchunk, 0);

// 寻找数据子块
mmckinfoSubchunk.ckid = mmioFOURCC('d', 'a', 't', 'a');
if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent,
MMIO_FINDCHUNK))
{
// 找不到数据子块
LocalUnlock( hFormat );
LocalFree( hFormat );
mmioClose(hmmio, 0);
return FALSE;
}

// 取得数据子块大小
dwDataSize = mmckinfoSubchunk.cksize;
if (dwDataSize == 0L)
{
// 取得数据子块大小为0
LocalUnlock( hFormat );
LocalFree( hFormat );
mmioClose(hmmio, 0);
return FALSE;
}

// 打开波形音频设备
if (waveOutOpen(&m_hWaveOut, WAVE_MAPPER,
pFormat, (UINT)m_hWnd, 0L, CALLBACK_WINDOW))
{
// 打开波形音频设备出错
LocalUnlock( hFormat );
LocalFree( hFormat );
mmioClose(hmmio, 0);
return FALSE;
}

// 保存块对齐信息,供少后使用
wBlockSize = pFormat->nBlockAlign;

// 格式数据头已使用完毕,释放它
LocalUnlock( hFormat );
LocalFree( hFormat );

// 为波形音频数据分配内存
m_lpData = (HPSTR)GlobalAllocPtr(GMEM_MOVEABLE | GMEM_SHARE,
dwDataSize );
if (!m_lpData)
{
// 分配内存出错
mmioClose(hmmio, 0);
return FALSE;
}

// 读波形音频子块
if(mmioRead(hmmio, m_lpData, dwDataSize) != (LONG) dwDataSize)
{
// 读波形音频子块出错
GlobalFreePtr( m_lpData );
mmioClose(hmmio, 0);
return FALSE;
}

// 文件已使用完毕,关闭它
mmioClose(hmmio, 0);

// 给波形数据头WAVEHDR 分配、锁定全局内存
m_lpWaveHdr = (LPWAVEHDR)GlobalAllocPtr(
GMEM_MOVEABLE | GMEM_SHARE,
(DWORD) sizeof(WAVEHDR));
if (!m_lpWaveHdr)
{
//分配全局内存出错
GlobalFreePtr( m_lpData );
return FALSE;
}

// 设置WAVEHDR结构,并准备其数据
m_lpWaveHdr->lpData = m_lpData;
m_lpWaveHdr->dwBufferLength = dwDataSize;
m_lpWaveHdr->dwFlags = 0L;
m_lpWaveHdr->dwLoops = 0L;
if(waveOutPrepareHeader(m_hWaveOut, m_lpWaveHdr, sizeof(WAVEHDR)))
{
// 准备WAVEHDR结构数据出错
GlobalFreePtr( m_lpWaveHdr );
GlobalFreePtr( m_lpData );
return FALSE;
}

// 将数据块写到波形音频输出设备
dwResult = waveOutWrite(m_hWaveOut, m_lpWaveHdr, sizeof(WAVEHDR));
if (dwResult != 0)
{
// 往波形音频输出设备写数据块出错
CleanUp();
return FALSE;
}

return TRUE;
}
AthlonxpX86 2002-11-13
  • 打赏
  • 举报
回复
BOOL CWavePlayerDlg::PlayWaveFile(LPSTR lpszFileName)
{
HMMIO hmmio;
MMCKINFO mmckinfoParent;
MMCKINFO mmckinfoSubchunk;
DWORD dwFmtSize;
DWORD dwResult;
HANDLE hFormat;
WAVEFORMATEX * pFormat;
DWORD dwDataSize;
WORD wBlockSize;
HANDLE hData = NULL;

// 查询系统是否安装有波形音频输出设备
if (waveOutGetNumDevs() == 0)
{
// 系统没有波形音频输出设备
return FALSE;
}

// 打开文件,使用缓冲区输入/输出
if(!(hmmio = mmioOpen(lpszFileName, NULL,
MMIO_READ | MMIO_ALLOCBUF)))
{
// 打开文件出错
return FALSE;
}

// 查找形式类型为'WAVE'的'RIFF'块,以确定文件是WAVE文件
mmckinfoParent.fccType = mmioFOURCC('W', 'A', 'V', 'E');
if (mmioDescend(hmmio, &mmckinfoParent, NULL, MMIO_FINDRIFF))
{
// 文件不是WAVE文件
mmioClose(hmmio, 0);
return FALSE;
}

// 查找格式块('fmt '块),它应是'RIFF'块的子块
mmckinfoSubchunk.ckid = mmioFOURCC('f', 'm', 't', ' ');
if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent,
MMIO_FINDCHUNK))
{
// 找不到'fmt '块
mmioClose(hmmio, 0);
return FALSE;
}

// 获取格式块的大小,并格式块分配、锁定内存
dwFmtSize = mmckinfoSubchunk.cksize;
hFormat = LocalAlloc(LMEM_MOVEABLE, LOWORD(dwFmtSize));
if (!hFormat)
{
// 分配内存出错
mmioClose(hmmio, 0);
return FALSE;
}
pFormat = (WAVEFORMATEX *) LocalLock(hFormat);
if (!pFormat)
{
// 锁定内存出错
LocalFree( hFormat );
mmioClose(hmmio, 0);
return FALSE;
}

// 读格式块
if (mmioRead(hmmio, (HPSTR) pFormat, dwFmtSize)
!= (LONG) dwFmtSize)
{
// 读格式块出错
LocalUnlock( hFormat );
LocalFree( hFormat );
mmioClose(hmmio, 0);
return FALSE;
}

//续
NowCan 2002-11-13
  • 打赏
  • 举报
回复
http://vip.6to23.com/NowCan1/progtech.htm
看看多媒体那一页。
NowCan 2002-11-13
  • 打赏
  • 举报
回复
太复杂了。参考一下。
http://vip.6to23.com/NowCan1/code/wave.zip

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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