从双指针复制到int数组。它是否正确?

时间:2009-11-15 17:29:41

标签: c

我有一个双指针数据 - > 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);
}

所以不知怎的,我需要将我的双打转换为整数。

我没有听到任何声音。铸造是否正确完成?

5 个答案:

答案 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