UISwitch con AVAudioPlayer

Tengo un problema en la sección de reproducción de sonido. Cuando apago el interruptor, el verificador de sonido cambia su valor a NO, pero el reproductor de audio no se detiene. ¿Qué sucede, muchachos?

-(IBAction)Settings {
    if(settingsview==nil) {
        settingsview=[[UIView alloc] initWithFrame:CGRectMake(10, 130, 300, 80)];
        [settingsview setBackgroundColor:[UIColor clearColor]];

        UILabel *labelforSound = [[UILabel alloc]initWithFrame:CGRectMake(15, 25, 70, 20)];
        [labelforSound setFont:[UIFont systemFontOfSize:18]];
        [labelforSound setBackgroundColor:[UIColor clearColor]];
        [labelforSound setText:@"Sound"];

        SoundSwitch = [[UISwitch alloc]initWithFrame:CGRectMake(10, 50, 20, 20)];
        SoundSwitch.userInteractionEnabled = YES;

        if(soundchecker == YES) [SoundSwitch setOn:YES];
        else [SoundSwitch setOn:NO];
        [SoundSwitch addTarget:self action:@selector(playsound:) forControlEvents:UIControlEventValueChanged];

        [settingsview addSubview:labelforSound];
        [settingsview addSubview:SoundSwitch];
        [self.view addSubview:settingsview];
   }

   else {
        [settingsview removeFromSuperview];
        [settingsview release];
        settingsview=nil;
   }
}

//-------Reproducir sonido------------------//

-(void)playsound:(id) sender {
    NSString *pathtosong = [[NSBundle mainBundle]pathForResource:@"Teachme" ofType:@"mp3"];
    AVAudioPlayer* audioplayer = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:pathtosong] error:NULL];
    if(SoundSwitch.on) {
        [audioplayer play];
        soundchecker = YES;
    }

    if(!SoundSwitch.on) {
        [audioplayer stop];
        soundchecker = NO;
    }
}

preguntado el 03 de mayo de 12 a las 19:05

1 Respuestas

No se detiene porque cada vez que playsound se llama estás creando un NUEVO AVAudioPlayer. Entonces cuando llamas [audioplayer stop], no lo estás llamando en el AVAudioPlayer que se está reproduciendo actualmente, lo está llamando en uno nuevo que acaba de crear.

Puede agregar la variable AVAudioPlayer al encabezado de su clase (como una propiedad si lo desea). Entonces podrías hacer esto:

-(void)playsound:(id) sender
{ 
    if(SoundSwitch.on) 
    {
        if(!audioPlayer) {
             NSString *pathtosong = [[NSBundle mainBundle]pathForResource:@"Teachme" ofType:@"mp3"];
             audioplayer = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:pathtosong] error:nil];
        }
        [audioplayer play];
        soundchecker = YES;
    } else {
        if(audioPlayer && audioPlayer.isPlaying) {
             [audioplayer stop];
        }
        soundchecker = NO;
    }
}

contestado el 03 de mayo de 12 a las 20:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.