군것질 후기

김재섭·2024년 8월 20일
0
post-thumbnail

컴퓨터에 연결해서 쓸 유선 헤드폰을 샀다.

스피커랑 헤드폰이랑 왔다갔다하면서 쓰고싶었고, 헤드폰 선은 계속 꽂아둔 채로 출력기기를 쉽게 전환 하고싶었다. 따로 제어판을 들어가지않고 클릭이나 키입력 한번으로 말이다..

ms스토어에 있는 프로그램인데, 이거면 생각한대로 단축키를 딸깍 누르는 것만으로 출력 기기를 바꿀 수 있었다.

그런데 디스코드에서는 선을 직접 꽂고 빼고 하는게 아닌 이상 출력기기가 바뀌지 않았다.



추측하는 이유는 이렇다.
디스코드 오디오 설정에는 Default라는 항목이 있다. 이렇게 설정해두면 윈도우에서 설정된 기본 통신장치에서 통화소리가 나게 된다.


윈도우 소리 제어판에서 기본 장치기본 통신장치 라는 두 단어를 볼 수 있었다.
위에 언급한 Audio Device Switcher는 기본장치를 바꿔주는 친구였다. 검색했을때 찾아본 프로그램들도 그랬다.
기본 통신장치는 그대로여서 노래는 스피커에서 나오고 디스코드 통화음성은 헤드폰으로 들리는 상황이라고 판단했다.


이런걸 설정하는 간단한 프로그램은 만들 수 있을것같았다.
유니티가 아니라 컴퓨터 시스템에 접근하는건 처음이어서 기대도 됐다.

작업했던 과정을 하나하나 캡쳐해두질 않아서,, 내 생각의 흐름이라도 잊어먹기 전에 적어서 남겨둘려고한다. 만드는 과정이 되게 재미있기도 했다.

처음 생각한 기능

위에 맨처음에 적었던 말 중에 "선은 계속 꽂아둔 채로" 가 있는데, 선을 아예 뽑고 꽂을때에는 기본통신장치까지 같이 잘 전환이 됐다.


이 [사용안함]을 누르게되면 선을 뽑은것과 같은 취급이 되는것 같다. 디스코드와 노래가 출력되는 기기가 잘 바뀌었다.
그래서 선이 꽂혀있기는 하지만 프로그램을 실행하면 헤드폰을 [사용안함] 으로 설정하도록 만들 수 있을것같았다.

1차 시기

  1. 비주얼스튜디오 c# 콘솔앱 프로그램으로 프로젝트를 만들었다. 이유는 평소에 콘솔앱으로 실용적인것을 만들어보고싶기도 했고, 사실 익숙한게 비주얼스튜디오 c#뿐이라서 선택했다..ㅎ

  2. 연결된 기기에 접근하려면 nuGet이라는 패키지가 필요했고, 설치 후 이것저것 구경했다.

  3. 받은 패키지의 메소드로 연결된 기기들의 목록을 쿼리로 받을 수 있었고, 기기마다 ID, Name, State 등의 여러 프로퍼티가 있었다.

  4. 그 중 State는 사용안함,사용중,연결끊김 등의 상태들이 저장돼있었다.

  5. 하지만 어떤 수를 써도 그 State를 코드로 직접 바꿔줄 수는 없었다.. 애초에 Get밖에 안되는 친구였고 set할수있는 함수도 없어보였다.

2차 시기

  1. [사용안함] 처리하는게 아니라, 상황마다 적절한 장치를 기본장치와 기본통신장치로 동시에 설정해주면 어떨까 싶었다. 스피커를사용중이면 헤드폰을 설정하고,헤드폰을사용중이면 스피커를 설정하도록.

  2. 설정하려고 쿼리문을 많이 보고쓰게 됐다. 덕분에 WMI 테스터라는것도 알게됐다.

  3. 결국 기본장치설정도 비주얼스튜디오에서 직접 바꿔줄 수 없었다. 내 능력 부족일수도 있지만.. 내가 찾아보기에는 방법이 없어보였다.

  4. 그러다 PowerShell을 사용하면 설정해줄 수 있다는걸 알게됐다!!

3차 시기

  1. PowerShell을 관리자권한으로 실행 후, Get-AudioDevice -List 를 하면 현재 연결된 오디오 장치의 리스트를 얻어올 수 있었다.
    여기서 저 Default와 DefaultCommunication이 기본장치와 기본통신장치를 뜻한다는걸 눈치로 알 수 있었다.

  2. 다음은 디바이스를 Name으로 구분해서 상황에따라 다른 기기를 기본장치와 기본통신장치로 설정하도록 해주었다.

$defaultDevice = Get-AudioDevice -List | where Default -eq $true

if ($defaultDevice.Name -eq "스피커(4- High Definition Audio Device)") {
    Get-AudioDevice -List | where Type -like "Playback" | where name -like "헤드폰(4- High Definition Audio Device)" | Set-AudioDevice -Verbose
} elseif ($defaultDevice.Name -eq "헤드폰(4- High Definition Audio Device)") {
    Get-AudioDevice -List | where Type -like "Playback" | where name -like "스피커(4- High Definition Audio Device)" | Set-AudioDevice -Verbose
} else {
    Write-Host "기본 장치를 확인할 수 없습니다."
}
  1. 너무 잘 작동했다. 일단 여기서 댄스 한사바리 제꼈다..

  2. 메모장에 .cmd파일을 작성했다. 파워쉘을 실행하고 위의 코드를 실행시키도록 만들었다. 순조로웠고, 실행파일을 누르자 컴퓨터가 나한테 뱉은 답은 아래와 같았다.

    湲곕낯 ?μ튂瑜??뺤씤?????놁뒿?덈떎.
    계속하려면 아무 키나 누르십시오 . . .

  1. 잠시 좌절했지만 내가 코드에 적었던 한글이 문제가 됐을거라 생각했다. 장치의 Name으로 식별했었기 때문에 헤드폰(4- High Definition Audio Device) 같은 한글이름이 들어가서 그랬던건데, 장치의 index로(숫자로) 식별하도록 더 간단하게 바꾸었고, 오류시 뱉을 텍스트도 영어로 바꾸었다.

  1. 실행파일이 완성됐고 잘 작동하는것을 확인했다.

물론 디스코드까지 쉽게 전환되는 프로그램이 구글에 이미 있는데 내가 못찾은것 일수도 있다. 한 10분 찾아보면 있을거같기도 하다..

게임프로그래밍이 아니라 윈도우에 접근하는게 너무 어색했고 용어나 툴부터 여러가지 어려움이 있었다.
그래도 매일먹던밥 먹다가 군것질 한번 하니까 오히려 내가 하는 일에 더 흥미가 붙은 기분이다.

진짜 재미있었다.

profile
Unity C#

0개의 댓글