我在Delphi中有一个mp3播放器。 当播放器运行并且我更换音频输出设备时,例如从线路输出(扬声器)到蓝牙,播放器仍然将“声音”发送到线路输出设备。 当我的蓝牙耳机连接并启动播放器时,一切都很好,播放器将声音“发送”到蓝牙设备。但是当我断开蓝牙音箱/耳机时,播放器不播放任何歌曲,它只是跳过每首歌曲,因为它们不会“可播放”。
有没有办法让这个管理? 其他所有播放器,VLC,Winamp,Windows Media Player都能够“即时”处理输出设备的更改。
对于我使用Delphi XE的播放器,但我认为这与问题本身无关。 当时我使用BASS库2.4.11
提前感谢您的回答! M页面
答案 0 :(得分:0)
是的,有办法。
AIMP播放器完全用Delphi编写,使用BASS库。
如果您停止播放,请在偏好设置中更改音频输出并开始播放 - 它会将音乐发送到新选择的声音设备。
答案 1 :(得分:0)
因此,在阅读了一些手册并进行了一些测试之后,这就是我现在所拥有的" 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);
当程序启动且未连接蓝牙耳机时,将不会枚举进入设备列表。所以我必须在任何必要的时间枚举设备。我想把它实现到" tick counter"用于显示时间(以秒为单位的刻度),但由于以下行为,我还没有这样做。 我可以在蓝牙耳机和扬声器之间切换一次(BASS_ChannelSetDevice)。当我想要/必须再次切换时,无论出于何种原因,我得到错误代码4,这意味着BASS_ERROR_BUFLOST(样本缓冲区丢失)。 我试图根据缓冲区大小找到任何东西,但无法找到任何东西。
我检查了蓝牙设备的标志值67108868,因为我找不到任何其他方法来检查设备是否可用。 如果蓝牙设备在运行时已经连接过一次,那么即使它在之后断开连接也会被枚举。它还具有"启用"状态,所以我只发现了标志值的差异。 将上述代码打包到显示器的刻度计数器中我可以设法将设备从扬声器自动更改为耳机,这将是完美的"我的方式,但由于"缓冲区丢失的问题"错误,我从滴答计数器例程中删除了它。
就像维多利亚和Arioch'提到的那样,我在更换设备之前暂停了播放器。如上所述,它可以工作一次,下次我遇到"缓冲区丢失"错误。这意味着,没有产生错误,但输出没有改变。
因为我不确定是否"我的方式"在任何意义上都是正确的,是否有更安全的"改变设备的方法?
M页面