ALSA에 관련해서 도움이 필요합니다..
글쓴이: odh8870 / 작성시간: 화, 2020/06/02 - 7:14오후
현재 ALSA를 개발중입니다.
한가지 문제를 직면하게 되었는데요.. 몇일을 공부해도 잘 모르겠어서 도움을 요청드립니다.
API에서 snd_pcm_writei를 실행시켰을때 Driver에서 받아온 데이터에 대한 질문입니다.
현재 저희 i2s의 soc 구조상 100K로 잡아둔 버퍼의 start addr를 지정하게되면 잡아둔
크기만큼 1024Byte씩 codec에 tx or rx하게 되어있습니다.
API로 부터 받은 Data가 최종으로 runtime->dma_addr로 쌓이게 되는데요.
크기는 8000Hz 설정이라서 8000Byte데이터가 있는것같습니다.
여기서 문제는 잡아둔 100K중 앞부분인 0~8000Byte만 갱신되고있어서 음성이 0XXXXXX (0이 음성이 나옴,X는 음성이 없음) 형태로 나오고있어서 어떻게 해결해야될지 모르겠습니다.
너무 두서없이 애기드린것 같은데 도움주셨으면 좋겠습니다.
Forums:
buffer에 들어간 데이타의 길이를 저장해 놔야죠.
buffer에 들어간 데이타의 길이를 저장해 놔야죠.
buffer라고 말씀하시는 부분이 runtime-
buffer라고 말씀하시는 부분이 runtime->buffer_size를 말씀하시는건가요???
좀더 간략한 설명 부탁드립니다 ㅠㅠ
매번 똑같은 곳에 8000byte가 들어오는 모양인데
매번 똑같은 곳에 8000byte가 들어오는 모양인데, 그럼 그 부분을 복사해서 다른 곳에서 이어붙이거나, 아니면 start address를 매번 조금씩 증가시켜서 이어서 받게 만들면 되는 것 아닙니까?
답변감사드립니다.. 말씀해주셧던 내용이 가장 먼저
답변감사드립니다.. 말씀해주셧던 내용이 가장 먼저 생각했던 부분입니다.
snd_pcm_writei가 실행되면 pcm_ops으로 인해서 trigger가 호출되어 해당 addr로 데이터가 쌓이는데
snd_pcm_writei가 for or while문으로 호출되어도 trigger가 한번만 호출되더라고요..
가장 큰 문제는 addr로 쌓이는 과정이 코드가 방대하여 분석이 안되고있네요..
alsa kernel layer 에서 먼저 -
alsa kernel layer 에서 먼저 ->trigger() 해서 start 한 다음, dma buffer 에 pcm data 를 복사하고, alsa device driver 쪽에 ->ack() 등을 호출했던거 같은데...
커널 코드를 좀 더 보시면...
https://elixir.bootlin.com
https://elixir.bootlin.com/linux/latest/source/sound/core/pcm_lib.c#L2116
여기에 __snd_pcm_lib_xfer() 함수를 보시면 어떻게 dma buffer 에 복사하고, 어떻게 substream->ops 를 사용하는지 대략 나옵니다..
감사합니다. 한발짝 나아간것 같네요.
감사합니다. 한발짝 나아간것 같네요.
더 분석을 해봐야겠네요~ 좋은 하루 되세요~
댓글 달기