[리눅스-Linux] ALSA에서 snd_pcm_hardware값 문의

ysh0988의 이미지

리눅스 ALSA를 이용하여 보드에 기존 가지고있는 Driver를 포팅 하고 있습니다.

그런데.. Playback은 포팅을 하였는데, Capture에서 계속 막히고 있습니다.

아래 값들의 의미와 리눅스 커널단에서 내부적으로 어떻게 동작하는지를 알고싶은데요...

아래는 Linux 커널에 포함되어있는 소스 예제입니다.

예를들어 buffer_bytes_max가 period_bytes_max보다 커야한다..모 이런것들이요..

buffer_bytes_max, period_bytes_min / max, periods_min / max, fifo_size에 대해서 자세히 설명좀 부탁드립니다(__)

static struct snd_pcm_hardware snd_als4000_capture =
{
.info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
SNDRV_PCM_INFO_MMAP_VALID),
.formats = SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U8 |
SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_U16_LE, /* formats */
.rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
.rate_min = 4000,
.rate_max = 48000,
.channels_min = 1,
.channels_max = 2,
.buffer_bytes_max = 65536,
.period_bytes_min = 64,
.period_bytes_max = 65536,
.periods_min = 1,
.periods_max = 1024,
.fifo_size = 0
};

아 그리고 마지막으로 하나더 여쭐게요......

pointer function을 등록하는데, pointer function은 언제 어떤 상황에서 불리우게 되는건지요...

고수님들 자세히 답변좀 부탁드립니다.................ㅠㅠ

drinkme의 이미지

play를 제대로 하셨다면, 위의 항목들에 대한 내용도 이해하셨으리라 보이는데...
제가 질문을 잘 이해 못한것일까요?
뭐... 저도 이거 한지 좀 되나서... 가물가물 하지만,

http://www.kernel.org/pub/linux/kernel/people/tiwai/docs/writing-an-alsa-driver/index.html
일단 공식문서 참고하시고요.

buffer_bytes_max 는 내부에서 관리될(?) 전체 buffer의 크기를 지정합니다.
이 buffer 전체에 data가 period buffer 크기로 나뉘어 져서 관리되겠죠.

period_byte_min/max는 한번에 처리될 수 있는 data의 크기를 지정합니다.
이건 뭐... 나름이겠지만... 일반적으로 해당 sound H/w의 DMA에서 처리할 수 있는 크기의 범위를 넣어주심 되겠습니다.

periods_min/max는 자연적으로 값이 나오겠죠? buffer_bytes 내에서 최소/최대 몇개의 period가 존재할 수 있겠냐인데...
대략, perios_min = buffer_bytes_max / period_byte_max 가 되겠죠.

이렇게 보면,
당연하게 buffer_byte_max가 period_byte_max보다 커야 되겠죠?
안그러면 data가 들어갈 공간도 없게 되고... 유지될 수 있는 periods_min도 0이 될테니까요.

실제로 구동시켜보면...
각 period는 buffer_bytes 내에서 일종의 선형 큐마냥,.. 돌아가면서 호출이 됩니다.

이 부분은.. 즉 buffer 관리는
play나 capture나 의미기 동일합니다.

ysh0988의 이미지

감사합니다~

많은 도움이 되었습니다~^^

아..이것때문에 골머리를 썩었더니......오늘 속도 안좋고....죽겠네요..ㅜㅜ

한가지 더 문의 드릴게있어서요..

pointer function이 불리우게 되는데..

pointer function이.. 현재까지 전송된 dma량을 frame단위로 return한다고 생각을 하는데..

제가 생각한것이 맞나요??

return값을 찍어보면

frame = 512
frame = 511
frame = 511
frame = 511
*interrupt*
frame = 1023
frame = 1023
frame = 1023
frame = 1023
*interrupt*
.
.
.

이런식으로 찍히는데요... 제생각으로는
511
1024
2047
4095
*interrupt*
모 이런식으로 되야할것같은데..........

ALSA를 처음 붙이는거라 이래저래 어렵네요..

도움의 손길좀 부탁드립니다..ㅜㅜ

drinkme의 이미지

기분나쁘게 생각치 마시고요...
일단은 문서를 숙지하시는 것이 좋습니다.
어떤것을 개발하려 하시던, 문서에 의존해서 시작하는 습관은 매우 중요합니다.

http://www.kernel.org/pub/linux/kernel/people/tiwai/docs/writing-an-alsa-driver/ch05s06.html#pcm-interface-operators-pointer-callback

보통은
pointer callback에서 해 줄 일이
DMA의 counter 값을 읽던지 해서 현재 전송중인 buffer 위치를 되돌려 주는 역할을 합니다.

근데, 이 pointer callback은 한 주기에 한번만 호출되는 것이 아니라,
ALSA에서 여러번 호출합니다. (기본적으로 snd_pcm_period_elapsed() 등이 호출될 때를 포함해서.)
그러니까, 여러번 호출되는 문제때문에 놀라실 필요는 없습니다.
이 pointer callback은 atomic하게.. 짧게 작성하시는 것이 좋습니다.

제가 보기엔 맨 첫번에 512인 것 빼고는 정상적인 듯 합니다.

ALSA는 OSS에서처럼
application과 driver가 1:1로 매칭되어서 동작되는 구조가 아닙니다.
그냥,... ALSA spec대로 application 작성하고,
ALSA spec대로 driver 작성하면,
ALSA famework이 이를 적절히 구동시키는 구조입니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.