2017-11-18 531 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); 但是,和以前一樣,我只能更換一次設備,然後再次遇到「緩衝區丟失」的情況。 –

相關問題