辛苦大家帮我看一个关于内存播放wav的问题

ga6840 2009-07-30 02:31:25
代码如下:



#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include <windows.h>

struct wav_head
{
unsigned long wav_id;
unsigned int wav_size;
unsigned int type;
unsigned int fmt_id;
unsigned int fmt_size;
unsigned short format_tag;
unsigned short channels;
unsigned int sample_per_sec;
unsigned int avg_bytes_per_sec;
unsigned short block_align;
unsigned short bits_per_sample;
//unsigned short attach_info;
unsigned int data_id;
unsigned int date_size;
};

int main()
{
char *pbuf;
int i,len;
FILE *fp;

struct wav_head *test;
test=(struct wav_head *)malloc(sizeof(struct wav_head));
len=55552;
pbuf=(char *)malloc(55552);
fp=fopen("test2.wav","w");

test->wav_id=0x46464952; //RIFF
test->wav_size=len+44-8;
test->type=0x45564157; //WAVE

test->fmt_id=0x20746d66; //fmt
test->fmt_size=0x10;
test->format_tag=0x1;
test->channels=0x1;
test->sample_per_sec=0x3e80;
test->avg_bytes_per_sec=0x7d00;
test->block_align=0x2;
test->bits_per_sample=0x10;

test->data_id=0x61746164; //data
test->date_size=len;




for(i=0;i<len;i++)
{
//pbuf[i]=rand()%256;
pbuf[i]=i%256;
}
fwrite(test,sizeof(struct wav_head),1,fp);
fwrite(pbuf,sizeof(char),len,fp);

char* wavwav=new char[sizeof(struct wav_head)+55552];
memcpy(wavwav , (char*)test ,sizeof(wav_head));
memcpy(wavwav + sizeof(wav_head) ,(char*)pbuf,55552);

sndPlaySound(NULL,SND_MEMORY|SND_ASYNC);//stop the sound if there is a sound
sndPlaySound((const char *)&test,SND_MEMORY|SND_ASYNC);//return immediately


free(pbuf);
free(test);
fclose(fp);

while(1);
return 0;
}



包含有:kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib dxerr8.lib winmm.lib dsound.lib dxguid.lib

程序执行后 生成的wav可以播放 但

问题是:
我尝试想用sndPlaySound播放内存里的wav却没达到效果 ,没有任何声音播放 ,为什么?

谢谢各位!
...全文
109 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ga6840 2009-07-30
  • 打赏
  • 举报
回复
哎!!!!!!太傻啦
我试了试 没声就没。。。
可惜100分
不过谢谢goodname

我发现自己写的就是tm难查出错
goodname 2009-07-30
  • 打赏
  • 举报
回复
从你的程序来看似乎是
sndPlaySound((const char *)wavwav,SND_MEMORY|SND_ASYNC);
应该是wavwav
或者至少应该写
sndPlaySound((const char *)test,SND_MEMORY|SND_ASYNC);
无需取地址
lori227 2009-07-30
  • 打赏
  • 举报
回复
播放内存里的 需要

waveOutOpen 打开播放设备

waveOutPrepareHeader 为播放设备准备数据缓冲

waveOutWrite 播放

void CALLBACK RingWaveOutProc( HWAVEOUT hwo, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)

播放声音的回调函数

64,681

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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