기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
안녕하세요
Alsa driver 포팅하려고 하는데 녹음쪽이 잘 되지 않아서요
hardware/alsa_sound/alsa_default.cpp 에서 sampleRate를 44100으로 할때는 5초간 녹음하면 5초동안 재생이 되는데
sampleRate를 16000으로 바꾸면 5초간 녹음하면 1~2초 정도밖에 재생이 안되요
파형 비교해 보니까 44100일때는 제가 못주는 데이터를 0으로 처리해서 데이터가 띄엄띄엄있는 형태구요
16000일때는 파형은 유지되는데 3초분량을 1초만에 재생하다보니 소리가 이상하게 나와요
현재 증상이 sample rate와는 별도로 초당 데이터량이 정의되어 있는 것 같은데 설정 할 수 있는 방법이 있을까요??
그리고 Dummy.c 이용했을 때 녹음 데이터 흐름도 알려주시면 감사하겠습니다.
1. HAL 포팅 목적입니다.
2. dummy.c의 snd_pcm_ops안의 .copy함수에서 void __user *dst 파라미터로 받은 포인터에 Mic로 들어오는 데이터를 copy하는 방식으로 구현하였는데, 아래의 함수들에서 buffer데이터를 파일 변환하였을 때 제가 문의드렸던 사항들이 확인 되었습니다.(5초 분량이 1~2초 분량으로 변함)
frameworks/base/services/audioflinger/AudioFlinger.cpp
-> status_t AudioFlinger::RecordThread::RecordTrack::getNextBuffer(AudioBufferProvider::Buffer* buffer)
-> bool AudioFlinger::RecordThread::threadLoop()
hardware/alsa_sound/AudioStreamInALSA.cpp
-> ssize_t AudioStreamInALSA::read(void *buffer, ssize_t bytes)
3. snd_pcm_ops안의 .copy함수에서 복사된 데이터를 어디서 받는지 확인이 안되어 추측일 뿐이지만 제가 데이터 확인 한 부분은 resampling된 데이터라 추측됩니다.
4. sampling rate 16000, 채널 1, SND_PCM_FORMAT_S16_LE type으로 설정하였습니다.
sample당 bytes수에대해서는 위치 알려주시면 확인 하겠습니다.
5. dummy.c의 위치는 kernel/sound/drivers/dummy.c입니다. kernel에서 드라이버 형식으로 빌트인되어 있습니다.
1. CPU에 따라 약간 동작이 틀릴수 있습니다.
2. AudioRecord class를 쓰셔서 특정 값들을 세팅한 후에 record 테스트를 부탁드립니다.
3. 1,2번과 연계되어 있는데, 44100->16k 변환을 audioflinger의 audioresampler에서 처리하는지 HAL에서 처리하는지에 따라 약간씩 틀립니다. --> samsung에서 release된 소스들도 마찬가지입니다. 저희는 삼성 소스를 사용하지 않습니다. 직접 만들어서 HAL에서 처리합니다.
4. Android는 기본적으로 16bit LE PCM을 사용합니다. 이 부분은 아마도 문제가 없을 듯 합니다.
5. dummy.c를 쓰시는 분을 꽤 오랜만에 봐서, buzzer와 같은 특수용도로 사용하는지에 대한 질문이었습니다.
위의 글을 보니 아닌 듯 싶네요.
하루사이에 댓글이 많이 달렸네요 ^^ 다들 신경써주셔서 감사합니다.
말씀들중에 몇가지는 책 찾아보면서 테스트 해봐야 할거같은데
현재 제가 확인 한 바로는 AudioFlinger.cpp의 AudioFlinger::RecordThread::threadLoop(),
AudioStreamInALSA::read() 함수안에 buffer변수의 pcm데이터가 이미 다운샘플링 되어있는것 같아서요
Dummy에서 어떤루트를 통해 데이터가 전달 되는지 확인 중입니다.
AudioRecord, 샘플링 주기, asoundconf 쪽은 공부하면서 테스트 해보도록 하겠습니다.
1. android HAL 포팅이신가요? alsa driver 자체가 목적인가요?
즉, HAL을 test하시는 것인지? 아니면 ALSA의 녹음 기능만 테스트 하고 싶으신 것인지요?
2. 녹음을 어떻게 처리했는지에 따라 결과가 틀릴겁니다.
3. audio HAL에서 resampling 처리를 따로 하신 것인지? 아니면 어떤 장비, CPU를 쓰시는 것인지에 따라 조금씩 차이가 날 것이고요.
4. 초당 데이터 량은 간단하게 계산이 되기는 할 겁니다만 다른 계산이 있을지는 모르겠습니다.
보통 이렇게 계산합니다.
sampling rate * 채널수 * sample당 bytes수
안드로이드는 16bit pcm을 사용
5. dummy.c는 alsa에 있는 녀석인가요?