高手帮忙解决一个问题!

game_zhang 2004-10-10 03:55:31
在用waveOutOpen()函数要打开一个WAVE设备!要播放的WAVE文件头格式为:
WAVEFORMATEX pFormat;

pFormat.wFormatTag=WAVE_FORMAT_IMA_ADPCM;
pFormat.nChannels= 1; //声道;
pFormat.nSamplesPerSec=8000; //每秒采样频率;
pFormat.nAvgBytesPerSec=4055;
pFormat.nBlockAlign=256;

pFormat.wBitsPerSample=4;
pFormat.cbSize=?;
请问你们能打开播放这种WAVE文件的设备吗?
(注意)pFormat.wFormatTag=WAVE_FORMAT_IMA_ADPCM pFormat.wBitsPerSample=4
如果不能请问你们如何处理??


先谢谢了
...全文
125 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhang_game 2004-11-03
  • 打赏
  • 举报
回复
#ifdef ASD
#include <windows.h>
#include <Mmsystem.h>
#include "stdio.h"
#include "iostream.h"
#include <MMREG.H>
char* pp = "ssssss";
//////////////////////////////////////////////////////////////////////////
void CALLBACK WaveCallback(HWAVEOUT hWave, UINT uMsg, DWORD dwUser,
DWORD dw1, DWORD dw2)
{
if (uMsg == WOM_DONE) {
printf("%s",pp);
}
}

///////////////////////////////////////////////////////////////////////////





void main()
{
//////////////////////////////////////////

//////////////////////////////////////////
int i ;
LPSTR szFileName = "E:\\Downloads\\LinuxFAQ\\english.wav";//声音文件名
MMCKINFO mmckinfoParent;
MMCKINFO mmckinfoSubChunk;
DWORD dwFmtSize;
HMMIO m_hmmio;//音频文件句柄
DWORD m_WaveLong;
HPSTR lpData;//音频数据
HANDLE m_hData;
HANDLE m_hFormat;
WAVEFORMATEX * lpFormat;
DWORD m_dwDataOffset;
DWORD m_dwDataSize;
WAVEHDR pWaveOutHdr;
WAVEOUTCAPS pwoc;
HWAVEOUT hWaveOut;
//打开波形文件
if(!(m_hmmio=mmioOpen(szFileName,NULL,MMIO_READ|MMIO_ALLOCBUF)))
{
//File open Error
printf("Failed to open the file.");//错误处理函数
return;
}
//检查打开文件是否是声音文件
mmckinfoParent.fccType =mmioFOURCC('W','A','V','E');
if(mmioDescend(m_hmmio,(LPMMCKINFO)&mmckinfoParent,NULL,MMIO_FINDRIFF))
{
//NOT WAVE FILE AND QUIT
}
//寻找 ’fmt’ 块
mmckinfoSubChunk.ckid =mmioFOURCC('f','m','t',' ');
if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK))
{
//Can’t find ’fmt’ chunk
}
//获得 ’fmt ’块的大小,申请内存
dwFmtSize=mmckinfoSubChunk.cksize ;
m_hFormat=LocalAlloc(LMEM_MOVEABLE,LOWORD(dwFmtSize));
if(!m_hFormat)
{
//failed alloc memory
}
lpFormat=(WAVEFORMATEX*)LocalLock(m_hFormat);
if(!lpFormat)
{
//failed to lock the memory
}
if((unsigned long)mmioRead(m_hmmio,(HPSTR)lpFormat,dwFmtSize)!=dwFmtSize)
{
//failed to read format chunk
}
//离开 fmt 块
mmioAscend(m_hmmio,&mmckinfoSubChunk,0);
//寻找 ’data’ 块
mmckinfoSubChunk.ckid=mmioFOURCC('d','a','t','a');
if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK))
{
//Can’t find ’data’ chunk
}
//获得 ’data’块的大小
m_dwDataSize=mmckinfoSubChunk.cksize ;
m_dwDataOffset =mmckinfoSubChunk.dwDataOffset ;
if(m_dwDataSize==0L)
{
//no data in the ’data’ chunk
}
//为音频数据分配内存
lpData=new char[m_dwDataSize];
if(!lpData)
{
//faile
}
if(mmioSeek(m_hmmio,m_dwDataOffset,SEEK_SET)<0)
{
//Failed to read the data chunk
}
m_WaveLong=mmioRead(m_hmmio,lpData,m_dwDataSize);
if(m_WaveLong<0)
{
//Failed to read the data chunk
}
//检查音频设备,返回音频输出设备的性能
if((i = waveOutGetDevCaps(WAVE_MAPPER,&pwoc,sizeof(WAVEOUTCAPS)))!=0)
{
//Unable to allocate or lock memory
}
//检查音频输出设备是否能播放指定的音频文件
if((i = waveOutOpen(&hWaveOut,WAVE_MAPPER,lpFormat,(DWORD)WaveCallback,22,CALLBACK_FUNCTION))!=0)
{
//Failed to OPEN the wave out devices




}
//准备待播放的数据
pWaveOutHdr.lpData =(HPSTR)lpData;
pWaveOutHdr.dwBufferLength =m_WaveLong;
pWaveOutHdr.dwFlags =0;
if(waveOutPrepareHeader(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0)
{
//Failed to prepare the wave data buffer
}
//播放音频数据文件
if(waveOutWrite(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0)
{
//Failed to write the wave data buffer
}


scanf("%d",&i);
//关闭音频输出设备,释放内存
waveOutReset(hWaveOut);
waveOutClose(hWaveOut);
LocalUnlock(m_hFormat);
LocalFree(m_hFormat);
delete [] lpData;


}

#endif
wizardinred 2004-10-10
  • 打赏
  • 举报
回复
帮你顶顶,学习中。。。。。。
game_zhang 2004-10-10
  • 打赏
  • 举报
回复
难道没有人能帮忙吗?
game_zhang 2004-10-10
  • 打赏
  • 举报
回复
WAVEFORMATEX pFormat 该结构体成员的值是从某一WAVE文件分析出来的结果!

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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