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

안녕하세요


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 [완료] SAMBA 접속 오류에 관하여.. [5] 이세종 2007-11-13 1157
5387 [완료]QTE vs TinyX+QT/X11 [2] 박준영 2007-11-13 1978
5386 유동아이피 설정을 어떻게 하는지요 [1] 임병재 2007-11-13 777
5385 커널 다운로드가 잘 안됩니다 ㅜㅜ[완료] [5] 이상화 2007-11-13 746
5384 [완료] minicom 통신 오류 [2] 이세종 2007-11-14 843
5383 [완료] minicom과 보드의 통신 [6] 이세종 2007-11-14 934
5382 [완료]SDL 기본 화면 뛰우기 [3] 윤치호 2007-11-15 2731
5381 [완료] 보드 부팅 로그입니다.(Loading:T T T T T) [4] 이세종 2007-11-15 1054
5380 s3c2410 16비트 ram 시스템용 JTAG프로그램 구할수있을까요? 문철민 2007-11-15 587
5379 [완료] 공유기에 사용하는 랜선에 대해.. [3] 이세종 2007-11-16 616
5378 [완료] dnw 에서 nand.nb0 다운 에러 [2] 김경중 2007-11-16 702
5377 [완료]2440보드에 logitech quickcam messenger를 물리려하고있습니다.[... [3] 김성민 2007-11-16 1503
5376 [완료]Jtag 동글이 회로도 구할 수 있나요? [4] 김용태 2007-11-16 826
5375 [완료] 질문이 있습니다. [2] 송지훈 2007-11-16 498
5374 [완료]CS8900 reset_chip() 질문... [3] 박종석 2007-11-17 1029
5373 SJF2440 소스 am29lv160.c 수정 중 질문입니다.-고현철님 추가 질문입... [6] 김용태 2007-11-17 811
5372 삼성 2440 I/O Speed [1] 전철웅 2007-11-17 2759
5371 [완료] Network 카드 인식... [1] 정경진 2007-11-18 873
5370 [완료] tftp 서버설정 [2] 이세종 2007-11-18 1286
5369 [완료]이어폰젝을 연결하면 리셋되는 현상 [2] 이헌상 2007-11-18 615

사용자 로그인