기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

안녕하세요


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 이용했을 때 녹음 데이터 흐름도 알려주시면 감사하겠습니다.


고도리

2012.08.06 22:29:55
*.200.239.234

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에 있는 녀석인가요?

jaeokbr

2012.08.07 01:18:00
*.76.17.213

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에서 드라이버 형식으로 빌트인되어 있습니다.

고도리

2012.08.07 02:20:14
*.200.239.210

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와 같은 특수용도로 사용하는지에 대한 질문이었습니다.

위의 글을 보니 아닌 듯 싶네요.



파란새

2012.08.07 02:13:59
*.178.131.160

샘플링 주기를 변환하면 재생시간도 변할겁니다 ...

핸폰개발자

2012.08.07 03:28:09
*.111.135.254

안드로이드 audioflinger는 playback을 44100 이하는 무조건 업샘플링 시킵니다.

해당 파일은 audioresampler.cpp 이구요.

 

그럼으로 Audio Codec단에서 8k /16k으로 play를 시키고 싶으면 asoundconf 파일을 변경 하던지 SRC부분을

수정 하셔야 됩니다.

 

고도리

2012.08.07 09:29:29
*.127.19.87

제 경험상 말씀드리면.....레코딩시 옵션을 잘 못 주신게 아닐까 생각이 듭니다.


예를 들어 wav 파일의 헤더를 44100으로 해 놓고, 실제 data가 16000 이면 후딱 지나가거든요...^^

jaeokbr

2012.08.07 19:11:06
*.76.17.213

하루사이에 댓글이 많이 달렸네요 ^^ 다들 신경써주셔서 감사합니다.

말씀들중에 몇가지는 책 찾아보면서 테스트 해봐야 할거같은데


현재 제가 확인 한 바로는 AudioFlinger.cpp의 AudioFlinger::RecordThread::threadLoop(),

AudioStreamInALSA::read() 함수안에 buffer변수의 pcm데이터가 이미 다운샘플링 되어있는것 같아서요

Dummy에서 어떤루트를 통해 데이터가 전달 되는지 확인 중입니다.


AudioRecord, 샘플링 주기, asoundconf 쪽은 공부하면서 테스트 해보도록 하겠습니다.



고도리

2012.08.07 20:11:11
*.200.239.210

"AudioStreamInALSA::read() 함수안에 buffer변수의 pcm데이터가 이미 다운샘플링 되어있는것 같아서요"


라면.........HAL에서 손을 댔을 가능성이 높습니다.

왜냐하면, 보통 alsa-lib를 써서 downsampling을 잘 하지 않기 때문입니다.


platform과 소스 구조를 안 본 상태에서는 여기까지가 한계가 아닐까 싶습니다...^^

jaeokbr

2012.08.07 22:05:52
*.76.17.213

조언들 참고하여 찾아보도록 하겠습니다. 여기저기 관련된 소스파일들이 흩어져 있어서 찾기가 힘드네요 ^^


소스도 원본소스랑은 좀 다른것들도 있는거같아서 원인 파악하기가 더 힘든거 같아요.


신경 써 주셔서 감사합니다~

List of Articles
번호 제목 글쓴이 날짜 조회 수sort
5388 리눅스 커널 압축 관련 [1] 조현호 2011-05-24 553
5387 터치스크린 관련 ls, set 실행결과 입니다~ [4] 서덕재 2009-03-26 554
5386 오드로이드 보드 구매시 지원사항 문의 [2] 마사꽃 2009-12-15 554
5385 ODROID Eclair 동작 질문^^ [2] 이종범 2010-01-06 554
5384 OMAP 부팅 안 되는 문제 [1] 산넘어 2010-04-23 554
5383 오드로이드 T 지자기 센서 관련 문의 드립니다. [1] 미키유경 2010-07-29 554
5382 오드로이드 [커널 2.6.32.9] 로딩시 패닉 관련 문의 file [1] 이종문 2010-08-26 554
5381 gccmakedep: Command not found [1] 황순일 2011-05-18 554
5380 aESOP 보드에서 SPI 질문요 [1] 주의이름으로 2009-04-29 555
5379 S3C64X0 구매 관련 문의 [1] 차현석 2009-07-17 555
5378 driver 를 kernel안에 포함 시켰을 경우 각 driver의 호출 순서... [1] 이성호 2010-01-14 555
5377 S5PC100 Package에 대한 질문 [1] 도너 2010-01-18 555
5376 toolchain 관련 질문입니다. [2] jacket 2010-01-26 555
5375 안드로이드 비디오 드라이버 스펙 분석... [1] 안드러오니 2010-03-05 555
5374 다운로드 62번 71030_aesop_mp2530f_1st_release.tar.gz 을 받을 수 있... [2] 고봉석 2010-07-11 555
5373 cs89x0: Tx buffer not free! 문제 file [1] 만봉부인 2010-10-27 555
5372 빌드한 프로요 소스를 이용해서 루트파일시스템 이미지 만드는 방법은... [1] 장석원 2011-02-24 555
5371 안드로이드 PM관련 질문입니다. [3] 김영일 2009-11-06 556
5370 터치 컨트롤러... [2] 현쓰 2009-11-21 556
5369 [완료]자꾸 질문만 드리네요..yaffs올리는데 왜 udev가 필요한건가요? [2] 김우겸 2008-01-24 556

사용자 로그인