Geluid overlapt met meerdere drukknoppen

Wanneer ik op een knop druk, druk dan op een andere, de geluiden overlappen elkaar. Hoe kan ik dat oplossen zodat het eerste geluid stopt als er een ander wordt ingedrukt?

 - (void)playOnce:(NSString *)aSound {

NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"];
AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
[theAudio setDelegate: self];
[theAudio setNumberOfLoops:0];
[theAudio setVolume:1.0];
[theAudio play];    
 }

- (void)playLooped:(NSString *)aSound {

NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"];
AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
[theAudio setDelegate: self];
// loop indefinitely
[theAudio setNumberOfLoops:-1];
[theAudio setVolume:1.0];
[theAudio play];
[theAudio release];


    }
0
je kunt een van de volgende dingen doen: 1. controleer wanneer de knop klikt of AVaudioplayer nog speelt. als dat zo is, kun je het negeren en niets doen of 2 je kunt het stoppen en dan het nieuwe geluid spelen.
toegevoegd de auteur atbebtg, de bron
Dubbele posting van Geluid stopt met spelen
toegevoegd de auteur Josh Caswell, de bron
Je moet eigenlijk een vraag stellen.
toegevoegd de auteur wbyoung, de bron
wat is een geluid?
toegevoegd de auteur Dor Bashan, de bron
hoeveel knoppen heb je? wat probeer je precies te bereiken? ik kan niet zien hoe noem je alle nietige methoden met 1 actie. Ik weet dat de afgevaardigde de beste manier heeft om met geluiden om te gaan. Wat zijn uw doelen?
toegevoegd de auteur Dor Bashan, de bron
nou ... probeer de if (! theAudio) {} te verwijderen en bekijk het
toegevoegd de auteur Dor Bashan, de bron
als ik de if (! theAudio) verwijder wanneer ik op meerdere knoppen druk, overlapt het geluid
toegevoegd de auteur alfred, de bron
mijn vraag is dat wanneer ik op één knop klik, het geluiden afspeelt maar dan klik ik op een andere knop en deze overlappen elkaar
toegevoegd de auteur alfred, de bron
- (void) playOnce: (NSString *) aSound;
toegevoegd de auteur alfred, de bron
- (IBAction) beatButton50 {[selfplayOnce: @ "raceauto's"]; }
toegevoegd de auteur alfred, de bron

6 antwoord

Voeg een vinkje toe om te zien of de speler al aan het begin van elke methode speelt:

if (theAudio.playing == YES) {
    [theAudio stop];
}

Referentie voor AVAudioPlayer-klassen

0
toegevoegd

In je playOnce-methode is de variabele 'path' ongebruikt - verwijder die om je waarschuwingsbericht te verwijderen. Je playOnce stelt niets in om te spelen, dus ik weet niet zeker hoe dat hoort te werken - tenzij je playLooped eerst belt? Je moet ook PrepToPlay aanroepen na de initWithContentsOfUrl.

 - (void)playOnce:(NSString *)aSound {

  NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"];
  if (theAudio && [theAudio isPlaying]) {
    [theAudio stop]
  } else {
         theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath: path] error: NULL];
         [theAudio prepareToPlay];

         [theAudio setDelegate: self];
    [theAudio setNumberOfLoops: 1];
    [theAudio setVolume: 1.0];
    [theAudio play];
  }

}
0
toegevoegd
Laat me eerst zeggen Welkom bij Stack Overflow. De manier waarop dit is bedoeld, is dat je één enkele samenhangende vraag stelt, wanneer je een antwoord op je vraag ontvangt, geef je dat antwoord aan door het te "controleren" met het vinkje. Dit is geen format dat bedoeld is als een doorlopende tutorial - je kunt niet blijven doorgaan met je oorspronkelijke vraag. Als je oorspronkelijke vraag nog niet is beantwoord, zal ik je hierbij helpen. U kunt overwegen een boek te lezen over Android-programmering, zodat u de basisprincipes leert als u net begint - dat is wat ik deed.
toegevoegd de auteur Alan Moore, de bron
U kunt de parameter aSound opslaan in een klaslid en vergelijken met uw parameter om te zien of ze anders zijn.
toegevoegd de auteur Alan Moore, de bron
Ah, ik begrijp wat je zegt. Ik veronderstel dat je moet controleren om te zien of je een ander geluid hebt en de speler in dat geval opnieuw moet laden.
toegevoegd de auteur Alan Moore, de bron
PrepToPlay toevoegen, heb je dat geprobeerd? Je moet de code die je hebt in playLoop wel bellen om de AVAudioPlayer in te stellen.
toegevoegd de auteur Alan Moore, de bron
hoe zou de code eruit zien
toegevoegd de auteur alfred, de bron
ik heb de code voor alle knoppen, maar hoe kan ik zien of ik een ander geluid speel en de speler opnieuw laden. Ik ben nieuw bij programmeren, dus ik weet niet veel
toegevoegd de auteur alfred, de bron
Ik heb ervoor gezorgd dat de geluiden niet meer overlappen, maar alleen datzelfde geluid wanneer ik op een andere knop probeer te drukken met een ander geluid
toegevoegd de auteur alfred, de bron
ik heb de playLoop-regel verwijderd omdat ik deze niet echt nodig had en ik heb de padenlijn verwijderd, maar er klinkt nog steeds geen geluid
toegevoegd de auteur alfred, de bron

