我编了一个录音的小程序,在PC的linux下没有问题,在ZLG MagicARM2410试验开发平台的arm linux下运行就是不行,录不了音。<br />以下是代码:<br /><br /><blockquote><br />#include <stdio.h><br />#include <stdlib.h><br />#include <errno.h><br />#include <time.h><br />#include <fcntl.h><br />#include <sys/soundcard.h><br /><br />int main( int argc, char *argv[] )<br />{<br /> int format = AFMT_S16_NE; // AFMT_S16_NE AFMT_U8<br /> int channels = 2;<br /> int speed = 44100;<br /> <br /> size_t buf_size = 819200;<br /> char *buf;<br /><br /> printf( "update date:%s %s
", __DATE__, __TIME__ );<br /><br /><br /> buf = malloc( buf_size );<br /> if( buf == NULL ) return printf( "[%d] buf malloc error!
!", errno );<br /> <br /> if( argc > 1 ) // play<br /> {<br /> int dd, fd;<br /> int bytes;<br /><br /> dd = open( "/dev/dsp", O_WRONLY );<br /> if( dd == -1 ) return printf( "[%d] device open error!
", errno );<br /><br /> if( ioctl(dd,SNDCTL_DSP_SYNC,0) == -1 ) return printf( "[%d] ioctl(SNDCTL_DSP_SYNC) error!
", errno );<br /><br /> if( ioctl(dd,SNDCTL_DSP_SETFMT,&format) == -1 ) return printf( "[%d] ioctl(SNDCTL_DSP_SETFMT) error!
", errno );<br /><br /> if( ioctl(dd,SNDCTL_DSP_CHANNELS,&channels) == -1) return printf( "[%d] ioctl(SNDCTL_DSP_CHANNELS) error!
", errno );<br /><br /> if( ioctl(dd,SNDCTL_DSP_SPEED,&speed) == -1 ) return printf( "[%d] ioctl(SNDCTL_DSP_SPEED) error!
", errno );<br /> <br /> fd = open( "rec", O_RDONLY );<br /> if( fd == -1 ) return printf( "[%d] file open error!
", errno ); <br /> <br /> printf( "start play ...
" );<br /> while( (bytes=read(fd,buf,buf_size)) > 0 )<br /> {<br /> bytes = write( dd, buf, bytes );<br /> if( bytes == -1 ) return printf( "[%d] device play error!
", errno );<br /> }<br /> <br /> if( bytes != 0 ) return printf( "[%d] file read error!
", errno );<br /> }<br /> else // record<br /> {<br /> int dd, fd;<br /> clock_t start_time;<br /><br /> dd = open( "/dev/dsp", O_RDONLY );<br /> if( dd == -1 ) return printf( "[%d] device open error!
", errno );<br /><br /> if( ioctl(dd,SNDCTL_DSP_SYNC,0) == -1 ) return printf( "[%d] ioctl(SNDCTL_DSP_SYNC) error!
", errno );<br /><br /> if( ioctl(dd,SNDCTL_DSP_SETFMT,&format) == -1 ) return printf( "[%d] ioctl(SNDCTL_DSP_SETFMT) error!
", errno );<br /><br /> if( ioctl(dd,SNDCTL_DSP_CHANNELS,&channels) == -1) return printf( "[%d] ioctl(SNDCTL_DSP_CHANNELS) error!
", errno );<br /><br /> if( ioctl(dd,SNDCTL_DSP_SPEED,&speed) == -1 ) return printf( "[%d] ioctl(SNDCTL_DSP_SPEED) error!
", errno );<br /><br /> fd = open( "rec", O_WRONLY|O_CREAT );<br /> if( fd == -1 ) return printf( "[%d] file open error!
", errno );<br /> <br /> printf( "start record ...
" );<br /> start_time = clock();<br /> while( clock() - start_time < CLOCKS_PER_SEC * 5 )<br /> {<br /> int bytes;<br /> <br /> bytes = read( dd, buf, buf_size ); // 在ARM平台下这里始终返回0<br /> if( bytes == -1 ) return printf( "[%d] device record error!
", errno );<br /> <br /> bytes = write( fd, buf, bytes );<br /> if( bytes == -1 ) return printf( "[%d] file write error!
", errno );<br /> }<br /> <br /> close( fd );<br /> close( dd );<br /> }<br /> <br /> printf( "end.
" );<br /><br /> return 0;<br />}<br /></blockquote><br /><br />调用read对声音设备操作始终返回0。<br /><br />我对麦克风讲话时也没听见耳机有任何声音,怀疑是麦克风没开或音量太小,哪位前辈来指点一下啊?<br /> |
|