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

안녕하세요


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 arndale board 구입후 포팅 여부 판단 방법 [3] monad 2012-12-20 1529
5387 Arndale Board용 linaro Kernel Build 방법? [1] Supsupi 2014-08-05 1528
5386 프레임 버퍼 픽셀 값 쉬프트 연산하는 방법 [1] 박용순 2012-05-17 1527
5385 ODROID X2 codec 지원 리스트? [3] 신현호 2013-05-21 1527
5384 [AESOP 관리자님께]터치스크린 컨트롤러 IC 에 대해 문의드립니다... [3] 구진호 2008-03-08 1526
5383 [도움요청] S3C6400 [7] 이준호 2008-09-02 1525
5382 [CGI 관련 질문] 웹 페이지에 이상한 글자가 표시되요.. file [2] 허경 2012-02-10 1524
5381 [ALL-100] ALL-100 롬 라이터 사용법 질문 드립니다. [완료] [4] 김유석 2007-02-06 1523
5380 제목 : gcc로 ucos 이숍보드에 포팅하기 관련 질문 - 하이버스용 링... [10] 박상협 2008-03-05 1523
» Alsa record 관련 질문 드립니다. [9] jaeokbr 2012-08-06 1523
5378 aesop v210보드 안드로이드 소스 [2] 김정중 2013-04-25 1523
5377 CHIP ID 가 안읽어지는 경우 [3] lveritas 2014-07-15 1523
5376 진저브레드에서 이동식 디스크(UMS) 2개 연결하는 방법? [2] 텡구 2011-06-18 1522
5375 제가 만든 어플리케이션을 보드가 부팅했을 때 자동으로 실행 되게하... [7] 혜민아빠 2012-03-27 1522
5374 c100 보드, 커널 및 안드로이드 관련 소스 [2] 김정중 2013-04-10 1521
5373 해외사이트에서 임베디드 보드 구매시 관세, 부가세, 배송료, 배송기... [3] howwow20 2010-07-31 1520
5372 directfb + gtk2 + webkit 1.2.7 (without X11)관련 문의 [3] laconicblue 2012-03-13 1520
5371 S5pv310의 GPL2(0)를 인터럽트로 사용 하려면 어떻게 해야 되지요.? [3] GloomyDay 2013-01-27 1520
5370 리눅스 응용프로그램 자동 실행 [3] jclab 2012-06-08 1519
5369 회로도 관련 질문이 있습니다. [7] sonbong 2012-03-27 1519

사용자 로그인