> your question about lockups doesn't really contain enough information.
> are you running with SCHED_FIFO? are you accessing both playback and
> capture streams? what else does your code do?
>

I don't know what SCHED_FIFO is, I never heard it before, so I think I don
not use it... :) Maybe someone could explain that to me ?

I am acessing the record and the play stream. Both streams are intitalized
with
48 channels,
SND_PCM_ACCESS_RW_NONINTERLEAVED,
S32_LE,
44100Hz,
buffer size=8192,
period size = 4096

The main loop looks like this (Buffers is an int** with enough memory
allocated for each channel), it's just doing an input-output-streaming:

while(1)
{
  AlsaRecord.wait();
  AlsaRecord.ReadQueue( Buffers );

  // do some arithmetic processing on the Buffers... (volscale)

  AlsaPlay.wait();
  AlsaPlay.WriteQueue( Buffers );
}

The wait() does only the following:
snd_pcm_wait( m_handle, 1000 );

Maybe the ReadQueue and WriteQueue functions are useful:

int TAlsaSoundRecord::ReadQueue( void** &Buffers )
{
  static int readn, err;

  do
    readn = snd_pcm_readn( m_handle, Buffers, m_chunk_size );
  while( readn == -EAGAIN );

  if( readn == -EPIPE )
  {
    cout << "ReadQueue: Underrun occurred! Trying recovery..." << endl;
    err = snd_pcm_prepare( m_handle );
    if( err < 0 )
    {
      cerr << "Can't recover from underrun, prepare failed: " <<
snd_strerror( err ) << endl;
      exit( 1 );
    }
    cout << "ok" << endl;
  }
  if ( readn < 0 && readn != -EPIPE )
  {
    cout << "ReadQueue: " << strerror( -readn ) << endl;
    exit( 1 );
  }
  else
    return 0;
}


int TAlsaSoundPlay::WriteQueue( void** &Buffers )
{
  static int writen, err;

  do
    writen = snd_pcm_writen( m_handle, Buffers, m_chunk_size );
  while( writen == -EAGAIN );

  if( writen == -EPIPE )
  {
    cout << "WriteQueue: Underrun occurred! Trying recovery..." << endl;
    err = snd_pcm_prepare( m_handle );
    if( err < 0 )
    {
      cerr << "Can't recover from underrun, prepare failed: " <<
snd_strerror( err ) << endl;
      exit( 1 );
    }
    cout << "ok" << endl;
  }
  if ( writen < 0 && writen != -EPIPE )
  {
    cout << "WriteQueue: " << strerror( -writen ) << endl;
    exit( 1 );
  }
  else
    return 0;
}



Sorry for the huge mail, but I have no idea where in the code I've made a
mistake...




>
> oh, and that "defective" hammerfall almost certainly had an M52 EPROM
> rather than an W52 EPROM, hence the reversed byte-order (its for big
> endian systems like the macs).
>

yes, you're right. The cards contained the M52 bios. However, the
lockup-setup described above has the W52 chips installed.

Thank you,
Robert



_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to