我有一个双指针数据 - > mono_channel,我想将所有双精度数转换成整数并将它们放在一个数组中。
int frames = data->audio_info_save->frames;
short buffer[frames];
double* p;
int i = 0;
for (p = &(data->mono_channel)[0]; p < &(data->mono_channel)[frames]; p++) {
buffer[i] = (int) *p;
i++;
}
目的是ALSA采用整数样本数组,我的样本是双倍的。
if ((err = snd_pcm_writei(playback_handle, buffer, frames)) != frames) {
fprintf(stderr, "write to audio interface failed (%s)\n", snd_strerror(err));
exit(1);
}
所以不知怎的,我需要将我的双打转换为整数。
我没有听到任何声音。铸造是否正确完成?
答案 0 :(得分:1)
样本可能需要从[-1,1]缩放到[min,max],其中min和max是整数样本的最小和最大整数值。
答案 1 :(得分:1)
如果data->mono_channel
是一个double
的数组,则转换是正确的(尽管您的代码过于复杂 - 您应该只使用索引i
作为循环中的控件变量,并使用它来索引double
的输入数组以及int
s的结果数组。
产生的沉默可能是由于输入double
不在正确的范围内(即,您可能需要一些缩放!)。如果你打印出其中一些double
,你会看到什么?
答案 2 :(得分:1)
你可能需要缩放和剪辑输入值,裁剪可能会很慢,但有一个技巧。因此,如果您的输入在[-1,1]范围内,那么您可以使用以下代码:
double fclip( double value, double start, double end ) {
return 0.5 * ( fabs(value-start) + (start+end) - fabs(value-end) );
}
...
for( i = 0; i < frames; i++ ) {
buffer[i] = (short)fclip( 32767.0 * pdata->mono_channel[i], -32767, +32768 );
}
答案 3 :(得分:0)
看起来没问题,只是更容易:
for (i = 0; i < frames; i++) {
buffer[i] = (int)pdata->mono_channel[i];
}
数据PCM是否编码?那可能是你的问题。
答案 4 :(得分:0)
您的缓冲区属于short[]
类型。您是否将ALSA PCM配置为期望16位值?看看ALSA项目的这个example。