]> git.mxchange.org Git - simgear.git/blobdiff - src/slScheduler.cxx
Removed gpc from Libs since this is not "free ware" and the author has
[simgear.git] / src / slScheduler.cxx
index 8edcf03bb0d4a784709ddc2109af2492adbecde7..5fe4caa91d4589a74519b938c11e17baa8c6fb0e 100644 (file)
@@ -1,6 +1,8 @@
 
 #include "sl.h"
 
+char *__slPendingError = NULL ;
+
 slScheduler *slScheduler::current = NULL ;
 
 void slScheduler::init ()
@@ -37,41 +39,33 @@ void slScheduler::init ()
   safety_margin = 1.0 ;
 
   mixer = NULL ;
-  mixer_buffer = NULL ;
-  spare_buffer1 [ 0 ] = NULL ;
-  spare_buffer1 [ 1 ] = NULL ;
-  spare_buffer1 [ 2 ] = NULL ;
-  spare_buffer2 [ 0 ] = NULL ;
-  spare_buffer2 [ 1 ] = NULL ;
-  spare_buffer2 [ 2 ] = NULL ;
+
+  mixer_buffer  = NULL ;
+  spare_buffer0 = NULL ;
+  spare_buffer1 = NULL ;
+  spare_buffer2 = NULL ;
 
   initBuffers () ;
 }
 
 void slScheduler::initBuffers ()
 {
-  if ( not_working () ) return ;
+  if ( not_working () )
+    return ;
 
   delete mixer_buffer ;
-  delete spare_buffer1 [ 0 ] ;
-  delete spare_buffer1 [ 1 ] ;
-  delete spare_buffer1 [ 2 ] ;
-  delete spare_buffer2 [ 0 ] ;
-  delete spare_buffer2 [ 1 ] ;
-  delete spare_buffer2 [ 2 ] ;
+  delete spare_buffer0 ;
+  delete spare_buffer1 ;
+  delete spare_buffer2 ;
 
   mixer_buffer_size = getDriverBufferSize () ;
 
   mixer_buffer = new Uchar [ mixer_buffer_size ] ;
   memset ( mixer_buffer, 0x80, mixer_buffer_size ) ;
 
-  spare_buffer1 [ 0 ] = new Uchar [ mixer_buffer_size ] ;
-  spare_buffer1 [ 1 ] = new Uchar [ mixer_buffer_size ] ;
-  spare_buffer1 [ 2 ] = new Uchar [ mixer_buffer_size ] ;
-
-  spare_buffer2 [ 0 ] = new Uchar [ mixer_buffer_size ] ;
-  spare_buffer2 [ 1 ] = new Uchar [ mixer_buffer_size ] ;
-  spare_buffer2 [ 2 ] = new Uchar [ mixer_buffer_size ] ;
+  spare_buffer0 = new Uchar [ mixer_buffer_size ] ;
+  spare_buffer1 = new Uchar [ mixer_buffer_size ] ;
+  spare_buffer2 = new Uchar [ mixer_buffer_size ] ;
 }
 
 slScheduler::~slScheduler ()
@@ -81,134 +75,27 @@ slScheduler::~slScheduler ()
 
   delete mixer_buffer ;
 
-  delete spare_buffer1 [ 0 ] ;
-  delete spare_buffer1 [ 1 ] ;
-  delete spare_buffer1 [ 2 ] ;
-  delete spare_buffer2 [ 0 ] ;
-  delete spare_buffer2 [ 1 ] ;
-  delete spare_buffer2 [ 2 ] ;
-}
-
-Uchar *slScheduler::mergeBlock ( Uchar *d )
-{
-  register int l = amount_left ;
-  amount_left = 0 ;
-  memset ( d, 0x80, l ) ;
-
-  return d + l ;
-}
-
-
-Uchar *slScheduler::mergeBlock ( Uchar *d, slSamplePlayer *spa )
-{
-  register int l = spa -> getAmountLeft () ;
-
-  if ( l > amount_left )
-    l = amount_left ;
-
-  amount_left -= l ;
-
-  memcpy ( d, spa->read(l, spare_buffer1[0], spare_buffer2[0]), l ) ;
-
-  return d + l ;
+  delete spare_buffer0 ;
+  delete spare_buffer1 ;
+  delete spare_buffer2 ;
 }
 
 
