- 论坛徽章:
- 0
|
/*
* audio_read
*
* Audio capture function.
*/
static int audio_read
(
struct file *file,
char * user_buffer,
size_t count,
loff_t * ppos
)
{
char * user_buffer_start = user_buffer;
audio_state_t * state = (audio_state_t *)file->private_data;
audio_stream_t * stream = state->input_stream;
unsigned int user_buffer_xfer_count = 0, dma_buffer_xfer_count = 0;
int ret = 0;
DPRINTK("EP93xx - audio_read: count=%d\n", count);
if (ppos != &file->f_pos)
return -ESPIPE;
if( !access_ok( VERIFY_WRITE, user_buffer, count ) )
{
DPRINTK( "access_ok failed for audio_read!!!!\n" );
return -EFAULT;
}
while (count > 0)
{
/*
* Get the current buffer.
*/
audio_buf_t * dma_buffer = stream->dma_buffer;
/*
* Wait for a dma buffer to become full
*/
if (file->f_flags & O_NONBLOCK)
{
//DPRINTK("file->f_flags & O_NONBLOCK\n");
ret = -EAGAIN;
if(dma_buffer->owner != 0)
break;
}
else
{
while (dma_buffer->owner == 1) {
if (signal_pending(current))
return -ERESTARTSYS;
wait_event_interruptible(stream->wq,dma_buffer->owner!=1);
}
}
/*
* How much user buffer would a whole DMA buffer fill?
*/
user_buffer_xfer_count = dma_buffer->size;
if (user_buffer_xfer_count > count)
user_buffer_xfer_count = count;
dma_buffer_xfer_count = user_buffer_xfer_count;
if( copy_to_user(user_buffer,
dma_buffer->start + stream->fragsize - dma_buffer->size,
user_buffer_xfer_count) <= 0 )
return -EFAULT;
因为程序比较的大,我只能考一部分出来,其它的部分通过屏蔽copy...这个函数进行了测试,没什么问题,希望大家能帮忙看看 |
|