В настоящее время я подключил к компьютеру устройство, которое отправляет мне аудиоданные с микрофона/дорожки воспроизведения. Я уже создал хост-приложение с использованием Steinberg ASIO SDK 2.3, которое подключается к устройству и при повторяющемся обратном вызове возвращает необработанные данные. Сигнал 24-битный, а частоту можно выбрать любую, скажем, 44100 Гц, 2 панорамы, один канал. Я также преобразовал этот сигнал в двойной , поскольку я выполняю над ним некоторую обработку сигнала.
Теперь я хотел бы добавить на свой хост функцию записи. Например, при нажатии кнопки входящие данные постоянно преобразуются в файл WAV, а когда я нажимаю другую кнопку, они останавливаются и сохраняются.
Я уже читал о файлах WAV, форматах файлов, форматах битового потока (RIFF) и каким-то образом имею общее представление о том, как выглядит файл WAV. Я также проверил множество тем форума, тем stackoverflow или сообщений о проектах кода, и везде я нахожу что-то связанное с темой, но не могу понять, как я могу осуществлять постоянную запись в реальном времени. Много кода, который я нашел, посвящено преобразованию массива данных в WAV после внесения в него изменений. Я хотел бы осуществлять постоянное преобразование и добавлять/расширять WAV-файлы до тех пор, пока я не прикажу ему остановиться.
Например, могу ли я как-то это изменить?
Код: Выделить всё
#include
template
void write(std::ofstream& stream, const T& t) {
stream.write((const char*)&t, sizeof(T));
}
template
void writeFormat(std::ofstream& stream) {
write(stream, 1);
}
template
void writeFormat(std::ofstream& stream) {
write(stream, 3);
}
template
void writeWAVData(
char const* outFile,
SampleType* buf,
size_t bufSize,
int sampleRate,
short channels)
{
std::ofstream stream(outFile, std::ios::binary);
stream.write("RIFF", 4);
write(stream, 36 + bufSize);
stream.write("WAVE", 4);
stream.write("fmt ", 4);
write(stream, 16);
writeFormat(stream); // Format
write(stream, channels); // Channels
write(stream, sampleRate); // Sample Rate
write(stream, sampleRate * channels * sizeof(SampleType)); // Byterate
write(stream, channels * sizeof(SampleType)); // Frame size
write(stream, 8 * sizeof(SampleType)); // Bits per sample
stream.write("data", 4);
stream.write((const char*)&bufSize, 4);
stream.write((const char*)buf, bufSize);
}
Код: Выделить всё
writeWAVData("mySound.wav", mySampleBuffer, mySampleBufferSize, 44100, 1);
Подробнее здесь: https://stackoverflow.com/questions/282 ... -real-time
Мобильная версия