Thanks, jp_liu.  I will try that out.  This is similarly to David Conrad's 
initial breakthrough post a while back but it sounds promising.  By the way, I 
too am using the McASP as the master and not the AIC33 codec.

Regards,
Andy


----- Original Message ----
From: jp_liu <[EMAIL PROTECTED]>
To: Andy Ngo <[EMAIL PROTECTED]>; Andrew Armstrong <[EMAIL PROTECTED]>; PQuiney 
<[EMAIL PROTECTED]>; davinci-linux-open-source 
<[email protected]>
Sent: Tuesday, June 24, 2008 7:25:08 PM
Subject: Re: Re: RE: Buggy Audio Driver

Mail 
Andy Ngo,Andrew Armstrong,PQuiney,davinci-linux-open-source,
 
I also spent many days debug this issue, and I change some codes, until  now, 
It looks run well.
 
1st, commented out the marco #define AIC33_MASTER  in davinci-audio-aic33.c
2nd, function sound_dma_irq_handler() in davinci-audio-dma-intfc.c, I  change 
it like this:
static void sound_dma_irq_handler(int sound_curr_lch, u16 ch_status, void*  
data)
{
    ....
    /*
    AUDIO_INCREMENT_HEAD(s);
    audio_stop_dma(s);
    */
    audio_stop_dma(s);
    AUDIO_INCREMENT_HEAD(s);
    ....
} 
I think it is the point what cause lockup in read/write
 
3rd. function audio_dsr_handler() in davinci-audio-dma-intfc.c, I commented  
out AUDIO_INCREMENT_HEAD(s) when AUDIO_QUEUE_EMPTY(s) is true.
 
you can try this, good luck.
 
[EMAIL PROTECTED]
2008-06-25 
-----  Original Message ----- 
From: Andy Ngo 
To: andrewa,Phil  Quiney,davinci-linux-open-source 
Sent: 2008-06-25, 09:12:33
Subject: Re: RE: Buggy Audio Driver

Andrew,
 
I  spent many a day debugging the audio driver write lockup issue and to this  
day, I still haven't figured it out.  However, I did pinpoint the  hanging 
problem when closing the device to an "audio_sync" call in the  audio_release 
function in davinci-audio.c.  Try this, comment out the  call to audio_sync in 
the function audio_release in  linux-davinci-2.6/sound/oss/davinci-audio.c:
 
static  int audio_release(struct inode *inode, struct file  *file)
{
 audio_state_t *state =  file->private_data;
 audio_stream_t *os =  state->output_stream;
 audio_stream_t *is =  state->input_stream;
 FN_IN;
 down(&state->sem);
 if  (file->f_mode & FMODE_READ)  {
  audio_discard_buf(is);
  DMA_FREE(is);
  is->dma_spinref  = 0;
  if (state->need_tx_for_rx)  {
   os->spin_idle = 0;
   if  (!state->wr_ref)  {
    DMA_FREE(os);
    os->dma_spinref  = 0;
   }
  }
  state->rd_ref =  0;
 }
 if  (file->f_mode & FMODE_WRITE)  {
  //audio_sync(file);   // <==  COMMENT this out
  audio_discard_buf(os);
  if  (!state->need_tx_for_rx || !state->rd_ref)  {
   DMA_FREE(os);
   os->dma_spinref =  0;
  }
  state->wr_ref = 0;
 }
.
.
.
}
 
This  works for me and I never get a hang when my application closes the  
device.  This is probably not the proper solution but until someone can  write 
a better audio driver (like porting it to ALSA), this will have to be it  for 
now.
 
