format은 아래와같이
QAudioFormat formatAudio; formatAudio.setSampleRate(44100); formatAudio.setChannelCount(2); formatAudio.setSampleSize(24); formatAudio.setCodec("audio/pcm"); formatAudio.setByteOrder(QAudioFormat::LittleEndian); formatAudio.setSampleType(QAudioFormat::SignedInt);
audio device info는 아래와같이
QAudioDeviceInfo getAudioDevice(const QString &name) { foreach(const QAudioDeviceInfo &deviceInfo, QAudioDeviceInfo::availableDevices(QAudio::AudioInput)) { if(deviceInfo.deviceName() == name) { return deviceInfo; } } return QAudioDeviceInfo(); }
audioDevice = getAudioDevice(“hw:CARD=G5,DEV=0”);
그 후 start하면 iodevice에 어떠한 데이터가 수신되지 않는다. 결론은 이유가 Qt는 24비트 셈플은 S24_LE로 초기화 하기때문이였다.
쉘에서 아래처럼 정보를 확인해보면 지원하는 포맷은 S24_3LE(…)
$ cat /proc/asound/card2/stream0 Creative Technology Ltd Sound BlasterX G5 at usb-3f980000.usb-1.3.1, high speed : USB Audio Playback: Status: Stop Interface 1 Altset 1 Format: S24_3LE Channels: 2 Endpoint: 1 OUT (ASYNC) Rates: 44100, 48000, 88200, 96000 Data packet interval: 500 us Capture: Status: Stop Interface 2 Altset 1 Format: S24_3LE Channels: 2 Endpoint: 2 IN (ASYNC) Rates: 44100, 48000, 88200, 96000 Data packet interval: 500 us
좀 더 깔끔하게 코딩하기위해 Qt의 Multmedia를 사용하려했지만 결국 alsa api를 써야할거같다. 아… 왜 저런 차이를 생각하지 못하고 네시간을 삽질했을까… PulseAudio를 활성화 시키면 리셈플링 되어 처리가 가능할거같은데 lite 이미지에서 PulseAudio를 활성화 하는 방법이 구글링되지않아 그건 포기해야겠다.