Библиотека Delphi BASS - изменение устройства вывода звука во время выполнения
У меня есть mp3-плеер в Delphi. Когда проигрыватель работает, и я меняю устройство вывода звука, скажем, с линейного выхода (колонки) на Bluetooth, проигрыватель все еще "отправляет" звук на устройство линейного выхода. Когда моя Bluetooth-гарнитура подключена, и я запускаю плеер, все в порядке, и плеер "отправляет" звук на устройство Bluetooth. Но когда я отсоединяю Bluetooth-динамики / гарнитуру, плеер не воспроизводит ни одной песни, он просто пропускает каждую песню, так как они не будут "воспроизводиться".
Есть ли способ получить это удалось? Любой другой плеер, VLC, Winamp, Windows Media Player, способен обрабатывать смену устройства вывода "на лету".
Для плеера я использую Delphi XE, но думаю, что это не относится к проблеме как таковой. В то время я использую библиотеку BASS 2.4.11
Спасибо за ваши ответы заранее! MPage
2 ответа
Итак, после прочтения некоторых руководств и проведения некоторого теста, это то, что я сейчас имею в своей процедуре "MediaPause":
// Reset counter
i := 1;
// Reset device list
lstADevices.Clear;
while BASS_GetDeviceInfo(i, ADeviceInfo) do
begin
lstADevices.Add(ADeviceInfo.name);
inc(i);
end;
intDevice := -1;
for i := 0 to lstADevices.Count - 1 do
begin
if lstADevices[i] = 'Bluetooth A2DP Stereo Audio (Bose AE2w 01.02.00( Stereo ))' then
begin
intDevice := i + 1; // + 1 is important, because the list starts with 0! (for BASS 0 means 'no device')
BASS_GetDeviceInfo(intDevice, ADeviceInfo);
intFlag := ADeviceInfo.flags;
if intFlag = 67108868 then
begin
for j := 0 to lstADevices.Count - 1 do
begin
if lstADevices[j] = 'Speakers (Realtek High Definition Audio)' then
begin
intDevice := j + 1; // The list starts at 0
break;
end;
end;
end;
break;
end;
end;
BASS_Init(intDevice, 44100, 0, Application.Handle, nil);
blnBASS := BASS_ChannelSetDevice(AudioStream, intDevice);
if not blnBASS then
intBASSErrorCode := BASS_ErrorGetCode;
BASS_ChannelPlay(AudioStream, False);
Когда программа запущена и Bluetooth-гарнитура не подключена, она не будет перечислена, чтобы попасть в список устройств. Поэтому я должен перечислять устройства в любое необходимое время. Я хотел реализовать это в "счетчике тиков" для отображения времени (тиков в секундах), но из-за следующего поведения я этого еще не сделал. Я могу переключиться (BASS_ChannelSetDevice) между Bluetooth-гарнитурой и динамиками один раз. Когда я хочу / должен переключиться снова по какой-либо причине, я получаю код ошибки 4, который означает BASS_ERROR_BUFLOST (пример буфера был потерян). Я пытался найти что-нибудь по размеру буфера, но ничего не смог найти.
Я проверяю значение флага 67108868 устройства Bluetooth, потому что я не смог найти другой способ проверить, доступно устройство или нет. Если устройство Bluetooth было подключено один раз во время выполнения, оно всегда будет перечисляться, даже если впоследствии оно будет отключено. Он также имеет состояние "включено", поэтому я обнаружил только разницу в значении флага. Вставив приведенный выше код в счетчик тиков для дисплея, я смог заставить его автоматически переключать устройства с динамиков на гарнитуру, что было бы для меня "идеальным" способом, но из-за проблемы с ошибкой "потеря буфера", Я удалил его из режима счетчика тиков.
Как Виктория и Ариох. Упомянутое, я остановил плеер перед сменой устройства. Как уже упоминалось, он работает один раз, и в следующий раз я столкнулся с ошибкой "потеря буфера". Это означает, что ошибки не возникает, но вывод не изменяется.
Поскольку я не уверен, что "мой путь" верен в каком-то смысле, существует ли "более безопасный" способ замены устройств?
MPage
Да, есть способ.
Плеер AIMP точно написан на Delphi с использованием библиотеки BASS.
Если вы остановите воспроизведение, измените аудиовыход в настройках и начните воспроизведение - он отправляет музыку на вновь выбранное звуковое устройство.