1

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

音频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

知道如何进行这项工作吗?

谢谢。

4

2 回答 2

3

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

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

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

于 2013-04-18T12:31:15.790 回答
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);
}
于 2019-11-30T19:44:18.933 回答