ALSA에 관련해서 도움이 필요합니다..

odh8870의 이미지

현재 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는 음성이 없음) 형태로 나오고있어서 어떻게 해결해야될지 모르겠습니다.

너무 두서없이 애기드린것 같은데 도움주셨으면 좋겠습니다.

drinkme의 이미지

buffer에 들어간 데이타의 길이를 저장해 놔야죠.

odh8870의 이미지

buffer라고 말씀하시는 부분이 runtime->buffer_size를 말씀하시는건가요???
좀더 간략한 설명 부탁드립니다 ㅠㅠ

익명 사용자의 이미지

매번 똑같은 곳에 8000byte가 들어오는 모양인데, 그럼 그 부분을 복사해서 다른 곳에서 이어붙이거나, 아니면 start address를 매번 조금씩 증가시켜서 이어서 받게 만들면 되는 것 아닙니까?

odh8870의 이미지

답변감사드립니다.. 말씀해주셧던 내용이 가장 먼저 생각했던 부분입니다.
snd_pcm_writei가 실행되면 pcm_ops으로 인해서 trigger가 호출되어 해당 addr로 데이터가 쌓이는데
snd_pcm_writei가 for or while문으로 호출되어도 trigger가 한번만 호출되더라고요..
가장 큰 문제는 addr로 쌓이는 과정이 코드가 방대하여 분석이 안되고있네요..

Hyun의 이미지

alsa kernel layer 에서 먼저 ->trigger() 해서 start 한 다음, dma buffer 에 pcm data 를 복사하고, alsa device driver 쪽에 ->ack() 등을 호출했던거 같은데...
커널 코드를 좀 더 보시면...

Hyun의 이미지

https://elixir.bootlin.com/linux/latest/source/sound/core/pcm_lib.c#L2116
여기에 __snd_pcm_lib_xfer() 함수를 보시면 어떻게 dma buffer 에 복사하고, 어떻게 substream->ops 를 사용하는지 대략 나옵니다..

odh8870의 이미지

감사합니다. 한발짝 나아간것 같네요.
더 분석을 해봐야겠네요~ 좋은 하루 되세요~

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.