将类用作静态AVAudioPlayer的AVAudioPlayerDelegate

问题描述 投票:1回答:2

我无法在TriggerIO插件中维护实例,因此我需要一种静态方式来响应AVAudioPlayer事件。但是,我无法将player.delegate设置为audio_API,所以我有点卡住了。

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

关于如何进行这项工作的任何想法?

谢谢。

ios objective-c delegates avaudioplayer trigger.io
2个回答
3
投票

委托必须是一个对象,但是audio_API是类型名称。但是,您可以简单地将委托分配为audio_API的类对象:

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

注意:如果不强制转换类对象,编译器会抱怨,因为即使在[audio_API class]的接口上指定了委托,Class也会返回Class<AVAudioPlayerDelegate>,而不是audio_API


0
投票

对我来说,这有助于使管理声音的课程成为AVAudioPlayerDelegate。SoundManager.h文件:

#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>

@interface SoundManager : NSObject<AVAudioPlayerDelegate> {

}

并且在.m文件中,您可以有选择地为委托实现回调,例如:

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    NSLog(@"audioPlayerDidFinishPlaying %d",flag);
}
© www.soinside.com 2019 - 2024. All rights reserved.