RtAudio — Воспроизведение сэмплов из wav-файла

В настоящее время я пытаюсь научиться аудио программирования. Моя цель — открыть файл wav, распаковать все и воспроизвести сэмплы с помощью RtAudio.

Я создал класс WaveLoader, который позволяет мне извлекать образцы и метаданные. я использовал этот руководство, чтобы сделать это, и я проверил, что все правильно с редактором 010. Вот снимок редактора 010, показывающий структуру и данные.

010 редактор

И вот как я храню необработанные образцы в классе WaveLoader:

        data = new short[wave_data.payloadSize]; // - Allocates memory size of chunk size

if (!fread(data, 1, wave_data.payloadSize, sound_file))
{
throw ("Could not read wav data");
}

Если я распечатаю каждый образец, я получаю: 1, -3, 4, -5 … что кажется нормальным.

Проблема в том, что я не уверен, как я могу играть в них. Вот что я сделал:

/*
* Using PortAudio to play samples
*/
bool Player::Play()
{
ShowDevices();
rt.showWarnings(true);

RtAudio::StreamParameters oParameters; //, iParameters;
oParameters.deviceId = rt.getDefaultOutputDevice();
oParameters.firstChannel = 0;
oParameters.nChannels = mAudio.channels;

//iParameters.deviceId = rt.getDefaultInputDevice();
//iParameters.nChannels = 2;

unsigned int sampleRate = mAudio.sampleRate;

// Use a buffer of 512, we need to feed callback with 512 bytes everytime!
unsigned int nBufferFrames = 512;

RtAudio::StreamOptions options;
options.flags = RTAUDIO_SCHEDULE_REALTIME;
options.flags = RTAUDIO_NONINTERLEAVED;

//&parameters, NULL, RTAUDIO_FLOAT64,sampleRate, &bufferFrames, &mCallback, (void *)&rawData

try {
rt.openStream(&oParameters, NULL, RTAUDIO_SINT16, sampleRate, &nBufferFrames, &mCallback, (void*) &mAudio);
rt.startStream();
}
catch (RtAudioError& e) {
std::cout << e.getMessage() << std::endl;
return false;
}
return true;
}

/*
* RtAudio Callback
*
*/
int mCallback(void * outputBuffer, void * inputBuffer, unsigned int nBufferFrames, double streamTime, RtAudioStreamStatus status, void * userData)
{
unsigned int i = 0;
short *out = static_cast<short*>(outputBuffer);
auto *data = static_cast<Player::AUDIO_DATA*>(userData);

// if i is more than our data size, we are done!
if (i > data->dataSize) return 1;

// First time callback is called data->ptr is 0, this means that the offset is 0
// Second time data->ptr is 1, this means offset = nBufferFrames (512) * 1 = 512
unsigned int offset = nBufferFrames * data->ptr++;

printf("Offset: %i\n", offset);
// First time callback is called offset is 0, we are starting from 0 and looping nBufferFrames (512) times, this gives us 512 bytes
// Second time, the offset is 1, we are starting from 512 bytes and looping to 512 + 512 = 1024
for (i = offset; i < offset + nBufferFrames; ++i)
{
short sample = data->rawData[i]; // Get raw sample from our struct
*out++ = sample;                // Pass to output buffer for playback

printf("Current sample value: %i\n", sample);       // this is showing 1, -3, 4, -5 check 010 editor
}

printf("Current time: %f\n", streamTime);
return 0;
}

Внутри функции обратного вызова, когда я распечатываю примеры значений, я получаю в точности как редактор 010? Почему они не играют в них? Что здесь не так? Нужно ли нормализовать значения выборки в диапазоне от -1 до 1?

Редактировать:
Файл wav, который я пытаюсь воспроизвести:

  • Размер: 16
  • Формат: 1
  • Канал: 1
  • SampleRate: 48000
  • ByteRate: 96000
  • BlockAlign: 2
  • BitPerSample: 16
  • Общий размер необработанных образцов: 2217044 байта.

0

Решение

По какой-то причине это работает, когда я передаю входные параметры в openStream ()

    RtAudio::StreamParameters oParameters, iParameters;
oParameters.deviceId = rt.getDefaultOutputDevice();
oParameters.firstChannel = 0;
//oParameters.nChannels = mAudio.channels;
oParameters.nChannels = mAudio.channels;

iParameters.deviceId = rt.getDefaultInputDevice();
iParameters.nChannels = 1;

unsigned int sampleRate = mAudio.sampleRate;

// Use a buffer of 512, we need to feed callback with 512 bytes everytime!
unsigned int nBufferFrames = 512;

RtAudio::StreamOptions options;
options.flags = RTAUDIO_SCHEDULE_REALTIME;
options.flags = RTAUDIO_NONINTERLEAVED;

//&parameters, NULL, RTAUDIO_FLOAT64,sampleRate, &bufferFrames, &mCallback, (void *)&rawData

try {
rt.openStream(&oParameters, &iParameters, RTAUDIO_SINT16, sampleRate, &nBufferFrames, &mCallback, (void*) &mAudio);
rt.startStream();
}
catch (RtAudioError& e) {
std::cout << e.getMessage() << std::endl;
return false;
}
return true;

Это было так случайно, когда я пытался воспроизвести свой микрофон. Я оставил входные параметры, и мой файл WAV неожиданно воспроизводился. Это ошибка?

0

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

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

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