-2

我在 Delphi 有一个 mp3 播放器。当播放器正在运行并且我更改音频输出设备时,例如从线路输出(扬声器)到蓝牙,播放器仍将声音“发送”到线路输出设备。当我的蓝牙耳机连接并启动播放器时,一切都很好,播放器将声音“发送”到蓝牙设备。但是当我断开蓝牙扬声器/耳机时,播放器不会播放任何歌曲,它只是跳过每首歌曲,因为它们不会“可播放”。

有没有办法得到这个管理?其他所有播放器,VLC、Winamp、Windows Media Player,都能够“即时”处理输出设备的变化。

对于我使用 Delphi XE 的播放器,但我认为这与问题本身无关。当时我使用 BASS 库 2.4.11

提前感谢您的回答!网页

4

2 回答 2

0

是的,有办法。

AIMP 播放器完全是使用 BASS 库用 Delphi 编写的。

如果您停止播放,请更改首选项中的音频输出并开始播放 - 它会将音乐发送到新选择的声音设备。

于 2017-11-18T14:41:50.730 回答
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);

程序启动时,未连接蓝牙耳机时,不会枚举进入设备列表。所以我必须在任何必要的时候枚举设备。我想将此实现到“滴答计数器”中以显示时间(以秒为单位的滴答声),但由于以下行为,我还没有这样做。我可以在蓝牙耳机和扬声器之间切换(BASS_ChannelSetDevice)一次。当我想/必须再次切换时,无论出于何种原因,我都会收到错误代码 4,这意味着 BASS_ERROR_BUFLOST(样本缓冲区丢失)。我试图根据缓冲区大小找到任何东西,但找不到任何东西。

我检查了蓝牙设备的标志值 67108868,因为我找不到任何其他方法来检查设备是否可用。如果蓝牙设备在运行时连接过一次,即使之后断开连接,它也会一直被枚举。它也有“启用”状态,所以我只发现了标志值的差异。将上面的代码打包到显示器的刻度计数器中,我可以设法将设备从扬声器自动更改为耳机,这对我来说是“完美”的方式,但由于“缓冲区丢失”错误的问题,我从滴答计数器例程中删除了它。

和 Victoria 和 Arioch 一样,我在更换设备之前暂停了播放器。如前所述,它一次有效,下一次我遇到“缓冲区丢失”错误。这意味着,没有产生错误,但输出没有改变。

由于我不确定“我的方式”在任何意义上是否正确,是否有“更安全”的方式来更换设备?

网页

于 2017-11-20T18:42:30.170 回答