2017-11-18 30 views
-2

私はDelphiでmp3プレーヤーを持っています。 プレーヤーが動作していて、オーディオ出力デバイスを変更すると、ライン出力(スピーカー)からブルートゥースに変わっても、プレーヤーは引き続きサウンドをライン出力デバイスに「送信」します。 私のBluetoothヘッドセットが接続されていて、プレイヤーが起動すると、すべてが正常で、プレイヤーはそのサウンドをBluetoothデバイスに「送信」します。しかし、私は、Bluetoothのスピーカー/ヘッドセットを切断すると、プレーヤーはすべての曲を再生しない、それは単に "再生"されませんようにすべての曲をスキップします。Delphi BASSライブラリ - 実行時にオーディオ出力デバイスを変更します。

これを管理する方法はありますか? 他のすべてのプレーヤー、VLC、Winamp、Windows Media Playerは、出力デバイスの変更を「オンザフライ」で処理できます。私は、Delphi XEを使用しますが、私は、これは、それ自体として問題に関係ないと思うプレーヤーのために

。私は事前にBASSライブラリーにあなたの答えのための2.4.11

感謝を使う時には ! MPAGE

+0

一時停止再生は、(あなたは、デバイス情報を列挙することにより、新たに選択したデフォルトのデバイスを見つけることができます)再生を開始し、デバイスを設定します。 – Victoria

+0

@Victoria 出力デバイスを列挙して設定するサンプルを私に見せていただければ幸いです。 :-) 事前に感謝します! –

答えて

0

はい、方法があります。

AIMPプレーヤーはBASSライブラリを使用して正確にDelphiで書かれています。

あなたが再生を停止した場合、好みのオーディオ出力を変更し、再生を開始 - それは、新たに選択されたサウンドデバイスに音楽を送信します。

+0

@Victoria「プレイヤーはどの曲も演奏しない、それはすべての曲をスキップする」 - あなたはどんな男が何を意味しているかを推測しようとするかもしれないし、彼のために選手を育てるかもしれないが、今のところ、彼のコードは、特定のエラーと位置を報告していません - 常識とSEのルールが必要とするものは何もありません。 (PS: 'SetChannelDevice'関数もあります。さらに、入力チャンネルのデカップリングと出力シンクの管理を仮想チャンネルで行うことができます)。 –

+0

お返事ありがとうございました! @Arioch 'The エラーがないので、コードを「提示」しませんでした。プレーヤーがファイルをスキップする理由は、出力デバイスが利用できない場合です。だから、私が "デバイス出力変更機能"を実装することができれば、すべてがうまくいくでしょう。 はい、あなたの答えのうち、私はそれが可能であることがわかります。 :-) まだ出力デバイスを変更する必要はありませんでした。 出力デバイスをスキャンして設定するルーチンが必要なことがわかりました。 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); 

プログラムが開始されるとBluetoothヘッドセットが接続されていない場合、それは意志デバイスリストに入るために列挙されません。だから私はいつも必要な時にデバイスを列挙しなければならない。私は時間(秒単位のティック)を表示するためにこれを "チックカウンタ"に実装したかったのですが、次の動作のために私はまだそれをしませんでした。 Bluetoothヘッドセットとスピーカーの間で(BASS_ChannelSetDevice)を一度切り替えることができます。何らかの理由で、私が再度切り替えたい/しなければならないとき、私はBASS_ERROR_BUFLOSTを意味するエラーコード4を得る(サンプルバッファーが失われた)。 バッファサイズに応じて何かを見つけようとしましたが、何も見つかりませんでした。私は、デバイスが利用可能であるかどうかをチェックするために、他の方法を見つけることができなかったので

私は、Bluetoothデバイスのフラグ値67108868を確認してください。 Bluetoothデバイスがランタイム中に一度だけ接続されている場合は、後で切断されても常に列挙されます。それはまた、 "有効"状態を持っているので、私はフラグ値の違いを発見しただけです。 ディスプレイのティックカウンターに上記のコードを梱包して、デバイスをスピーカーからヘッドセットに自動的に変更することができました。これは、「完璧な」方法ですが、「バッファーが失われました」という問題が原因です私はティックカウンタのルーチンから削除しました。言及したビクトリアとアリオク「のような

は、私がデバイスを変更する前に、プレーヤーを一時停止しました。言及したように、それは一度動作し、次回には "バッファが失われました"というエラーに遭遇します。つまり、エラーは発生しませんが、出力は変更されません。

"私の方法"が正しいかどうかわからないので、デバイスを変更する "より安全な"方法がありますか?

MPAGE

+0

私はバッファに応じて何かを見つけることができ、この行をコードに入れました: 以前と同じように、デバイスを1回だけ変更することができます。次に、「バッファーが失われました」という状況に戻ります。 –

関連する問題