因此,在阅读了一些手册并进行了一些测试之后,这就是我现在在“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 一样,我在更换设备之前暂停了播放器。如前所述,它一次有效,下一次我遇到“缓冲区丢失”错误。这意味着,没有产生错误,但输出没有改变。
由于我不确定“我的方式”在任何意义上是否正确,是否有“更安全”的方式来更换设备?
网页