그동안 리눅스의 오디오서버는 Pulse였습니다.

제글을 오래전부터 보셨다면 Pulse에 대해 욕을 한가득 했던적이 있습니다만 그건 아직 Pulse가 안정화 되기 전이었고 Pulse를 쓰는 프로그램보다 ALSA에 직접 접근해서 쓰는 프로그램이 많았기에 ALSA-Pulse-ALSA라는 요상한구조로 딜레이가 심했거든요.
OSS-ALSA-PULSE-ALSA라는 더 심각한구조도 있었고요.

그러나 지금은 Pulse를 아주 잘 쓰고 있습니다. 믹싱과 리샘플을 잘 해주고 있고 이젠 Pulse를 쓰는게 기본이라 쓰는데 지장이 없습니다. 딜레이도 충분히 없어졌고요.

그런데 Pipewire라는게 코로나가 한창이던 시기에 등장합니다. 이건 뭔가 싶었는데 pulse를 대체할 또다른 오디오 서버라고 합니다.

근데 저는 이젠 늙은이라(...) 쉽게 못 바꾸겠더군요. 그래서 Pulse에 눌러앉았는데 지금시점(2026년)에는 Pulse가 쫓겨나고 Pipewire가 거의 대부분 배포판에 적용되었습니다. 그 이유는 간단하게도 "Pipewire가 더 효율적이고 Pulse인터페이스도 잘 된다." 라는 것이었지요.

왠지 Pulse의 초창기 모습은 보는것 같은데 JACK쓰는 사람들도 Pipewire에 만족한다고 합니다.
바꾸는것도 쉽다고 하네요.

pipewire와 pipewire-pulse패키지만 설치하세요. 전환과 호환 모든게 끝납니다. 이젠 바뀌어야 할 시기!

,

요즘 스마트폰은 3.5단자가 없지요.
그래서 보통은 무선이어폰을 쓰거나 C타입 이어폰을 사용해서 이어폰을 사용합니다.

그런데 이미 3.5단자가 달린 제 귀에맞는 이어폰이 있다면 많이 아쉽습니다. 개인적으로는 비싼건 아니지만 제 귀에 꼭 맞는 이어폰이 있는데 3.5단자라 요즘 스마트폰에서는 쓸 수가 없습니다.

저 처럼 이미 쓸만한 유선 이어폰이 있다면 요즘 스마트폰은 많이 아쉬운건 사실입니다.

그래서 다이소등지에선 싼가격에 기존 C타입포트에서 3.5단자를 만드는 제품을 팔고있습니다. 가격도 다이소스럽게 저렴하지요.

그래서 좋다고 바로 연결했는데 음질은 다이소인걸 감안하면 그냥 저냥 씁니다. 시중에 파는 저가형 USB사운드카드 생각하면 될 정도입니다.

그런데 이게 소리가 좀 작아지거나 하면 소리가 툭툭 끊깁니다. 저만 그런것도 아니고  많은분들이 해당증상을 호소하더군요.

대충 확인해보니 해당 젠더에는 디지털신호를 아날로그로 변환하는 DAC칩이 상당히 안 좋은 것이 들어가서 꼼수를 썼는데 배터리를 집어먹는 문제로 인해 사운드신호가 기준보다 작으면 DAC의 전원을 끈다고 합니다. 문제는 다시 DAC가 켜질때까지 딜레이가 있다보니 소리가 툭툭 끊기는거죠. 가격 생각하면 이해가 되는군요. 만약 좋은 이어폰에 이런 구린거 낄거면 그냥 쓰지 말라고 하더군요. 대신 삼성에서 만든 정품 젠더를 쓰면 한방에 해결된다고 합니다.
(애플젠더도 쓰면 안된다고 합니다. 애플은 다이소보단 낫지만 저가칩셋 박아서 비싸게 팔기때문에 아이폰도 삼성제품을 쓰라는군요. 2026년 현재는 삼성제품이 단종된 관계로 애플 제품이 더 낫다고 하네요. 아이폰은 그냥 애플꺼 쓰세요.)

하지만 어차피 음질보단 귀가 편해야하는 저로서는 이어폰보다 비싼 젠더를 쓰기엔 돈이 아까웠습니다.