As  for the write lockup, we're using a recovering logic to detect the stall 
and  just force the audio driver to reset (losing a few seconds of audio).  I  
don't know if this matters but according to the OSS API guide 
(http://www.opensound.com/pguide),  the fragment size should be a power of 2; 
the default fragment size  (AUDIO_FRAGSIZE_DEFAULT) is 3072, which is not a 
power of 2.  I tried  changing that to 4096 but it didn't help.
 
If  anyone out there has found a fix to the write lockup issue, please  
share!!!  Thank you.
 
Regards,
Andy


-----  Original Message ----
From: "[EMAIL PROTECTED]"  <[EMAIL PROTECTED]>
To: Phil Quiney  <[EMAIL PROTECTED]>;  
[email protected]
Sent: Tuesday, June 24, 2008  12:37:55 PM
Subject: Re: RE: Buggy Audio Driver

Hi  Phil,

Thank you for your comments. I am disappointed to say, that the  sample code is 
only one of several methods I have attempted to get working  properly. I do 
attempt to initialise the device prior to calling this  function.

It is strange that our tests show the program hanging when  trying to close the 
device. 

I implemented a version which did not  close the device, however the OS had 
just as little luck in trying to close  the handle.

If you have any code I could test as an audio 'loopthrough'  function I would 
be most interested. I am keen to get something stable  going.

Will use O_RDWR in  future!

Regards,

Andrew


At 10:32 24/06/2008, "Phil  Quiney" wrote:


Hi,

I think your program is not helping by  reading too small chunks.

You have not configured the speed of the  device, the bits/sample number of 
channels etc - so what format is it using  by default???

Your read will block giving plenty of scope for the  output under running as 
well....

General advice on audio (initially  from a guy at MV)

1/ Check for available data input before reading  (do not do blocking reads). 
This is not an issue if you are only doing input  but for full duplex it 
matters.

2/ Empty the device by reading as  much data as you can.

3/ Read in multiples of the fragment  size.

4/ Check for available output space before the write - the  write will not 
block if it can accept the data.

5/ Write in multiples  of the fragment size.

Using the above advice we can usually get  several hours of full duplex audio 
before it dies.

I can let you have  the audio test program(s) we give to customers if you want 
to give that a  go.

As a final note - if you want the code to be portable across many  targets, I 
suggest you change the 'open' to be O_RDWR as most OSS audio  drivers will fail 
to open the second time.

Regards

Phil Q 


Phil Quiney, Senior Software Engineer
Trinity  Convergence
Cambridge Business Park
Cowley Road
Cambridge CB4 0WZ,  UK
T: +44(0)1223-435536
F: +44(0)1223-435560
www.trinityconvergence.com


-----Original  Message-----
From: [EMAIL PROTECTED]  [mailto:[EMAIL PROTECTED] On Behalf Of  Andrew 
Armstrong
Sent: 24 June 2008 10:41
To:  [email protected]
Subject: Buggy Audio  Driver

Hi Guys,

I have been playing with the audio driver. All  I want to do is a simple 
loopthrough function, however, I am finding that  the driver locks up quite 
randomly when its file handles are being  closed.

Has anyone else come up with this issue? I have attached the  function I am 
playing with, if anyone can replicate the issue I would be  most interested. 
Sometimes it can run several times with no issue and other  times lock-up each 
time it is  executed.

Regards,

Andrew


void audioloop(unsigned  char timesecs)
{
int fdr;
int fdw;
unsigned char  buffer[64];
unsigned char done = 0;

if(  (fdr=open("/dev/sound/dsp",O_RDONLY)) < 0)
{
printf( "Sound Input  Port failed!\n");
}
else
{
if(  (fdw=open("/dev/sound/dsp",O_WRONLY)) < 0)
{
printf( "Sound Output  Port  failed!\n");
}
else
{

time(&starttime);

while  (done==0)
{
        read(fdr,buffer,64);
ioctl(fdr, SOUND_PCM_SYNC, 0);
       write(fdw,buffer,64);
if (timesecs >  0)
{
time(&currenttime);
if ((int)(currenttime - starttime)  > timesecs)
{
done=1;
}
}
}
close (fdr);
        }
printf( "Closing sound port ...\n");
close  (fdw);
printf( "...  Done\n");
}
}

_______________________________________________
Davinci-linux-open-source  mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
_______________________________________________
Davinci-linux-open-source  mailing  list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to