SoundPool speelt goed wanneer andere taken op de achtergrond worden uitgevoerd en breekt wanneer het alleen wordt afgespeeld

Het vreemdste ding. Wanneer de animatie wordt afgespeeld, hoor ik mijn geluidseffect helder maar als ik de animatie niet heb, breekt het geluidseffect. Hier is de code:

private void Feedback(boolean success)
{
    Log.d(TAG, "Feedback");
    if(success)
    {
        PlayCreatureSound();
        ShowAnimatedCreature();
    }
    else
    {
        PlayFailedSound();
    }
}

private void PlayCreatureSound()
{
    Log.d(TAG, "PlayCreatureSound");
    AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
      float curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
      float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
      float leftVolume = curVolume/maxVolume;
      float rightVolume = curVolume/maxVolume;      
    spCreatureVoice.play(iCreatureVoicesId[lastCreature.ordinal()], leftVolume, rightVolume, 1, 0, 1);
}

private void PlayFailedSound()
{
    Log.d(TAG, "PlayFailedSound");
    spCreatureVoice.stop(iCreatureVoicesId[FeedbackCreature.FC_COUNT.ordinal()]);
    AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
      float curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
      float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
      float leftVolume = curVolume/maxVolume;
      float rightVolume = curVolume/maxVolume;      
    spCreatureVoice.play(iCreatureVoicesId[FeedbackCreature.FC_COUNT.ordinal()], leftVolume, rightVolume, 1, 0, 1);
}

private void ShowAnimatedCreature()
{
    Log.d(TAG, "ShowAnimatedCreature");
   //show the creature
    ibtnShapes[lastTargetLocation].setImageBitmap(bmCreatures[lastCreature.ordinal()]); 
   //animate
    ibtnShapes[lastTargetLocation].startAnimation(rotate[0]);
}

Ik heb al geprobeerd: 1. schakelen tussen bestanden 2. met behulp van MediaPlayer 3. verwijderen van "spCreatureVoice.stop (..." 4. veranderende prioriteit

1

2 antwoord

Het kan zijn dat u de FeedbackCreature-structuur gebruikt of dat u de stop-methode gebruikt. Probeer je tegelijkertijd twee geluidseffecten te spelen?

Omdat deze twee methoden zoveel code delen, raad ik aan om ze als volgt te combineren. Het kan u helpen het probleem te beperken.

private void Feedback(boolean success)
{
    Log.d(TAG, "Feedback");
    if(success)
    {
        int creatureOrdinal = lastCreature.ordinal();
        PlaySound(creatureOrdinal );
        ShowAnimatedCreature(creatureOrdinal );
    }
    else
    {
        int creatureOrdinal = FeedbackCreature.FC_COUNT.ordinal();
        spCreatureVoice.stop(iCreatureVoicesId[creatureOrdinal]);
        PlaySound(creatureOrdinal);
    }
}


private void PlaySound(int creatureOrdinal)
{
    Log.d(TAG, "PlayCreatureSound");
    AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
      float curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
      float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
      float leftVolume = curVolume/maxVolume;
      float rightVolume = curVolume/maxVolume;      
    spCreatureVoice.play(iCreatureVoicesId[creatureOrdinal], leftVolume, rightVolume, 1, 0, 1);
}

private void ShowAnimatedCreature(int creatureOrdinal)
{
    Log.d(TAG, "ShowAnimatedCreature");
   //show the creature
    ibtnShapes[lastTargetLocation].setImageBitmap(bmCreatures[creatureOrdinal]); 
   //animate
    ibtnShapes[lastTargetLocation].startAnimation(rotate[0]);
}
0
toegevoegd
Dus de enige andere is de methode spCreatureVoice.stop, of hoe deze methode wordt aangeroepen. Post de stop-methode en het deel van de code dat dit oproept in een geval van een fout in normale gevallen.
toegevoegd de auteur Noah, de bron
Geluidsgroepvermeldingen: Merk op dat omdat streams kunnen worden gestopt vanwege beperkte bronnen, de streamID een verwijzing is naar een bepaald exemplaar van een stream. Als de stream is gestopt om een ​​stream met een hogere prioriteit te kunnen afspelen, is de stream niet langer geldig. Het is de toepassing echter toegestaan ​​om zonder fouten de methoden op de streamID aan te roepen. Dit kan de programmalogica vereenvoudigen, omdat de applicatie zich niet bezig hoeft te houden met de levenscyclus van de stream. developer.android.com/reference/android/media/SoundPool.html
toegevoegd de auteur Noah, de bron
Uw code is een beetje schoner, maar mijn probleem blijft. Ik speel slechts 1 stream tegelijk, maar alleen als de animatie speelt, is het geluid helder. De animatie is een eenvoudige rotatie.
toegevoegd de auteur Redrori, de bron
De stop is onderdeel van de SoundPool api en ik heb geprobeerd het te verwijderen zonder verbetering. Feedback (true) werkt en Feedback (false) klinkt gebroken. Het enige dat ik kan bedenken is dat dit alleen gebeurt op de emulator of dat android dingen op de achtergrond draait als ik niet alle CPU's met de animatie laad.
toegevoegd de auteur Redrori, de bron
OK, dus ik heb geprobeerd het aantal streams in de SoundPool-constructor te verhogen en het streamtype zonder verbetering te wijzigen. Uit uw citaat hierboven en gezond verstand zou men denken dat het geluid zal breken wanneer de animatie wordt afgespeeld en niet andersom.
toegevoegd de auteur Redrori, de bron
Ik ben momenteel aan het kijken wat deze persoon heeft geschreven:
toegevoegd de auteur Redrori, de bron
toegevoegd de auteur Redrori, de bron
Proberen het geluid op een andere draad of dienst af te spelen, hebben mijn probleem niet opgelost
toegevoegd de auteur Redrori, de bron

Het lijkt erop dat dit een emulatorprobleem is. Geen problemen met het eigenlijke apparaat.

0
toegevoegd
Het is vrij goed bekend dat de emulator voor Android niet de beste is. Het is een goede tool, maar je zou moeten proberen de meeste van je testen op een apparaat uit te voeren. (tenminste totdat je moet testen op apparaten die je niet kunt betalen om meerdere te kopen;))
toegevoegd de auteur Codeman, de bron