그래서 대충 생각해봤는데 소리가 작아지면 끊기는 것이니 소리를 꾸준히 낸다면 DAC가 계속 켜진다는 것이고 끊김현상이 사라진다는 의미가 됩니다.

어차피 제 귀는 막귀이고 들리기만하면 장땡이기 때문에 귀에 거슬리지 않을 소리를 섞어준다면 별문제 없지 않을까 싶더군요.

https://play.google.com/store/apps/details?id=com.boedec.hoel.frequencygenerator

주파수 발생기 - Google Play 앱

오디오 주파수, 이명박동, 소음을 실험하고 나만의 사운드를 만들어 보세요.

play.google.com


그래서 이걸 써먹기로 했습니다.
일단 사람의 귀에 대해 이야기하자면 사람의  귀는 약 20Hz부터 22000Hz까지의 소리만 들을 수 있습니다.

그리고 나이를 먹으면서 18000Hz 이하로 가청영역이 줄어들게 됩니다. 반대로 20Hz이하의 저음부의 경우는 못 듣는건 아니지만 사람이 피부로 느끼는게 더 크기 때문에 역시 귀로는 잘 못 듣습니다.

특히 흔들리는 차에서 들으면 저음부는 거의 귀로는 못 느낀다고 보시면 됩니다.

그렇다면 사람이 못 듣는 24000Hz이상의 초음파나 20Hz이하의 저음을 이어폰을 향해 계속 쏴준다면? DAC는 계속해서 켜있을 것이고 끊김현상이 사라진다는 의미가 됩니다.

그래서 저 앱이 하는건 무엇이냐면 특정 주파수의 소리를 생성 하는 앱입니다. 여러가지 소리를 낼수있지만 전 그냥 기본적인 화이트노이즈를 섞는 다는 느낌으로 1Hz로 재생했습니다.

기본적으로 크게 거슬리지는 않는 소리가 나더군요. (사실 이건 그냥 저가DAC에서 흔한 화이트 노이즈 입니다. 1Hz는 안 들리는게 정상이지요.)1Hz는 정체시의 자동차진동보다 더 저음의 영역입니다.

그러고나니 이젠 소리가 더 끊기지 않습니다. 귀에 특정소리를 계속 꽂아넣는 문제가 있긴한데 그냥 음악이 중간에 툭툭 끊기는 거같이 불쾌하지 않으니 됐지요.

돈이 없다면 이런식으로 꼼수라도 써야죠.

,

BBQ20KBD라는 것은 그냥 쉽게 말하자면 BlackBerry Q20 Keyboard라는 의미입니다.

 

한때 엄청 유명했던 전설의 휴대폰 블랙베리 Q20의 키보드를 사용해서 일반적인 키보드를 만드는 프로젝트입니다.

https://www.solder.party/docs/bbq20kbd/

 

BBQ20KBD

A BB Q20 Keyboard in USB/PMOD/Qwiic format with a injection molded clear plastic case. This is the evolution of our previous BBQ10 PMOD board. We took all the feedback from that board and improved on the design in every way. We added a Qwiic/Stemma QT conn

www.solder.party

Solder Party라는 곳에서 제작 및 진행을 하고 있고 BlackBerry 키보드 부품도 필요하지만 잘 뒤져보시면 PCB와 함께 완제품?을 구할 수도 있습니다.

저는 운 좋게 완제품을 구해서 가지고 놀고 있었습니다.

 

그런데 이 키보드가 한/영키가 따로 존재하지 않습니다. 그래서 표준이라 할 수 있는 Shift+Space를 함께 눌러봤는데...

이상하게 작동이 안 되더군요.

이건 아무래도 펌웨어 문제가 분명했습니다.

 

공개된 펌웨어 코드를 다운로드 받아서 분석을 해보니...

https://github.com/solderparty/i2c_puppet

 

GitHub - solderparty/i2c_puppet

Contribute to solderparty/i2c_puppet development by creating an account on GitHub.

github.com

해당 부분이 HID 키보드 신호를 뿌려주는 부분이다. 뭔가...키코드가 이상하다.

KEY_MOD_SHL

KEY_MOD_SHR

