Запись онлайн радио

addedie

Я таким никогда не занимался, но что-то попадалось по данной теме.

Звук с выхода в терминологии microsoft вроде бы именуется "loopback". В WASAPI (это один из программных интерфейсов для управления звуком в windows) есть раздел посвящённый подобной записи (

Loopback Recording

). В этом разделе говорится о том, что подобная запись не всегда доступна. Режим должен быть заложен аппаратно в устройстве отвечающее за работу со звуком (отдельная звуковая плата или встроенный чипсет). Так же в этом разделе говорится, что подобная запись может быть доступна и через устаревшие функции waveAPI, как я понимаю, нужно только выбрать правильное устройство (

You can also use a legacy audio API, such as the Windows multimedia waveInXxx functions, to capture the stream from the device

).

У вас в коде есть цикл перебирающий все устройства. Открывать их все конечно не нужно, это не правильно, после цикла хенд устройства будет соответствовать последнему открытому устройству, а все остальные просто потеряются. Вместо открытия можно попытаться получить информацию по каждому устройству (

waveInGetDevCaps

). Среди возвращаемой информации есть текстовое имя устройства, можно посмотреть, нет ли среди устройств устройства с именем содержащим "loopback". Если такое устройство есть, то открыть данное устройство по его индексу и дальше работать с ним.

Только сейчас заметил, что и код записи у вас неправильный. Можно найти более правильный вариант. Работа со звуковым драйвером в WaveAPI ведётся через буфера. При записи драйвер заполняет буфер и сообщает программе, что буфер готов. Сообщать программе драйвер может разными способами с помощью ивентов, оконными сообщениями или колбек-функций. Вы выбрали колбек, но этого не достаточно. При любом варианте оповещения о готовности буфера эти буфера нужно готовить самому и отдавать их драйверу (

waveInAddBuffer

). Драйвер заполняет пользовательские буфера и уведомляет о их готовности. Обычно перед стартом драйверу отдают два буфера. Он заполняет первый, сообщает об этом программе и переключается на заполнение второго буфера. Программа должна обработать первый буфер и заново его отдать драйверу. Драйвер заполнит второй буфер, уведомит программу и перейдёт к заполнению первого буфера. И так далее, буфера чередуются до завершения записи. Очень короткое изложение сказанного выше

Managing Waveform-Audio Recording