그래서, 약간의 설명서를 읽고 몇 가지 테스트를 수행 한 후,이 내가 루틴 내 "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
일시 정지 재생은, (당신이 장치 정보를 열거하여 새로 선택한 기본 장치를 찾을 수 있습니다) 재생을 시작, 장치를 설정합니다. – Victoria
@Victoria 출력 장치를 열거하고 설정하기위한 샘플을 보여 주시면 매우 감사하겠습니다. :-) 미리 감사드립니다. –