참나..

     

    16KHz 지원 여부를 확인하고 모듈도 지우너하고, 이어셋도 지원해서 2주일간 저녁시간마다 작업햇는데 진행이 안되었었다. Bluez도 그렇고 Pulseaudio도 나온지도 오래됬고 해서 웬만한건 그냥 될줄 알았는데, 소스까지 뜯어고치는 불상사가 있을거라고 누가 상상이나 했겠나. 

     

    뭐 어쨋거나 소스하고 일부 수정해서 정상적으로 동작하는건 좋은데, 그래 음질은 대충 비교해보면 8K보다는 나은데, 생각한 만큼 좋지는 않다. 그래도 작업해둔거니 기록을 남겨두어야 겠다. 

     

     

     

    1. PulseAudio를 업그레이드

    1.1. 펄스오디오 다운로드

      펄스오디오 소스를 다운로드 받는다. 
       wget https://freedesktop.org/software/pulseaudio/releases/pulseaudio-15.0.tar.xz

    1.2. 추가패키지

     빌드와 관련하여 추가 패키지는 아래와 같다. 
    apt install -y build-essential meson ninja-build libdbus-1-dev libsbc-dev libbluetooth-dev libglib2.0-dev libltdl-dev libsndfile1-dev libspeexdsp-dev libcap-dev libtdb-dev intltool libavahi-client-dev libudev-dev libice-dev libsm-dev libx11-xcb-dev libxtst-dev check libasound2-dev

    1.3. 빌드
    1) 설정

      소스디렉터리에서 빌드 설정을 진행한다.
      root@imx:~/pulseaudio-15.0# cd /root/pulseaudio-15.0 && meson setup build --prefix=/opt/pulseaudio-15

    2) 빌드

      소스 디렉터리에서 빌드를 진행한다.
      root@imx:~/pulseaudio-15.0# cd /root/pulseaudio-15.0 && ninja -C build

     

    3) 라이브러리 빌드되었는지 확인

      정상적으로 빌드되었는지 내용을 확인한다.
      root@imx:~/pulseaudio-15.0# find /root/pulseaudio-15.0/build -name 'module-bluez5*.so' -o -name '*msbc*'

     

    4) mSBC 포함여부 확인

      빌드할때 빠질 수도있으니, msbc가 포함되어있는지 확인
      root@imx:~/pulseaudio-15.0# nm -D /root/pulseaudio-15.0/build/src/modules/bluetooth/libbluez5-util.so | grep -i msbc
      ibbluez5-util.so | grep -i msbc
      000000000000df54 T pa_bluetooth_discovery_get_enable_msbc
      000000000003d928 D pa_bt_codec_msbc
                       U sbc_init_msbc@SBC_1.1

    5) 설치

      위에서 확인되었으니 설치를 진행한다.
      root@imx:~/pulseaudio-15.0# ninja -C build install

     

    1.4. 설치 위치 확인
    1) 기존 패키지 설치위치 확인

      가능하면 기존 패키지를 유지하고 싶어서 설치 패키지 위치를 확인한다.
      root@imx:~/pulseaudio-15.0# dpkg -L pulseaudio | grep -E '/(bin|sbin)/|/lib.*/pulse'
      /usr/bin/pulseaudio
      /usr/bin/start-pulseaudio-x11
      /usr/lib/aarch64-linux-gnu/pulseaudio
      /usr/lib/aarch64-linux-gnu/pulseaudio/libpulsecore-14.2.so
      /usr/lib/pulse-14.2
      /usr/lib/pulse-14.2/modules
      /usr/lib/pulse-14.2/modules/libalsa-util.so
      /usr/lib/pulse-14.2/modules/libcli.so
      /usr/lib/pulse-14.2/modules/liboss-util.so
      /usr/lib/pulse-14.2/modules/libprotocol-cli.so
     ... 생략 ...
      /usr/lib/pulse-14.2/modules/module-virtual-surround-sink.so
      /usr/lib/pulse-14.2/modules/module-volume-restore.so
      /usr/lib/pulse-14.2/modules/module-x11-bell.so
      /usr/lib/pulse-14.2/modules/module-x11-cork-request.so
      /usr/lib/pulse-14.2/modules/module-x11-publish.so
      /usr/lib/pulse-14.2/modules/module-x11-xsmp.so
      /usr/lib/systemd/user/pulseaudio.service
      /usr/lib/systemd/user/pulseaudio.socket
      /lib/systemd/system/pulseaudio-enable-autospawn.service

    2) 신규버전 확인

      - 새로운 15.0 버전 위치 확인
      root@imx:~/pulseaudio-15.0# find /opt/pulseaudio-15 -type f \( -name 'pulseaudio' -o -name 'module-bluez5*.so' \)
      /opt/pulseaudio-15/share/bash-completion/completions/pulseaudio
      /opt/pulseaudio-15/bin/pulseaudio
      /opt/pulseaudio-15/lib/aarch64-linux-gnu/pulse-15.0/modules/module-bluez5-discover.so
      /opt/pulseaudio-15/lib/aarch64-linux-gnu/pulse-15.0/modules/module-bluez5-device.so

     

      - 모듈 위치도 확인
      root@imx:~/pulseaudio-15.0# strings /opt/pulseaudio-15/bin/pulseaudio | grep '/opt/pulseaudio-15.*modules'
      /opt/pulseaudio-15/lib/aarch64-linux-gnu/pulse-15.0/modules


    3) 기존 14.2 실행여부 및 신규 버전확인

      처음부터 비교하려고 이미지를 갈아업고 새로 한거니 확실할 거다.
      root@imx:~/pulseaudio-15.0# ps -ef | grep '[p]ulseaudio'
      root@imx:~/pulseaudio-15.0# /opt/pulseaudio-15/bin/pulseaudio --version
      pulseaudio 15.0

     

     

    2. 실행 

      빌드가 정상적으로 완료되었고, 설치위치도 확인되었다면 이제 실행해서 테스트를 진행한다.

    2.1. 디버그 상태로 실행
    1) 실행시 디버그 가능하도록 -vv 옵션 사용
    /opt/pulseaudio-15/bin/pulseaudio -vv --daemonize=no

    2) 펄스오디오 실행
    그냥 실행하면 idle일때 종료하는 문제가 있다.  따라서, idle 상태에 못들어가도록 해야한다. 두번째 라인 이용한다.
    /opt/pulseaudio-15/bin/pulseaudio --start
    /opt/pulseaudio-15/bin/pulseaudio --daemonize=no --exit-idle-time=-1 -vv 2>&1 | tee /tmp/pa15.log   // IDLE 종료 방지

    3) 프로필 확인

    bluez가 있는걸로 봐서 다행히 꼬이지는 않는다.
    root@imx:~/pulseaudio-15.0# /opt/pulseaudio-15/bin/pactl list cards short
    0       alsa_card.platform-sound-wm8904 module-alsa-card.c
    1       bluez_card.00_02_5B_17_A7_B2    module-bluez5-device.c

     

    4) 상세 정보확인
    root@imx:~/pulseaudio-15.0# /opt/pulseaudio-15/bin/pactl list cards | grep -A30 "bluez_card.00_02_5B_17_A7_B2"
            Name: bluez_card.00_02_5B_17_A7_B2
            Driver: module-bluez5-device.c
            Owner Module: 20
            Properties:
                    device.description = "M53"
                    device.string = "00:02:5B:17:A7:B2"
                    device.api = "bluez"
                    device.class = "sound"
                    device.bus = "bluetooth"
                    device.form_factor = "headset"
                    bluez.path = "/org/bluez/hci0/dev_00_02_5B_17_A7_B2"
                    bluez.class = "0x240404"
                    bluez.alias = "M53"
                    device.icon_name = "audio-headset-bluetooth"
                    device.intended_roles = "phone"
                    bluetooth.codec = "sbc"
            Profiles:
                    headset_head_unit: Headset Head Unit (HSP) (sinks: 1, sources: 1, priority: 30, available: no)
                    a2dp_sink: High Fidelity Playback (A2DP Sink) (sinks: 1, sources: 0, priority: 40, available: yes)
                    handsfree_head_unit: Handsfree Head Unit (HFP) (sinks: 1, sources: 1, priority: 30, available: yes)
                    off: Off (sinks: 0, sources: 0, priority: 0, available: yes)
            Active Profile: a2dp_sink
            Ports:
                    headset-output: Headset (type: Headset, priority: 0, latency offset: 0 usec, availability unknown)
                            Part of profile(s): headset_head_unit, a2dp_sink, handsfree_head_unit
                    headset-input: Headset (type: Headset, priority: 0, latency offset: 0 usec, availability unknown)
                            Part of profile(s): headset_head_unit, handsfree_head_unit

    5) HFP 프로필 전환
    /opt/pulseaudio-15/bin/pactl set-card-profile bluez_card.00_02_5B_17_A7_B2 handsfree_head_unit

    6) mSBC 설정여부 확인
      root@imx:~/pulseaudio-15.0# /opt/pulseaudio-15/bin/pactl list sources | grep -A15 'bluez_source.00_02_5B_17_A7_B2.handsfree_head_unit'
            Name: bluez_source.00_02_5B_17_A7_B2.handsfree_head_unit
            Description: M53
            Driver: module-bluez5-device.c
            Sample Specification: s16le 1ch 16000Hz
            Channel Map: mono
            Owner Module: 20
            Mute: no
            Volume: mono: 65536 / 100% / 0.00 dB
                    balance 0.00
            Base Volume: 65536 / 100% / 0.00 dB
            Monitor of Sink: n/a
            Latency: 0 usec, configured 0 usec
            Flags: HARDWARE DECIBEL_VOLUME LATENCY
            Properties:
                    bluetooth.protocol = "handsfree_head_unit"
                    bluetooth.codec = "mSBC"
    root@imx:~/pulseaudio-15.0#

    7) 녹음 테스트
    timeout 5s /opt/pulseaudio-15/bin/parecord \
      --device=bluez_source.00_02_5B_17_A7_B2.handsfree_head_unit \
      --format=s16le --rate=16000 --channels=1 \
      /tmp/m53_msbc.wav

    8) 재생테스트
    /opt/pulseaudio-15/bin/paplay   --device=bluez_sink.00_02_5B_17_A7_B2.handsfree_head_unit   /tmp/m53_msbc.wav

    * 결과가 문제다. BlueAlsa에서 본것과 같이 중간에 데이터가 빠졌다. 말소리가 끊어진다. 4/4박자장 2/4 박자만 출력되는 느낌이다. 아 이거 오리지널 Debian12에서 동일한 증상으로 방향을 PusleAudio로 바꾼건데.. 지난번 해결방법인 auto mtu로 설정해도 상황이 바뀌지 않았다. 디버깅 결과 120바이트 처리중 실제 60바이트만 처리되었다. 지난번 해결방법인 auto mtu로 설정해도 상황이 바뀌지 않았다.  관련해서 디코더 소스 수정하고, 출력을 60바이트로 잘라서 처리하도록 수정했다. 60바이트 이상으로 설정하면 문제가 발생되었기에, 달리 해결방법은 두번 나눠서 쓰게 하는 방법밖에 없었다. 어찌되었건, 정상동작한다.

     

    9) 루프백 테스트

      실제 음성을 녹음한것을 바로 출력하도록 루프백 테스트를 진행한다. 
     /opt/pulseaudio-15/bin/pactl load-module module-loopback   source=bluez_source.00_02_5B_17_A7_B2.handsfree_head_unit   sink=bluez_sink.00_02_5B_17_A7_B2.handsfree_head_unit   latency_msec=50

     

    2.2. 실행 명령 요약

      첨부된 소스코드를 활용하여 변경 사항 확인이 필요하다. 만약 그냥 사용한다면 빌드 부터 테스트는 아래의 방법으로 진행.

    1) 빌드 및 설치
      ninja -C build
      ninja -C build install

    2) 펄스오디오 실행

      - 디버깅용
        /opt/pulseaudio-15/bin/pulseaudio --daemonize=no --exit-idle-time=-1 -vv 2>&1 | tee /tmp/pa15.log

     

      - 일반용
        /opt/pulseaudio-15/bin/pulseaudio --daemonize=no --exit-idle-time=-1

     

    3) 블루투스 연결
    bluetoothctl connect 00:02:5B:17:A7:B2

     

    4) 오디오 장치 확인
    /opt/pulseaudio-15/bin/pactl list modules short | grep bluez5-device

     

    5) 기존 모듈 내리고 새로운 모듈 적용

      아쉬움이 남아서 autodetect_mtu  옵션은 유지하였다. 

    root@imx:~/pulseaudio-15.0# /opt/pulseaudio-15/bin/pactl unload-module 20
    root@imx:~/pulseaudio-15.0# /opt/pulseaudio-15/bin/pactl load-module module-bluez5-device \
      path=/org/bluez/hci0/dev_00_02_5B_17_A7_B2 \
      autodetect_mtu=1
    21

     

    6) 핸즈프리 프로파일 적용
    /opt/pulseaudio-15/bin/pactl set-card-profile   bluez_card.00_02_5B_17_A7_B2 handsfree_head_unit

     

    7) 장치 등록여부 확인 (연결확인)

    /opt/pulseaudio-15/bin/pactl list modules short | grep bluez5-device
    bluetoothctl devices | while read _ mac name; do bluetoothctl info "$mac" | grep -q "Connected: yes" && echo "$mac $name"; done

     

    처음 하는 독자라면 반복작업 엄청 하겠지만, 해볼만 하다. 

    다만 8K보다 음질이 조금 나아지긴 하는데 블투 특성인지 조금 울린다. 커널형이라 그런가?

     

    Fixed_mSBC_Final.zip
    15.71MB

    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기