2015-07-22 1 views
0

Я пытаюсь воспроизвести звук только тогда, когда у моего iphone есть наклон. Я делаю это:Воспроизведение звука только один раз, состояние

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.playing = NO; 

    deviceQueue = [[NSOperationQueue alloc] init]; 
    motionManager = [[CMMotionManager alloc] init]; 
    motionManager.deviceMotionUpdateInterval = 5.0/60.0; 

    [motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryZVertical 
                 toQueue:deviceQueue 
                withHandler:^(CMDeviceMotion *motion, NSError *error) 
    { 
     [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
      CGFloat x = motion.gravity.x; 
      CGFloat y = motion.gravity.y; 
      CGFloat z = motion.gravity.z; 

      CGFloat angle = atan2(y, x) + M_PI_2;   // in radians 
      CGFloat angleDegrees = angle * 180.0f/M_PI; 


       CGFloat r = sqrtf(x*x + y*y + z*z); 
      CGFloat tiltForwardBackward = acosf(z/r) * 180.0f/M_PI - 90.0f; 




      CMMotionManager* motionManager = [[CMMotionManager alloc] init]; 
      [motionManager startAccelerometerUpdates]; 
      CMAccelerometerData* data = [motionManager accelerometerData]; 
      while (data.acceleration.x == 0) 
      { 
       data = [motionManager accelerometerData]; 
      } 
      NSLog(@"x = %f, y = %f, z = %f.", data.acceleration.x, data.acceleration.y, data.acceleration.z); 

      NSLog(@"angleDegrees = %f, anglee = %f", angleDegrees, angle); 
      NSString *soundPath =[[NSBundle mainBundle] pathForResource:@"End-clap" ofType:@"mp3"]; 
      NSURL *soundURL = [NSURL fileURLWithPath:soundPath]; 

      NSError *error = nil; 
      _audioPlayer4 = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:&error]; 
      _audioPlayer4.delegate =self; 

      if (angleDegrees<180 && angleDegrees>0) { 
       self.guessImg.image=[UIImage imageNamed:@"guessit-Recovered.png"]; 
       [email protected]"Justin Bieber"; 
          } 
      else 
      { 
      [email protected]"Place on Forehead"; 

       if ([self.wordLabel.text isEqualToString:@"Place on Forehead"]) { 
        if(_playing) 
        { 


         _audioPlayer4.numberOfLoops=1; 
         [email protected]"Justin"; 
         [_audioPlayer4 play]; 
         self.playing=YES;} 


       } 


      } 

     }]; 
    }]; 


} 


    - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 
    { 
     NSLog(@"playing has finished"); 
     self.playing = NO; 
    } 

и играет, но только beginig, один второй, а затем начать снова и снова без конца всего звука.

Я полагаю, что это из-за угла Degrees, который меняется все время. В любом случае, как решить эту проблему, пожалуйста?

+0

Хм, ваш код выглядит нормально для меня - я не понимаю, почему это происходит, если '[AVAudioPlayer играть]' не лжет. Добавьте некоторые записи в эту область. – trojanfoe

+0

Какой метод этот код? Как это срабатывает? При изменении ориентации? –

+0

in viewDidLoad, yes.on изменение ориентации –

ответ

1

Вы можете настроить BOOL, чтобы указать, что игрок играет и использует обратный вызов делегата, который обозначает остановку игрока.

@property(atomic) BOOL playing; 

После того, как первый if условие выполнено, установите это YES.

Согласно документации Apple, на имущество playing:

Не опрашивать это свойство для определения, когда воспроизведение завершено, вместо реализации указанного метода делегата.

Вместо этого мы полагаемся на следующий метод делегата:

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 
{ 
    NSLog(@"playing has finished"); 
    self.playing = NO; 
} 

Для того, чтобы получить callback'ed, нам нужно установить OURSELF как delegate:

_audioPlayer4 = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:&error]; 
_audioPlayer4.delegate = self; 

Наконец, мы может заменить ваш внутренний if:

if(!playing) 
{ 
    self.playing = YES; 
    NSString *soundPath =[[NSBundle mainBundle] pathForResource:@"End-clap" ofType:@"mp3"]; 
    NSURL *soundURL = [NSURL fileURLWithPath:soundPath]; 

    ....... 

    [_audioPlayer4 play]; 
} 

И в viewDidLoad, установите свойство NO, первоначально:

self.playing = NO; 

Добавление:

Убедитесь, что контроллер принимает к протоколу, а также.

т.е.

@interface yourViewController : UIViewController <AVAudioPlayerDelegate> 
+0

audioPlayerDidFinishPlaying не вызывается. Я установил делегат, и я принял протокол :( –

+0

Я установил его в начале viewDidLoad и да, звук воспроизводится, но та же проблема. –

+0

Я обновляю свой вопрос.Я действительно высоко ценю вашу помощь. Идея - это когда телефон наклоняется к небу, чтобы воспроизвести звук, и когда он наклоняется, чтобы смотреть на пол другого звука –

0

Потому что angleDegrees постоянно меняется. поэтому вы должны установить состояние, указывающее, что звук воспроизводится. если он играет, вы не сможете воспроизвести его до тех пор, пока он не закончится.

+0

и как это сделать? –

+0

Я вижу, что вы уже проверили состояние воспроизведения аудиоплеера. возможно, вы можете распечатать некоторый журнал, чтобы увидеть результат условия if (! _ audioPlayer4.playing). вы должны выяснить, почему это неверно, когда звук воспроизведения –