-Uchar *slScheduler::mergeBlock ( Uchar *d, slSamplePlayer *spa, slSamplePlayer *spb )
-{
-  int la = spa -> getAmountLeft () ;
-  int lb = spb -> getAmountLeft () ;
-
-  register int l = ( la < lb ) ? la : lb ;
-
-  if ( l > amount_left )
-    l = amount_left ;
-
-  amount_left -= l ;
 
-  register Uchar *a = spa -> read ( l, spare_buffer1[0], spare_buffer2[0] ) ;
-  register Uchar *b = spb -> read ( l, spare_buffer1[1], spare_buffer2[1] ) ;
-
-  while ( l-- ) *d++ = mix ( *a++, *b++ ) ;
-
-  return d ;
-}
-
-Uchar *slScheduler::mergeBlock ( Uchar *d, slSamplePlayer *spa, slSamplePlayer *spb, slSamplePlayer *spc )
-{
-  int la = spa -> getAmountLeft () ;
-  int lb = spb -> getAmountLeft () ;
-  int lc = spc -> getAmountLeft () ;
-
-  register int l = ( la < lb ) ?
-                   (( la < lc ) ? la : lc ) :
-                   (( lb < lc ) ? lb : lc ) ;
-
-  if ( l > amount_left )
-    l = amount_left ;
-
-  amount_left -= l ;
-
-  register Uchar *a = spa -> read ( l, spare_buffer1[0], spare_buffer2[0] ) ;
-  register Uchar *b = spb -> read ( l, spare_buffer1[1], spare_buffer2[1] ) ;
-  register Uchar *c = spc -> read ( l, spare_buffer1[2], spare_buffer2[2] ) ;
-
-  while ( l-- ) *d++ = mix ( *a++, *b++, *c++ ) ;
-
-  return d ;
-}
-
-
-void slScheduler::mixBuffer ()
-{
-  register Uchar *d = mixer_buffer ;
-
-  amount_left = mixer_buffer_size ;
-
-  while ( amount_left > 0 )
-    d = mergeBlock ( d ) ;
-}
-
-
-void slScheduler::mixBuffer ( slSamplePlayer *spa )
-{
-  register Uchar *d = mixer_buffer ;
-
-  amount_left = mixer_buffer_size ;
-
-  while ( amount_left > 0 )
-  {
-    int la = spa -> getAmountLeft () ;
-
-    if ( la > 0 ) /* Buffer has data left... */
-      d = mergeBlock ( d, spa ) ;
-    else          /* Buffer is empty */
-      d = mergeBlock ( d ) ;
-  }
-}
 
 
 void slScheduler::mixBuffer ( slSamplePlayer *spa, slSamplePlayer *spb )
 {
+  register int    l = mixer_buffer_size ;
   register Uchar *d = mixer_buffer ;
-  amount_left = mixer_buffer_size ;
 
-  while ( amount_left > 0 )
-  {
-    int la = spa -> getAmountLeft () ;
-    int lb = spb -> getAmountLeft () ;
+  register Uchar *a = spare_buffer0 ;
+  register Uchar *b = spare_buffer1 ;
 
-    if ( la > 0 && lb > 0 ) /* Both buffers have data left... */
-      d = mergeBlock ( d, spa, spb ) ;
-    else
-    if ( la > 0 && lb <= 0 ) /* Only the A buffer has data left... */
-      d = mergeBlock ( d, spa ) ;
-    else
-    if ( la <= 0 && lb > 0 ) /* Only the B buffer has data left... */
-      d = mergeBlock ( d, spb ) ;
-    else                     /* Both buffers are empty */
-      d = mergeBlock ( d ) ;
-  }
+  spa -> read ( l, a ) ;
+  spb -> read ( l, b ) ;
+
+  while ( l-- ) *d++ = mix ( *a++, *b++ ) ;
 }
 
 
