所以,閱讀一些手冊,並做了一些測試,這是我現在在我的「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 如果您可以向我展示枚舉和設置輸出設備的示例,我們將非常感激。 :-) 非常感謝提前! –