2010-05-01 27 views
3

Je voudrais savoir si quelqu'un connaît une bibliothèque pour modifier la vitesse de lecture d'une piste en temps réel. Mon idée est de charger une piste et de changer sa vitesse de lecture à la moitié ou au double. Tout d'abord, j'ai essayé avec MusicPlayer mais ce n'était pas possible du tout et j'ai ensuite essayé avec SoundPool. Le problème est qu'avec SoundPool je ne peux pas changer le taux une fois que la piste est chargée. Voici le code que je utilise (preuve de concept):Modifier le taux de lecture d'une piste en temps réel sur Android

float j = 1; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Button b = (Button)findViewById(R.id.Button01); 
    b.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      j = (float) (j +.5); 

     } 
    }); 

    AssetFileDescriptor afd; 
    try { 

     SoundPool sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0); 

     afd = getAssets().openFd("wav/sample.wav"); 
     int id = sp.load(afd, 1); 
     sp.play(id, 1, 1, 1, 0, j); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Lorsque j'appuie sur la touche, la vitesse de lecture devrait augmenter, mais il ne se produit pas. Une idée de comment changer le taux en temps réel?

Merci d'avance.

Répondre

1

vous appelez sp.play une fois, au moment où cette fonction est appelée, la valeur de j est copiée dans cette fonction.

Changer j ne change pas après la valeur de j dans la fonction (on appelle cela passe par la valeur)

Pour modifier le taux de jeu après que vous devez appeler sp.setRate (StreamID, j) à l'intérieur votre bouton cliquez sur l'écouteur.

Notez que StreamID est renvoyé par la fonction sp.play, donc stockez-le en tant que variable dans la classe.

Ce code devrait fonctionner (je ne l'ai pas le tester):

float j = 1.0f; 
SoundPool sp = null; 
int sID = 0; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Button b = (Button)findViewById(R.id.Button01); 
    b.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      j = (float) (j +.5f); 
      sp.setRate(sID,j); 

     } 
    }); 

    AssetFileDescriptor afd; 
    try { 

     sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0); 

     afd = getAssets().openFd("wav/sample.wav"); 
     int id = sp.load(afd, 1); 
     sID = sp.play(id, 1, 1, 1, 0, j); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

bien qu'il va probablement tomber en panne après une pression de bouton couple, SOUNDPOOL ne supporte que les taux de 0,5 à 2,0. Vous devez ajouter une vérification pour vous assurer que j reste dans ces limites.

+0

Salut Mark! Merci pour votre réponse, j'ai essayé et vous avez raison. Maintenant j'ai un autre problème, peut-être vous savez comment le résoudre aussi: quand j'exécute le programme, parfois j'obtiens cette erreur: ERROR/AudioCache (31): Dépassement de taille de tas! taille de req: 1058400, taille maximale: 1048576 . Mon idée est de charger des morceaux avec la taille deux fois (au moins) la taille du fichier chargé, donc je pense que je ne serai pas en mesure d'utiliser SoundPool pour cela. Qu'est-ce que tu penses? Merci – ahmontero

+0

TBH SoundPool est un buggy de **** l'un des bugs que vous rencontrerez est que chaque pool de sons doit avoir au plus 1 Mo de données son associées, que ce soit dans 1 fichiers ou 10. Son vraiment fait pour jouer de petits effets sonores. Googling pour les bogues SoundPool se révélera un peu plus, vous devrez faire attention si vous l'utilisez. Si vous devez travailler avec des pistes plus grandes, je vous recommande de créer votre propre moteur de son et de vider les échantillons bruts sur une instance AudioTrack. – Mark

+0

Quelque chose j'ai oublié de mentionner, la limite de 1 Mo est sur la taille du fichier brut, de sorte que vous pouvez compresser vos fichiers wav à ogg et peut-être contourner la limitation de SoundPool – Mark