@@ -216,53 +103,34 @@ void slScheduler::mixBuffer ( slSamplePlayer *spa, slSamplePlayer *spb )
 void slScheduler::mixBuffer ( slSamplePlayer *spa, slSamplePlayer *spb,
                               slSamplePlayer *spc )
 {
+  register int    l = mixer_buffer_size ;
   register Uchar *d = mixer_buffer ;
 
-  amount_left = mixer_buffer_size ;
+  register Uchar *a = spare_buffer0 ;
+  register Uchar *b = spare_buffer1 ;
+  register Uchar *c = spare_buffer2 ;
 
-  while ( amount_left > 0 )
-  {
-    int la = spa -> getAmountLeft () ;
-    int lb = spb -> getAmountLeft () ;
-    int lc = spc -> getAmountLeft () ;
+  spa -> read ( l, a ) ;
+  spb -> read ( l, b ) ;
+  spc -> read ( l, c ) ;
 
-    if ( lc > 0 )  /* C buffer has data left... */
-    {
-      if ( la > 0 && lb > 0 ) /* All three buffers have data left... */
-       d = mergeBlock ( d, spa, spb, spc ) ;
-      else
-      if ( la > 0 && lb <= 0 ) /* Only the A&C buffers have data left... */
-       d = mergeBlock ( d, spa, spc ) ;
-      else
-      if ( la <= 0 && lb > 0 ) /* Only the B&C buffers have data left... */
-       d = mergeBlock ( d, spb, spc ) ;
-      else                     /* Only the C buffer has data left */
-       d = mergeBlock ( d, spc ) ;
-    }
-    else
-    {
-      if ( la > 0 && lb > 0 ) /* Only the A&B buffers have data left... */
-       d = mergeBlock ( d, spa, spb ) ;
-      else
-      if ( la > 0 && lb <= 0 ) /* Only the A buffer has data left... */
-       d = mergeBlock ( d, spa ) ;
-      else
-      if ( la <= 0 && lb > 0 ) /* Only the B buffer has data left... */
-       d = mergeBlock ( d, spb ) ;
-      else                     /* All three buffers are empty */
-       d = mergeBlock ( d ) ;
-    }
-  }
+  while ( l-- ) *d++ = mix ( *a++, *b++, *c++ ) ;
 }
 
 
 void slScheduler::realUpdate ( int dump_first )
 {
-  int i ;
-
   if ( not_working () )
     return ;
 
+  if ( __slPendingError != NULL )
+  {
+    fprintf ( stderr, "%s", __slPendingError ) ;
+    exit ( 1 ) ;
+  }
+
+  int i ;
+
   while ( secondsUsed() <= safety_margin )
   {
     slSamplePlayer *psp [ 3 ] ;
@@ -312,10 +180,19 @@ void slScheduler::realUpdate ( int dump_first )
       }
     }
 
-    if ( pri[0] < 0 ) mixBuffer () ; else
-    if ( pri[1] < 0 ) mixBuffer ( psp[0] ) ; else
-    if ( pri[2] < 0 ) mixBuffer ( psp[0], psp[1] ) ; else
-                     mixBuffer ( psp[0], psp[1], psp[2] ) ;
+    if ( pri[0] < 0 )
+    {
+      memset ( mixer_buffer, 0x80, mixer_buffer_size ) ;
+      amount_left = 0 ;
+    }
+    else
+    if ( pri[1] < 0 )
+      psp[0] -> read ( mixer_buffer_size, mixer_buffer ) ;
+    else
+    if ( pri[2] < 0 )
+      mixBuffer ( psp[0], psp[1] ) ;
+    else
+      mixBuffer ( psp[0], psp[1], psp[2] ) ;
 
     if ( dump_first )
     {
@@ -333,6 +210,9 @@ void slScheduler::realUpdate ( int dump_first )
 
 void slScheduler::addCallBack ( slCallBack c, slSample *s, slEvent e, int m )
 {
+  if ( not_working () )
+    return ;
+
   if ( num_pending_callbacks >= SL_MAX_CALLBACKS )
   {
     fprintf ( stderr, "slScheduler: Too many pending callback events!\n" ) ;
@@ -349,6 +229,9 @@ void slScheduler::addCallBack ( slCallBack c, slSample *s, slEvent e, int m )
 
 void slScheduler::flushCallBacks ()
 {
+  if ( not_working () )
+    return ;
+
   /*
     Execute all the callbacks that we accumulated
     in this iteration.