KEY_MOD_ALT

KEY_MOD_SYM

 

여기 있는 키는 입력을 씹는 것으로 되어 있습니다. 근데 씹는게 맞기는 합니다. 저 키는 원래 조합으로 만들어지는 부분이니까요.

 

원래 코드 기준 76번째 줄 보면 (위 스크린샷 기준 81번째 제가 좀 손을 봤거든요.)

tud_hid_n_keyboard_report(USB_ITF_KEYBOARD, 0, modifier, keycode);

 

이 함수로 키코드와 조합키를 만들어서 보내는 듯 합니다.

그러면 해당 함수를 호출 하는 곳을 찾아봅니다.

 

열심히 찾다보니 콜백 함수를 찾을 수 있었습니다. key_callback이라는 구조로 콜백하게 되어 있군요. 그러면 key_callback을 찾아봅니다.

 

여기저기 있었지만 찾아본 결과 keyboard.c에서

여기 있는 이 부분이 바로 중요한 부분이었습니다.

즉 keyboard_inject_event함수가 호출 될 때 해당 부분을 콜백하면서 작동되는 구조더군요.

 

그리고 해당 함수를 호출 하는 부분은 위쪽에 있었습니다.

-

transition_to 함수에서 키코드를 받아이런 저런 조합을 하는 부분이 있었습니다.

그래서 생각을 한 것이 해당 키보드의 SYM키 위치가 좋아보이더군요. 그래서 이걸 0xF2로 바꿔봤습니다. 0xF2가 한국키보드의 한/영 키를 의미합니다. 요즘은 그냥 오른쪽Alt키를 더 많이 쓰는 거 같지만 위 스크린샷의 109번째 줄 처럼 key=0xF2로 바꿔봤습니다.

 

그리고 해당 코드를 빌드 후에 키보드에 입혀봤습니다.

 

설명서를 보시면

 

여기 있는 해당 부분을 누르면서 USB를 연결하면 부트로더 모드로 진입하고 이때 뜨는 드라이브에 빌드된 uf2 파일을 복사하면 알아서 펌웨어가 입혀집니다.

 

(uf2파일로 빌드하는 것은 이전 글 https://moordev.tistory.com/451참조)

 

그랬더니 윈도우에서 잘 먹힙니다. 그런데 이건 윈도우에서 먹히는 거고 안드로이드에서는 또 안 먹힙니다.

안드로이드는 Shfit+Space가 아니면 언어 전환이 안 되거든요.

 

그래서 추가로 손을 댔습니다.

 

 

usb.c 파일의 key_cb 함수를 수정해서 저 위치에

if (key == 0xF2) { // HANGUL KEY
    modifier = KEYBOARD_MODIFIER_LEFTSHIFT;
    keycode[0] = conv_table[0x20][1];
    //HANGUL KEY Press to Shift+Space

이 코드를 추가하면 0xF2 코드가 들어왔을 때 Shift+space로 작동 되게끔 신호를 쏴줍니다.

 

이렇게 해주니 SYM키를 누를 때마다 한/영전환이 안드로이드에서 아주 잘 되기 시작합니다. 대신 윈도우에서 또 안 되네요...

윈도우가 Shift+Space 전환을 지원을 안 하는게 아닌걸로 아는데 이건 이유를 모르겠네요.

 

그냥... 이 키보드를 어디서 쓸거냐에 따라 그때그때마다 펌웨어를 바꿔주는 것으로 합시다... 굉장히 귀찮아지기 시작했습니다.

원한다면 다른 방식으로 그냥 키를 싹싹 바꿔보는 것도 방법일거 같기도 하네요.

 

 

혹시 몰라서 소스코드를 묶음을 올려봅니다. 참고하실 분은 참고해보세요. 안에  Dockerfile도 함께 있으니 원하신다면 이걸로 빌드도 할 수 있을겁니다.

i2c_puppet_Hangul_src.tar.gz
2.32MB

 

i2c_puppet.uf2
0.09MB

 

uf2파일은 이 방식으로 만든 펌웨어 파일입니다. 코드 정리가 되면 github에도 올려볼 생각입니다만 정리가 언제 될지 몰라서 우선은 여기에 올려봅니다.

,