next up previous
Next: About this document Up: Correction des problèmes de Previous: Nouvelles bibliothèques

Correction des bugs des machines SGI

La lecture des sons sur les machines SGI fonctionnait bien pour quasiment tous les sons sauf pour ceux échantillonné en flottants, et nécessitant une inversion des octets (Big tex2html_wrap_inline75 Little Endian).

Après étude du code existant, je me suis apperçu que la fonction copyShortToPlay effectue la conversion en short et l'inversion éventuelle de l'ordre des octets.
Il s'est avéré qu'elle était éronnée dans le cas des échantillons en float. En effet, 2 erreurs se trouvaient dans la partie DATA_TYPE_FLOAT :

  1. La multiplication par 32768 était effectuée sur le pointeur et non sur la valeur pointée par celui-ci ! D'où (gros) problème...
  2. La multiplication se faisait avant le swapFloat. Cette fonction est utilisée pour inverser l'ordre des octets, lorsque cela est nécessaire. Il faut donc effectuer la multiplication APRES l'inversion des octets.

J'ai donc aboutit au code suivant (où pvalues pointe sur le buffer à jouer) :

case DATA_TYPE_FLOAT:
   if (buffer->swap)	      
      for (i = 0; i < length && pvalues < pvaluesMax; i++)
      {
         float tmp = *((float *) pvalues);
         swapFloat(&tmp);
         tmp = tmp * 32768.0 * level;
	    
         pvalues += step;
         *(ptr++) = (short) tmp;
      }
   else
      for (i = 0; i < length && pvalues < pvaluesMax; i++)
      {
         *(ptr++) = (short) (*((float *) pvalues) * 32768.0 * level);
         pvalues += step;
      }
break;



Gauthier Lebrun
Wed Apr 23 09:37:43 MET DST 1997