Цель C: поймать событие, когда аудио закончится, чтобы воспроизвести - PullRequest
1 голос
/ 28 сентября 2011

Я новичок в Objective C, я разрабатываю приложение, которое воспроизводит звук на сенсорном событии uibutton.Когда я касаюсь кнопки, изображение меняется, и звук начинает воспроизводиться.Когда аудио закончится, я хочу поставить исходное изображение uibutton.Как я могу это сделать?Как я могу поймать событие аудио, которое закончено?Я использую этот код:

- (SystemSoundID) createSoundID: (NSString*)name
{
    NSString *path = [NSString stringWithFormat: @"%@/%@",
    [[NSBundle mainBundle] resourcePath], name];              
    NSURL* filePath = [NSURL fileURLWithPath: path isDirectory: NO];
    SystemSoundID soundID;
    AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID);
    return soundID;
} 

В

viewDidLoad

я звоню

freq = [self createSoundID: @"freq.wav"];

и в функции, которая вызывается при нажатии кнопки, я использую:

AudioServicesPlaySystemSound(freq);

Как я могу это сделать?Спасибо!

Ответы [ 2 ]

2 голосов
/ 28 сентября 2011

Не уверен, возможно ли это с помощью AudioService API, но вы можете использовать вместо него AVAudioPlayer и назначить делегата, который реализует протокол AVAudioPlayerDelegate и что-то делает, когда вызывается audioPlayerDidFinishPlaying:successfully:.

Не забудьте добавить AVFoundation framework.

Пример:

В вашем определении интерфейса:

#import <AVFoundation/AVFoundation.h>

...

@inteface SomeViewController : UIViewController <AVAudioPlayerDelegate>

...

@propety(nonatomic, retain) AVAudioPlayer *player;

В вашей реализации:

@synthesize player;

...

// in some viewDidLoad or init method
self.player = [[[AVAudioPlayer alloc] initWithContentsOfURL:soundUrl error:NULL] autorelease];
self.player.delegate = self;

...

- (void)pressButton:(id)sender {
  // set play image
  [self.player stop];
  self.player.currentTime = 0;
  [self.player play];
}

...

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
   // set finish image
}

...

# in some dealloc or viewDidUnload method
self.player = nil;
0 голосов
/ 02 июля 2019

Это возможно с помощью AudioService API, вы хотите использовать AudioServicesAddSystemSoundCompletion.

...