2017-11-18 15 views
-2

나는 델파이에서 mp3 플레이어가 있습니다. 플레이어가 실행 중이고 오디오 출력 장치를 변경하면 (예 : 라인 출력 (스피커)에서 블루투스로) 플레이어는 여전히 사운드를 라인 출력 장치로 "보냅니다". 블루투스 헤드셋이 연결되어 있고 플레이어를 시작하면 모든 것이 정상이며 플레이어가 블루투스 장치에 사운드를 "보냅니다". 그러나 블루투스 스피커/헤드셋을 분리하면 플레이어가 아무 곡도 재생하지 않고 "재생 가능"하지 않으므로 모든 곡을 건너 뜁니다.Delphi BASS 라이브러리 - 런타임 중에 오디오 출력 장치 변경

이 방법을 사용할 수 있습니까? 다른 모든 플레이어 (VLC, Winamp, Windows Media Player)는 "즉시"출력 장치의 변경을 처리 할 수 ​​있습니다.

플레이어의 경우 델파이 XE를 사용하지만이 문제는 그 자체로는 관련이 없다고 생각합니다. 내가 BASS 라이브러리를 사용할 당시 2.4.11

미리 답변 해 주셔서 감사합니다! MPage

+0

일시 정지 재생은, (당신이 장치 정보를 열거하여 새로 선택한 기본 장치를 찾을 수 있습니다) 재생을 시작, 장치를 설정합니다. – Victoria

+0

@Victoria 출력 장치를 열거하고 설정하기위한 샘플을 보여 주시면 매우 감사하겠습니다. :-) 미리 감사드립니다. –

답변

0

예, 방법이 있습니다.

AIMP 플레이어는 정확하게 BASS 라이브러리를 사용하여 델파이로 작성되었습니다.

재생을 중지하면 환경 설정에서 오디오 출력을 변경하고 재생을 시작합니다. 새로 선택한 사운드 장치로 음악을 전송합니다.

+0

@Victoria "플레이어는 어떤 노래도 연주하지 않고 그냥 모든 노래를 건너 뜁니다."- 어떤 사람이 무엇을 의미하는지 추측하려고 시도 할 수도 있습니다. 그러나 지금은 요청하지 않았고, 제시하지 않았습니다 그의 코드는 특정 오류 및 위치를보고하지 않았으며 상식 및 SE 규칙에는 필요하지 않습니다. (추신 : 또한'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); 

프로그램이 시작되고 블루투스 헤드셋이 연결되어 있지 않은 경우, 그것은 것 장치 목록에 들어가기 위해 열거되지 않습니다. 그래서 필자는 필요한 시간에 장치를 열거해야합니다. 나는 이것을 "틱 카운터"에 구현하여 시간 (틱 초)을 표시하고 싶었지만 다음과 같은 행동 때문에 아직 그렇게하지 않았습니다. 블루투스 헤드셋과 스피커간에 (BASS_ChannelSetDevice)를 한 번 전환 할 수 있습니다. 어떤 이유로 든 다시 전환해야하기 때문에 BASS_ERROR_BUFLOST (샘플 버퍼가 손실 됨)를 의미하는 오류 코드 4가 표시됩니다. 버퍼 크기에 따라 아무것도 찾으려고했지만 아무 것도 찾을 수 없습니다.

블루투스 기기의 플래그 값 67108868을 확인합니다. 기기를 사용할 수 있는지 여부를 확인할 수있는 방법이 없습니다. 블루투스 장치가 런타임 중에 한 번 연결되면 나중에 연결이 끊어진 경우에도 항상 열거됩니다. 또한 "사용 가능"상태이기 때문에 플래그 값의 차이 만 발견했습니다. 디스플레이의 틱 카운터에 위의 코드를 넣으면 자동으로 스피커에서 헤드셋으로 장치를 변경할 수 있습니다. 이는 "완벽한"방법이 될 수 있지만 "버퍼가 손실되었습니다"오류로 인해 발생합니다 , 진드기 카운터 루틴에서 제거했습니다.

Victoria와 Arioch처럼 '언급 한대로 기기를 변경하기 전에 플레이어를 일시 중지했습니다. 언급 한 바와 같이, 그것은 한 번 작동하고 다음에 "버퍼가 손실되었습니다"오류가 발생합니다. 즉, 생성 된 오류가 없지만 출력은 변경되지 않습니다.

'내 방식'이 올바른지 확실하지 않으므로 기기를 변경하는 '안전한 방법'이 있습니까?

MPage

+0

버퍼에 따라 뭔가를 찾을 수 있었고이 코드를 코드에 포함 시켰습니다 : 이전처럼, 장치를 한 번만 변경할 수 있습니다. 그런 다음 다시 "버퍼 분실"상황에 빠지게됩니다. BASS_SetConfig (BASS_CONFIG_BUFFER, 5000); –