오디오 장치 선택
Windows에서는 PlanetKit의 AudioManager를 사용하여 1대1 통화와 그룹 통화의 마이크와 스피커 장치를 조회하고 선택할 수 있습니다.
| 지원 통화 유형 | 최소 SDK 버전 |
|---|---|
| 1대1 통화, 그룹 통화(컨퍼런스) | PlanetKit 6.0 |
PlanetKit은 초기 상태에서 마이크와 스피커를 선택하지 않습니다. Windows 기본 장치는 별도로 조회할 수 있으며, Windows 기본 장치가 바뀌어도 PlanetKit에서 이미 선택한 장치가 자동으로 교체되지는 않습니다.
오디오 매니저 인스턴스 가져오기
PlanetKit을 초기화한 다음 PlanetKitManager의 GetAudioManager()를 호출하여 AudioManager 인스턴스를 가져오세요.
auto pAudioManager = PlanetKit::PlanetKitManager::GetInstance()->GetAudioManager();
사용 가능한 장치 조회
현재 활성화된 마이크와 스피커를 조회하려면 별도의 AudioDeviceInfoArray를 전달하여 GetMicList()와 GetSpeakerList()를 호출하세요. 각 목록을 사용하기 전에 해당 호출의 반환값을 확인하세요. 장치의 ID, 이름, 유형을 확인하려면 해당 AudioDeviceInfo에서 GetID(), GetName(), GetDeviceType()을 호출하세요.
PlanetKit::AudioDeviceInfoArray microphones;
PlanetKit::AudioDeviceInfoArray speakers;
if (pAudioManager->GetMicList(microphones)) {
for (size_t i = 0; i < microphones.Size(); ++i) {
auto device = microphones.At(i);
std::wcout << L"Microphone: " << device->GetName().c_str()
<< L" (" << device->GetID().c_str() << L")" << std::endl;
}
}
if (pAudioManager->GetSpeakerList(speakers)) {
for (size_t i = 0; i < speakers.Size(); ++i) {
auto device = speakers.At(i);
std::wcout << L"Speaker: " << device->GetName().c_str()
<< L" (" << device->GetID().c_str() << L")" << std::endl;
}
}
현재 선택된 장치 확인
현재 선택된 장치를 확인하려면 GetCurrentMic()를 호출해 MicOptional을, GetCurrentSpeaker()를 호출해 SpeakerOptional을 가져오세요. 선택된 장치에 접근하기 전에 HasValue()를 확인하세요. 장치 목록에서 선택한 마이크나 스피커의 AudioDeviceInfo를 확인하려면 GetDeviceInfo()를 호출하세요.
auto currentMic = pAudioManager->GetCurrentMic();
if (currentMic.HasValue()) {
auto info = currentMic.Value()->GetDeviceInfo();
if (info) {
std::wcout << L"Current microphone: " << info->GetName().c_str() << std::endl;
}
}
auto currentSpeaker = pAudioManager->GetCurrentSpeaker();
if (currentSpeaker.HasValue()) {
auto info = currentSpeaker.Value()->GetDeviceInfo();
if (info) {
std::wcout << L"Current speaker: " << info->GetName().c_str() << std::endl;
}
}
값이 없는 optional은 해당 용도로 선택된 장치가 없음을 의미합니다.
장치 선택
해당 목록에서 가져온 AudioDeviceInfoPtr를 ChangeMic() 또는 ChangeSpeaker()에 전달하세요. 각 메서드는 성공하면 선택된 마이크 또는 스피커를 반환하고, 실패하면 값이 없는 optional을 반환합니다.
PlanetKit::AudioDeviceInfoArray microphones;
if (pAudioManager->GetMicList(microphones) && microphones.Size() > 0) {
auto selectedMic = pAudioManager->ChangeMic(microphones.At(0));
if (!selectedMic.HasValue()) {
std::wcerr << L"Could not select microphone" << std::endl;
}
}
PlanetKit::AudioDeviceInfoArray speakers;
if (pAudioManager->GetSpeakerList(speakers) && speakers.Size() > 0) {
auto selectedSpeaker = pAudioManager->ChangeSpeaker(speakers.At(0));
if (!selectedSpeaker.HasValue()) {
std::wcerr << L"Could not select speaker" << std::endl;
}
}
스피커 정보를 ChangeMic()에 전달하거나 마이크 정보를 ChangeSpeaker()에 전달하면 요청이 실패하고 기존 선택은 유지됩니다. 진행 중인 통화나 컨퍼런스에서 교체할 장치를 시작할 수 없으면 메서드는 값이 없는 optional을 반환하고 해당 용도의 장치 선택도 해제됩니다.
Windows 기본 장치 선택
Windows의 멀티미디어 역할 기본 장치를 조회하려면 GetDefaultMicInfo()와 GetDefaultSpeakerInfo()를 호출하세요. 이 호출만으로는 현재 선택이 변경되지 않습니다. 기본 장치를 선택하려면 반환된 장치를 해당 변경 메서드에 전달하세요.
auto defaultMic = pAudioManager->GetDefaultMicInfo();
if (defaultMic.HasValue()) {
auto selectedMic = pAudioManager->ChangeMic(defaultMic.Value());
}
auto defaultSpeaker = pAudioManager->GetDefaultSpeakerInfo();
if (defaultSpeaker.HasValue()) {
auto selectedSpeaker = pAudioManager->ChangeSpeaker(defaultSpeaker.Value());
}
Windows 기본 장치 변경 알림은 콘솔 역할 기본 장치를 전달합니다. 따라서 알림에서 받은 장치가 위 조회 메서드에서 반환된 멀티미디어 역할 기본 장치와 다를 수 있습니다.
장치 선택 해제
마이크 또는 스피커의 선택을 해제하려면 ChangeMic() 또는 ChangeSpeaker()를 인자 없이 호출하세요. 이는 음 소거와 별개이며 Windows 기본 장치를 선택하는 동작도 아닙니다.
pAudioManager->ChangeMic();
pAudioManager->ChangeSpeaker();
호출 후에는 해당 GetCurrentMic() 또는 GetCurrentSpeaker()의 결과에 값이 없습니다.
통화 시작 시 마이크 선택
PlanetKitManager의 MakeCall(), VerifyCall(), JoinConference()로 통화나 컨퍼런스를 시작할 때 MicOptional 인자를 전달하세요. 앞에서 선택한 마이크를 사용하려면 GetCurrentMic()의 결과를 전달하세요. NullOptional을 전달하면 PlanetKit은 이전에 선택한 마이크를 해제하고 마이크 없이 통화를 시작합니다. 마이크 없이 통화나 컨퍼런스를 유지하려면 해당 시작 파라미터에서 SetAllowCallWithoutMic(true) 또는 SetAllowConferenceWithoutMic(true)를 설정하세요.
장치 변경 감지
IAudioDeviceEvent를 구현하고 RegisterAudioDeviceEvent()를 통해 등록하면 장치 추가, 제거 및 Windows 기본 장치 변경을 알 수 있습니다. 각 콜백은 장치 ID와 입력, 출력 유형을 포함한 장치 정보를 전달합니다.
class AudioDeviceObserver : public PlanetKit::IAudioDeviceEvent {
public:
void OnDefaultAudioDeviceChanged(PlanetKit::AudioDeviceInfoPtr device) override {
if (device) {
std::wcout << L"Default device changed: " << device->GetID().c_str() << std::endl;
}
}
void OnAudioDeviceAdded(PlanetKit::AudioDeviceInfoPtr device) override {
if (device) {
std::wcout << L"Device added: " << device->GetID().c_str() << std::endl;
}
}
void OnAudioDeviceRemoved(PlanetKit::AudioDeviceInfoPtr device) override {
if (device) {
std::wcout << L"Device removed: " << device->GetID().c_str() << std::endl;
}
}
};
AudioDeviceObserver observer;
bool registered = pAudioManager->RegisterAudioDeviceEvent(&observer);
등록한 동안에는 observer 객체를 유지하고, 객체를 해제하기 전에 DeregisterAudioDeviceEvent()를 호출하세요. 다른 오디오 장치 리스너가 이미 등록되어 있으면 등록이 실패합니다. 선택된 장치가 제거되면 PlanetKit은 OnAudioDeviceRemoved()를 호출하기 전에 해당 선택을 해제합니다. 필요한 경우 현재 장치를 조회하고 다른 장치를 선택하세요.
관련 API
오디오 장치 선택과 관련된 API는 다음과 같습니다.
클래스
-
PlanetKitManager -
AudioManager -
AudioDeviceInfo -
Mic -
Speaker -
MakeCallParam -
VerifyCallParam -
ConferenceParam -
IAudioDeviceEvent
메서드
-
PlanetKitManager::GetAudioManager() -
PlanetKitManager::MakeCall() -
PlanetKitManager::VerifyCall() -
PlanetKitManager::JoinConference() -
AudioManager::GetMicList() -
AudioManager::GetSpeakerList() -
AudioManager::GetCurrentMic() -
AudioManager::GetCurrentSpeaker() -
AudioManager::ChangeMic() -
AudioManager::ChangeSpeaker() -
AudioManager::GetDefaultMicInfo() -
AudioManager::GetDefaultSpeakerInfo() -
AudioManager::RegisterAudioDeviceEvent() -
AudioManager::DeregisterAudioDeviceEvent() -
AudioDeviceInfo::GetID() -
AudioDeviceInfo::GetName() -
AudioDeviceInfo::GetDeviceType() -
Mic::GetDeviceInfo() -
Speaker::GetDeviceInfo() -
MakeCallParam::SetAllowCallWithoutMic() -
VerifyCallParam::SetAllowCallWithoutMic() -
ConferenceParam::SetAllowConferenceWithoutMic()