출처 : http://furmuwon.egloos.com/11074224
내가 지금 필요한 정보랑 맞는지 모르겠지만
리눅스 응용프로그램 개발 과정 중
sound 업무를 진행 중이다
sound file(/dev/snd/pcmC0D0p)에 직접 write 하는데
state 가 안맞아서 그런지 ioctl_start 시 Broken pipe error 를 return 함
관련해서 구글링 하던 중 찾은 정보 임
--------------------------------------------------------------------------------------------------------------------
snd_pcm_attach_substream (open시) SNDRV_PCM_STATE_OPEN 로 세팅
snd_pcm_hw_params 에서 SNDRV_PCM_STATE_SETUP 로 세팅
snd_pcm_post_prepare(prepare) 에서 SNDRV_PCM_STATE_PREPARED 로 세팅
prepare시 SNDRV_PCM_STATE_OPEN 이나 SNDRV_PCM_STATE_DISCONNECTED 상태면 에러 -EBADFD
SNDRV_PCM_STATE_RUNNING, SNDRV_PCM_STATE_DRAINING && SNDRV_PCM_STREAM_PLAYBACK 상태면 에러 -BUSY
snd_pcm_do_reset 함수로 하여 포지션값 거의 리셋됨.
SNDRV_PCM_IOCTL_START ioctl 로 SNDRV_PCM_STATE_RUNNING 로 세팅
SNDRV_PCM_STATE_PREPARED 상태가 아니면 -EBADFD
SNDRV_PCM_IOCTL_WRITEI_FRAMES ioctl 에서
SNDRV_PCM_STATE_OPEN 상태면 -EBADFD
SNDRV_PCM_STATE_PREPARED,SNDRV_PCM_STATE_RUNNING,SNDRV_PCM_STATE_PAUSED 상태면 OK
그 외 상태는 모두 ERROR -EBADFD
SNDRV_PCM_STATE_XRUN - EPIPE
SNDRV_PCM_STATE_SUSPENDED -ESTRPIPE
snd_pcm_start 함수 에서 SNDRV_PCM_STATE_RUNNING 로 세팅. ( 이전에 꼭 SNDRV_PCM_STATE_PREPARED 상태어야 한다 )
SNDRV_PCM_IOCTL_DROP ioctl snd_pcm_drop(stop) 이면
SNDRV_PCM_STATE_OPEN,SNDRV_PCM_STATE_DISCONNECTED,SNDRV_PCM_STATE_SUSPENDED 상태면 -EBADFD
SNDRV_PCM_STATE_PAUSED 상태면 pause 푼다.
snd_pcm_stop 호출 하면서 SNDRV_PCM_STATE_SETUP로 변경 한다.
pause 에서
push 1 이면 SNDRV_PCM_STATE_PAUSED 로
push 0 이면 SNDRV_PCM_STATE_RUNNING 상태로
drop 이후에 꼭 prepare 와 write 상태로 호출 되어야 한다.
#define SNDRV_PCM_STATE_OPEN ((__force snd_pcm_state_t) 0) /* stream is open */
#define SNDRV_PCM_STATE_SETUP ((__force snd_pcm_state_t) 1) /* stream has a setup */
#define SNDRV_PCM_STATE_PREPARED ((__force snd_pcm_state_t) 2) /* stream is ready to start */
#define SNDRV_PCM_STATE_RUNNING ((__force snd_pcm_state_t) 3) /* stream is running */
#define SNDRV_PCM_STATE_XRUN ((__force snd_pcm_state_t) 4) /* stream reached an xrun */
#define SNDRV_PCM_STATE_DRAINING ((__force snd_pcm_state_t) 5) /* stream is draining */
#define SNDRV_PCM_STATE_PAUSED ((__force snd_pcm_state_t) 6) /* stream is paused */
#define SNDRV_PCM_STATE_SUSPENDED ((__force snd_pcm_state_t) 7) /* hardware is suspended */
#define SNDRV_PCM_STATE_DISCONNECTED ((__force snd_pcm_state_t) 8) /* hardware is disconnected */