Копирование из двойного указателя в массив int. Это правильно? - PullRequest
0 голосов
/ 15 ноября 2009

У меня есть двойной указатель data-> 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 ]

1 голос
/ 15 ноября 2009

Возможно, вам придется масштабировать и обрезать входные значения, отсечение может быть довольно медленным, но есть хитрость. Поэтому, если ваш ввод находится в диапазоне [-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 );
}
1 голос
/ 15 ноября 2009

Если data->mono_channel является массивом double с, приведение правильное (хотя ваш код слишком сложен - вам просто нужно использовать индекс i в качестве управляющей переменной в цикле и использовать его для индексации входной массив double с, а также результирующий массив int с).

Результирующая пауза может быть вызвана тем, что входные данные double не находятся в правильном диапазоне (т. Е. Вам может потребоваться некоторое масштабирование!). Что вы увидите, если распечатаете некоторые из этих double с?

1 голос
/ 15 ноября 2009

Сэмплы, вероятно, необходимо масштабировать от [-1,1] до [min, max], где min и max - минимальные и максимальные целочисленные значения для целочисленных сэмплов.

0 голосов
/ 15 ноября 2009

Ваш буфер имеет тип short[]. Вы настроили ALSA PCM для ожидания 16-битных значений? Посмотрите на этот пример из проекта ALSA.

0 голосов
/ 15 ноября 2009

Выглядит хорошо, было бы проще просто:

for (i = 0; i < frames; i++) {
  buffer[i] = (int)pdata->mono_channel[i];
}

Закодированы ли данные PCM? Это может быть вашей проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...