윈도우에서 디폴트 사운드 장치를 선택하는 방법은 제어판을 통한 방법 밖에 없습니다
MS에서 그런 API를 제공했다간 사운드카드 만드는 회사들이 경쟁적으로 자기들 카드를 디폴트 사운드장치로
설정하려는 사태가 벌어지겠죠. 여러 사운드장치 중 하나로 웨이브 데이타가 출력되게 할수는 있어도 시스템 디폴트
사운드장치를 선택해주는 API는 없습니다.
해결 방법은 비스타 이후 COM으로 바뀐 윈도우 오디오 아키텍쳐를 리버스엔지니어링으로 해킹하는 방법 밖에는 없습니다.
COM은 일반적인 API처럼 노출되는게 아니라 해킹하기도 쉽지 않습니다. 그럼에도 불구하고 정 필요하고 패이 조건이 맞으면
리버스엔지니어링으로 해킹해 드릴 수는 있습니다
하두고 님이 쓰신 글 :
: 앞에서 했던 질문인데 시원한 답변이 없어 여기 저기 돌아다니며 찾은 소스코드입니다.
: 아래 소스코드는 피시에 장착된 사운드장치를 나열하는 소스코드인데요.
:
: 아래 소스에서 나열된 사운드장치를 선택하여 더블클릭하면
: 해당 사운드장치가 윈도우 기본 사운드장치로 바뀌게 하고 싶은데요.
:
: 기본 사운드 장치를 바꾸는 방법을 모르겠습니다.
:
: procedure TForm1.EnumAudioDevices;
: var
: dsCreateDevEnum : ICreateDevEnum;
: EnumDevice : IEnumMoniker;
: DeviceMoniker : IMoniker;
: Data : Integer;
: DevicePropBag : IPropertyBag;
: DeviceName : OLEVariant;
: begin
: If CoCreateInstance(CLSID_SystemDeviceEnum,nil,CLSCTX_INPROC_SERVER,IID_ICreateDevEnum,dsCreateDevEnum) = S_OK then
: Begin
: If dsCreateDevEnum.CreateClassEnumerator(CLSID_AudioRendererCategory,EnumDevice,0) = S_OK then
: Begin
: EnumDevice.Reset;
: While EnumDevice.Next(1,DeviceMoniker,@Data) = S_OK do
: Begin
: If DeviceMoniker.BindToStorage(nil,nil,IID_IPropertyBag,DevicePropBag) = NOERROR then
: Begin
: If DevicePropBag.Read('FriendlyName',DeviceName,nil) = NOERROR then
: IF Copy(DeviceName, 1, Length('DirectSound')) = 'DirectSound' Then
: ListBox1.Items.Add(Copy(DeviceName, Length('DirectSound: ') + 1, Length(DeviceName) - Length('DirectSound: ')));
: DevicePropBag := nil;
: End;
: DeviceMoniker := nil;
: End;
: EnumDevice := nil;
: End;
: dsCreateDevEnum := nil;
: End;
: End;
|