Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 记录到WAV文件中_C++_Linux_Audio_Wav_Alsa - Fatal编程技术网

C++ 记录到WAV文件中

C++ 记录到WAV文件中,c++,linux,audio,wav,alsa,C++,Linux,Audio,Wav,Alsa,自从我发帖以来,我一直在尝试自己从原始PCM数据编写一个有效的WAV文件。我已经成功地编写了FLAC转换器(经过测试并正常工作),但它没有对我编写的WAV文件进行编码 我不确定我做错了什么。我一直在浏览互联网,并将其与我自己的进行比较,但我仍然无法让它发挥作用 以下是缩减后的源代码(抱歉,它仍然有点长,我自己需要一些代码才能录制到.wav): //使用“g++test.ccp-o test-lasound”编译 //使用更新的ALSA API #定义ALSA_PCM_NEW_HW_PARAMS_

自从我发帖以来,我一直在尝试自己从原始PCM数据编写一个有效的WAV文件。我已经成功地编写了FLAC转换器(经过测试并正常工作),但它没有对我编写的WAV文件进行编码

我不确定我做错了什么。我一直在浏览互联网,并将其与我自己的进行比较,但我仍然无法让它发挥作用

以下是缩减后的源代码(抱歉,它仍然有点长,我自己需要一些代码才能录制到
.wav
):

//使用“g++test.ccp-o test-lasound”编译
//使用更新的ALSA API
#定义ALSA_PCM_NEW_HW_PARAMS_API
#包括
#包括
#包括
#包括
#包括
结构波头
{
char-RIFF_标记[4];
uint32文件大小;
char filetype_头[4];
字符格式_标记[4];
uint32数据头长度;
uint16_t格式_类型;
uint16信道的数量;
uint32样本率;
uint32字节/秒;
每帧uint16字节;
uint16位/u样本;
};
结构WaveHeader*通用WaveHeader(uint32采样率、uint16位深度、uint16通道)
{
结构波头*hdr;
hdr=(波头*)malloc(sizeof(*hdr));
如果(!hdr)
返回NULL;
memcpy(&hdr->RIFF_标记,“RIFF”,4);
memcpy(&hdr->filetype_头,“WAVE”,4);
memcpy(&hdr->format_marker,“fmt”,4);
hdr->数据头长度=16;
hdr->format_type=1;
hdr->信道数=信道数;
hdr->采样率=采样率;
hdr->字节/秒=采样率*通道*位深度/8;
hdr->每帧字节数=通道*位深度/8;
hdr->bits\u per\u sample=位深度;
返回hdr;
}
int writeWAVHeader(int-fd,结构波头*hdr)
{
如果(!hdr)
返回-1;
写入(fd和hdr->RIFF_标记,4);
写入(fd和hdr->文件大小,4);
写入(fd,&hdr->filetype_头,4);
写入(fd和hdr->格式标记,4);
写入(fd和hdr->数据头长度,4);
写入(fd和hdr->格式类型,2);
写入(fd和hdr->信道数,2);
写入(fd和hdr->采样率,4);
写入(fd和hdr->字节/秒,4);
写入(fd和hdr->每帧字节数,2);
写入(fd和hdr->每个样本的位,2);
写入(fd,“数据”,4);
uint32\u t data\u size=hdr->file\u size+8-44;
写入(fd和数据大小,4);
返回0;
}
int recordWAV(常量字符*文件名,结构波头*hdr,uint32_t持续时间)
{
INTERR;
整数大小;
snd_pcm_t*手柄;
snd_pcm_hw_params_t*params;
无符号整数采样率=hdr->采样率;
int dir;
snd_pcm_uframes_t frames=32;
字符*设备=(字符*)“plughw:1,0”;
字符*缓冲区;
int filedesc;
printf(“捕获设备是%s\n”,设备);
/*打开PCM设备进行记录(捕获)*/
err=snd\u pcm\u open(&handle,device,snd\u pcm\u STREAM\u CAPTURE,0);
如果(错误)
{
fprintf(标准,“无法打开PCM设备:%s\n”,snd_strerror(err));
返回错误;
}
/*分配硬件参数对象*/
snd_pcm_hw_params_alloca(¶ms);
/*用默认值填充它*/
snd_pcm_hw_params_any(手柄、参数);
/*设置所需的硬件参数*/
/*交织模式*/
err=snd_pcm_hw_params_set_access(句柄、参数、snd_pcm_access_RW_交错);
如果(错误)
{
fprintf(标准,“设置交织模式时出错:%s\n”,snd_strerror(err));
snd_pcm_关闭(手柄);
返回错误;
}
/*有符号16位小端点格式*/
如果(hdr->bits_per_sample==16)err=snd_pcm_hw_params_set_format(句柄、参数、snd_pcm_format_S16_LE);
else err=snd_pcm_hw_params_set_format(句柄、参数、snd_pcm_format_U8);
如果(错误)
{
fprintf(标准,“错误设置格式:%s\n”,snd_strerror(err));
snd_pcm_关闭(手柄);
返回错误;
}
/*双声道(立体声)*/
err=snd_pcm_hw_params_set_地震道(句柄、参数、hdr->地震道数);
如果(错误)
{
fprintf(标准,“错误设置通道:%s\n”,snd_strerror(err));
snd_pcm_关闭(手柄);
返回错误;
}
/*44100位/秒采样率(CD质量)*/
采样率=hdr->采样率;
err=snd_pcm_hw_params_set_rate_near(handle、params、sampleRate和dir);
如果(错误)
{
fprintf(stderr,“错误设置采样率(%d):%s\n”,sampleRate,snd_strerror(err));
snd_pcm_关闭(手柄);
返回错误;
}
hdr->采样率=采样器;
/*设置时段大小*/
err=snd_pcm_hw_params_set_period_size_near(句柄、参数、帧和目录);
如果(错误)
{
fprintf(标准,“错误设置周期大小:%s\n”,snd_strerror(err));
snd_pcm_关闭(手柄);
返回错误;
}
/*将参数写入驱动程序*/
err=snd_pcm_hw_参数(句柄,参数);
如果(误差<0)
{
fprintf(stderr,“无法设置硬件参数:%s\n”,snd_strerror(err));
snd_pcm_关闭(手柄);
返回错误;
}
/*使用足以容纳一个周期的缓冲区*/
err=snd_pcm_hw_params_get_period_size(参数、帧和目录);
如果(错误)
{
fprintf(标准,“检索时段大小%s\n时出错”,snd_strerror(err));
snd_pcm_关闭(手柄);
返回错误;
}
大小=帧*hdr->每个样本的位数/8*hdr->每个信道的个数;/*2字节/样本,2个信道*/
缓冲区=(字符*)malloc(大小);
如果(!缓冲区)
{
fprintf(标准输出,“缓冲区错误。\n”);
snd_pcm_关闭(手柄);
返回-1;
}
err=snd_pcm_hw_params_get_period_time(参数、采样器和目录);
如果(错误)
{
fprintf(stderr,“错误检索周期时间:%s\n”,snd_strerror(err));
snd_pcm_关闭(手柄);
自由(缓冲);
返回错误;
}
uint32\u t pcm\u data\u size=hdr->采样率*hdr->每帧字节数*duration/1000;
hdr->文件大小=pcm数据大小+44-8;
filedesc=打开(文件名
printf("Channels: %d\n", hdr->number_of_channels);
for (i = 0; i < 2*16000/128; i++)
{
    printf("\n Recording %d",i);
    err = snd_pcm_readi(handle, buffer, frames);
    write(filedesc, buffer, size);
 }