如何在console的程序中播放一个保存在数组中的pcm音频样点?谢谢

bingbingsxy 2005-12-01 01:17:49
使用waveOutOpen函数好象必须是窗口程序才能用,在console程序下有没有办法可以播pcm样点,谢谢
...全文
74 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
bingbingsxy 2005-12-03
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <windows.h>
#include <math.h>
#include <process.h>

#define SAMPLE_RATE 22050
#define OUT_BUFFER_SIZE 430000

static HWAVEOUT hWaveOut ;
static PBYTE pBuffer1;
static PWAVEHDR pWaveHdr1;
static WAVEFORMATEX waveformat ;

void sound_start (void * pv)
{
FILE * pcmfile = (FILE *) pv;
fread(pBuffer1, 1, OUT_BUFFER_SIZE, pcmfile);

waveOutWrite(hWaveOut, pWaveHdr1, sizeof(WAVEHDR));
}

void main ()
{
pWaveHdr1 = (PWAVEHDR) malloc(sizeof(WAVEHDR)) ;
pBuffer1 = (PBYTE) malloc(OUT_BUFFER_SIZE) ;

FILE * pcm = fopen("test.pcm", "rb");
if (NULL == pcm)
return;

if (!pWaveHdr1 || !pBuffer1)
{
if (!pWaveHdr1) free(pWaveHdr1) ;
if (!pBuffer1) free(pBuffer1) ;

return;
}

waveformat.wFormatTag = WAVE_FORMAT_PCM ;
waveformat.nChannels = 2 ;
waveformat.nSamplesPerSec = SAMPLE_RATE ;
waveformat.nAvgBytesPerSec = 88200;
waveformat.nBlockAlign = 4 ;
waveformat.wBitsPerSample = 16 ;
waveformat.cbSize = 0 ;

if (waveOutOpen(&hWaveOut, WAVE_MAPPER, &waveformat, (DWORD)0, 0, CALLBACK_NULL)
!= MMSYSERR_NOERROR)
{
free(pWaveHdr1) ;
free(pBuffer1) ;

hWaveOut = NULL ;
return;
}

pWaveHdr1->lpData = (char *) pBuffer1 ;
pWaveHdr1->dwBufferLength = OUT_BUFFER_SIZE ;
pWaveHdr1->dwBytesRecorded = 0 ;
pWaveHdr1->dwUser = 0 ;
pWaveHdr1->dwFlags = 0 ;
pWaveHdr1->dwLoops = 1 ;
pWaveHdr1->lpNext = NULL ;
pWaveHdr1->reserved = 0 ;

waveOutPrepareHeader (hWaveOut, pWaveHdr1,
sizeof (WAVEHDR)) ;

unsigned int id;
HANDLE h = (HANDLE) _beginthreadex(NULL, 20000, (unsigned (__stdcall *)(void *)) sound_start,
(void *) pcm, 0, &id);

WaitForSingleObject(h, INFINITE);

/*
fread(pBuffer1, 1, OUT_BUFFER_SIZE, pcm);

int i = 0;
while (i < 2)
{
waveOutWrite(hWaveOut, pWaveHdr1, sizeof (WAVEHDR)) ;

//i++;
}
*/

waveOutClose(hWaveOut);
free (pWaveHdr1) ;
free (pBuffer1) ;

}


上面是我写的一个测试程序,就是从一个pcm的文件中读取数据,然后waveOutWrite将它播出来,原来我是将播放写在主函数里,可以看到已经被我注释掉了的.
我发现个很奇怪的现象,就是我运行该程序,听不到pcm中的音乐,但是我在waveOutWrite那个函数处加上一个断点,结果当单步调试时却能够发出声音来.我将循环里那个i++注释掉后,变成了一个死循环,这样运行该程序就会有音乐听到了.
我以为是要用多线程才行,但当我把程序改成多线程后,还是听不到音乐,而在单步调试中却能听到.

哪位大侠能教我在console程序中使用waveOutWrite放音乐,不胜感激,谢谢了!
bingbingliangliang 2005-12-02
  • 打赏
  • 举报
回复
用api函数:

HINSTANCE ShellExecute(
   HWND hwnd,
   LPCTSTR lpVerb,
   LPCTSTR lpFile,
   LPCTSTR lpParameters,
   LPCTSTR lpDirectory,
   INT nShowCmd
  );
试试

7,540

社区成员

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

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