2017-11-18 461 views
-2

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

有没有办法让这个管理?每个其他玩家,VLC,Winamp和Windows Media Player都能够“即时处理”输出设备的变化。

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

感谢您提前给出答案! MPage

+0

暂停播放,设置设备,开始播放(您可以通过枚举设备信息找到新选择的默认设备)。 – Victoria

+0

@Victoria 如果您可以向我展示枚举和设置输出设备的示例,我们将非常感激。 :-) 非常感谢提前! –

回答

0

是的,有办法。

AIMP播放器正是用Delphi编写的BASS库。

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

+0

@Victoria“玩家不会播放任何歌曲,它只是跳过每首歌曲” - 您可以尝试猜出他的意思,甚至为他开发球员,但截至目前他没有要求,没有提交他的代码没有报告具体的错误和位置 - 没有什么常识和SE规则要求。 (PS:还有'SetChannelDevice'功能,另外一个可以使虚拟通道解耦输入解包和输出接收管理,如果你愿意,可以为他开发一个例子) –

+0

谢谢你的答案! @Arioch' 由于没有错误,我没有“提供”代码。播放器跳过文件的原因是输出设备不可用时。所以,如果我可以实现“设备输出更改功能”,那么一切都会好起来的。 是的,出于你的回答,我可以看到,这是可能的。 :-) 我从来没有必要改变输出设备。 现在我明白了,我需要一个例程来扫描和设置输出设备。 MPage –

+0

@XingFuZhuanYun没关系,没有错误。你说你的代码不能像你期望的那样工作:显示你的代码,这样人们可能会告诉你它是否有问题或替代方案。 –

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

就像维多利亚和Arioch'提到的,我在更换设备之前暂停了播放器。就像上面提到的那样,它会工作一次,下一次我遇到“缓冲区丢失”错误。这意味着,没有错误产生,但输出没有改变。

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

MPage

+0

我可以根据缓冲区找到一些东西,并在代码中包含这一行: BASS_SetConfig(BASS_CONFIG_BUFFER,5000); 但是,和以前一样,我只能更换一次设备,然后再次遇到“缓冲区丢失”的情况。 –

相关问题