2013-04-15 3 views
1

Я не могу поддерживать экземпляр в плагине TriggerIO, поэтому мне нужен статический способ отвечать на мои события AVAudioPlayer. Однако я не могу установить player.delegate на audio_API, поэтому я немного застрял.Использование класса как AVAudioPlayerDelegate для статического AVAudioPlayer

audio_API.h:

@interface audio_API : NSObject<AVAudioPlayerDelegate> 

audio_API.m:

static AVAudioPlayer* player = nil; 


@implementation audio_API 


+ (void)play:(ForgeTask*)task { 

    // parse the file url from the file object 
    ForgeFile* file = [[ForgeFile alloc] initWithFile:[task.params objectForKey:@"file"]]; 
    NSString* fileURL = [file url]; 

    NSLog(@"Playing file at %@", fileURL); 

    NSURL* url = [NSURL URLWithString:fileURL]; 


    // TESTING 
    url = [[NSBundle mainBundle] URLForResource:@"seconds.m4a" withExtension:nil]; 
    // END TESTING 

    NSAssert(url, @"URL is invalid."); 

    // create the player 
    NSError* error = nil; 
    player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; 
    if(!player) 
    { 
     NSLog(@"Error creating player: %@", error); 
    }; 

// player.delegate = audio_API; 

    [player play]; 

    [task success:nil]; 
} 


+ (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 
{ 
    if (flag) { 
     [ForgeLog d:@"Audio finished playing successfully."]; 
    } else { 
     [ForgeLog d:@"Audio did not finish playing successfully."]; 
    } 

    // call the audio.finishedPlaying event 
    [[ForgeApp sharedApp] event:@"audio.finishedPlaying" withParam:nil]; 
} 

+ (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error 
{ 
    [ForgeLog d:@"Audio had error decoding."]; 
    [ForgeLog e:error]; 

    // call the audio.decodeErrorOccurred event 
    [[ForgeApp sharedApp] event:@"audio.decodeErrorOccurred" withParam:nil]; 
} 

@end 

Любая идея о том, как сделать эту работу?

Спасибо.

+0

В чем проблема при попытке установить делегат? –

+0

'/Users/gsquare567/forge-workspace/plugins/audio/inspector/ios-inspector/ForgeModule/alert/audio_API.m:47:23: Неожиданное имя интерфейса 'audio_API': ожидаемое выражение' когда я пытаюсь 'player.delegate = audio_API; ' – Garrett

ответ

3

Делегат должен быть объектом, но audio_API - это имя типа. Тем не менее, вы можете просто присвоить делегат класс объект audio_API:

player.delegate = (id<AVAudioPlayerDelegate>)[audio_API class]; 

Примечание: Если вы не отбрасывают объект класса компилятор будет жаловаться, потому что [audio_API class] возвращает Class, а не Class<AVAudioPlayerDelegate>, даже если вы укажете делегата на интерфейсе для audio_API