pcm — C ++: конвертировать float [] в unsigned char * или BYTE *

Я занимаюсь разработкой проекта, в котором мне нужно преобразовать 16-битный звук PCM 2 в 32-битный канал IEEE Float.

Для этого я использую следующий код:

void CAudioConverter::ConvI16ToF32(BYTE* pcmFrom, BYTE* floatTo, int length)
{
short* src = reinterpret_cast<short*>(pcmFrom);
float* dst = reinterpret_cast<float*>(floatTo);
for (int n = 0; n < length; n++)
{
dst[n] = static_cast<float>(src[n]) / 32768.0f;
}
}

Я инициализировал переменную __pcm32_bytesPerFrame с помощью:

WAVEFORMATEX* closestFormat;
ws->default_pb_dev->GetMixFormat(&closestFormat);
__pcm32_bytesPerFrame = closestFormat->nAvgBytesPerSec * (prm->samples_per_frame * 1000 / (prm->clock_rate * closestFormat->nChannels)) / 1000;

strm-> pb_max_frame_count is:

hr = ws->default_pb_dev->GetBufferSize(&ws->pb_max_frame_count);

У меня есть цикл while в отдельном потоке, который делает что-то вроде:

hr = strm->default_pb_dev->GetCurrentPadding(&padding);
incoming_frame = __pcm32_bytesPerFrame / 4;
frame_to_render = strm->pb_max_frame_count - padding;
if (frame_to_render >= incoming_frame)
{
frame_to_render = incoming_frame;
} else {
/* Don't get new frame because there's no space */
frame_to_render = 0;
}

if (frame_to_render > 0)
{
pjmedia_frame frame;

hr = strm->pb_client->GetBuffer(frame_to_render, &cur_pb_buf);
if (FAILED(hr)) {
continue;
}

void* destBuffer = (void*)malloc(strm->bytes_per_frame*frame_to_render*sizeof(pj_uint16_t));

if (strm->fmt_id == PJMEDIA_FORMAT_L16) {/* PCM mode */
frame.type = PJMEDIA_FRAME_TYPE_AUDIO;
frame.size = strm->bytes_per_frame;
frame.timestamp.u64 = strm->pb_timestamp.u64;
frame.bit_info = 0;
frame.buf = destBuffer;
}

status = (*strm->pb_cb)(strm->user_data, &frame);

CAudioConverter* conv = new CAudioConverter();
conv->ConvI16ToF32((BYTE*)destBuffer, cur_pb_buf, frame_to_render);

hr = strm->pb_client->ReleaseBuffer(frame_to_render, 0);
(...)

Но для отправки звука в буфер захвата WASAPI мне нужен BYTE *.
Как я могу заполнить свой аргумент «floatTo»?

Есть идеи?

Спасибо

0

Решение

Как насчет этого:

void CAudioConverter::ConvI16ToF32(BYTE* pcmFrom, BYTE* floatTo, int length)
{
short* src = reinterpret_cast<short*>(pcmFrom);
float* dst = reinterpret_cast<float*>(floatTo);
for (int n = 0; n < length; n++)
{
dst[n] = static_cast<float>(src[n]) / 32768.0f;
}
}

Дополнительно убедитесь, что length указывает количество элементов в pcmFrom а также floatTo, а не количество выделенных байтов. В твоем случае pcmFrom должен был выделить length*2 байты и floatTo нужно место для length*4 байт.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]