所以,阅读一些手册,并做了一些测试,这是我现在在我的“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,因为我找不到任何其他方式来检查设备是否可用。 如果蓝牙设备在运行时期间连接过一次,即使之后断开连接,它也会一直枚举。它也有“启用”状态,所以我只发现了标志值的差异。 将上面的代码包装到显示屏的滴答计数器中,我可以自动将设备从扬声器更改为耳机,这对我来说是“完美”的方式,但由于“缓冲区丢失”错误的问题,我从滴答计数器例程中删除它。
就像维多利亚和Arioch'提到的,我在更换设备之前暂停了播放器。就像上面提到的那样,它会工作一次,下一次我遇到“缓冲区丢失”错误。这意味着,没有错误产生,但输出没有改变。
由于我不确定在任何意义上“我的方式”是否正确,是否有“更安全”的方式来更换设备?
MPage
暂停播放,设置设备,开始播放(您可以通过枚举设备信息找到新选择的默认设备)。 – Victoria
@Victoria 如果您可以向我展示枚举和设置输出设备的示例,我们将非常感激。 :-) 非常感谢提前! –