U kunt waarschijnlijk iets als het volgende doen:

    (void) playLooped: (NSString * ) aSound {
        NSString * path = [[NSBundle mainBundle] pathForResource: aSound ofType: @"caf"];

    //stop audio player from playing so the sound don't overlap
    if([theAudio isPlaying])
    {
        [theAudio stop]; //try this instead of stopAudio

    }

    if (!theAudio) {
        theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath: path] error: NULL];
    } 
    [theAudio setDelegate: self];
   //loop indefinitely
    [theAudio setNumberOfLoops: -1];
    [theAudio setVolume: 1.0];
    [theAudio play];
}
0
toegevoegd
Ik wilde zeggen: trace. zet een breekpunt in uw code
toegevoegd de auteur atbebtg, de bron
hebt u de code geruild en zorgt u ervoor dat de [theAudio stop] wordt aangeroepen?
toegevoegd de auteur atbebtg, de bron
ik heb mijn code bewerkt. Ik verander stopAudio met [theAudio stop];
toegevoegd de auteur atbebtg, de bron
hoe handel ik de code, moet ik hem vrijgeven, het is nieuw in programmeren, ik probeer het nog steeds te leren
toegevoegd de auteur alfred, de bron
het is raar dat de audio nog steeds overlapt wanneer ik op meerdere knoppen druk
toegevoegd de auteur alfred, de bron
het vertelt me ​​dat de stopAudio niet is gevonden
toegevoegd de auteur alfred, de bron
het geeft me een foutmelding als ik die code installeer
toegevoegd de auteur alfred, de bron

U moet een BOOL-waarde gebruiken om dit goed te laten werken.

in je .m-bestand VOORDAT @implementation dit heeft geplaatst:

static BOOL soundIsPlaying = NO;

Dan moet je IBAction er ongeveer zo uitzien:

- (IBAction)play {
    if (soundIsPlaying == YES) {
        [theAudio release];
        soundIsPlaying = NO;

    }

    else if (soundIsPlaying == NO) {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"SOUNDFILENAME" ofType:@"wav"];
        theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
        theAudio.delegate = self;
        theAudio.volume = 1.0;
        theAudio.numberOfLoops = 0;
        [theAudio play];
        soundIsPlaying = YES;

    }   
}

dat is eerlijk gezegd. Het zal het geluid stoppen wanneer een andere knop wordt ingedrukt.

0
toegevoegd

Verklaar uw AVAudioPlayer in de header van viewController (niet elke keer dat u een geluid afspeelt een nieuwe toewijzen). Op die manier heeft u een aanwijzer die u kunt gebruiken in een StopAudio-methode.

@interface myViewController : UIViewController  { 
    AVAudioPlayer *theAudio;
}
@property (nonatomic, retain) AVAudioPlayer *theAudio;
@end


@implementation myViewController
@synthesize theAudio;
- (void)dealloc {
    [theAudio release];
}
@end



- (void)playOnce:(NSString *)aSound {
    NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"];
    if(!theAudio){
        theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath:path] error:NULL];
    }
    [theAudio setDelegate: self];
    [theAudio setNumberOfLoops:0];
    [theAudio setVolume:1.0];
    [theAudio play];
}

- (void)playLooped:(NSString *)aSound {
    NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"];
    if(!theAudio){
        theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath:path] error:NULL];
    }
    [theAudio setDelegate: self];
   //loop indefinitely
    [theAudio setNumberOfLoops:-1];
    [theAudio setVolume:1.0];
    [theAudio play];
}

- (void)stopAudio {
    [theAudio stop];
    [theAudio setCurrentTime:0];
}

also be sure to read the Apple Docs

0
toegevoegd
ja, gebruik de stopAudio-methode die ik hierboven heb verstrekt.
toegevoegd de auteur ader, de bron
Stop vervolgens de AVAudioPlayer voordat u het volgende geluid afspeelt.
toegevoegd de auteur ader, de bron
zojuist bewerkte code hierboven. kun je beschrijven wat je probeert te bereiken in meer detail?
toegevoegd de auteur ader, de bron
ik heb de code gebruikt die je me gaf en wanneer ik op een knop klik, crasht het programma
toegevoegd de auteur alfred, de bron
hoe zal ik de AVAudioPlayer in het header-bestand maken, ik ben hier nieuw voor en weet niet veel
toegevoegd de auteur alfred, de bron
wat zal de code zijn om dit te repareren
toegevoegd de auteur alfred, de bron
voor het stoppen van de AVAudioPlayer gebruik ik alleen de stop-methode
toegevoegd de auteur alfred, de bron
ik heb die regel codes toegevoegd en de geluiden overlappen elkaar nog steeds
toegevoegd de auteur alfred, de bron
ik maak een app met 20 knoppen en elke speelt een ander geluid maar de geluiden overlappen elkaar als ik op andere knoppen klik
toegevoegd de auteur alfred, de bron

De code die je hebt gepost, zal slechts één geluid afspelen, het eerste geluid dat naar de methode wordt gestuurd.

Als u na het stoppen van de speler slechts één verwisselbaar geluid wilt afspelen, laat u de audio los en stelt u vervolgens het nieuwe geluid in.

0
toegevoegd
hoe laat ik de audio vrij en stel ik de nieuwe in
toegevoegd de auteur alfred, de bron