0

私は現在、AVAudioPlayerのカスタムクラスを使用しようとしていますが、オーディオファイルの再生にはすべてうまく機能しますが、そのファイルを停止する場合は、停止コマンドをスキップして、現在のファイルの上で別のクラスを再生します。

なぜこれが起こっているのかについて誰かが何か考えを持っているなら、私は本当に助けていただければ幸いです。

以下は私のAudioPlayer1.hファイルです:

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

@interface AudioPlayer1 : NSObject <AVAudioPlayerDelegate> {

    AVAudioPlayer   *player;

    BOOL playing;
    NSTimeInterval duration;        
}

@property (nonatomic, assign) AVAudioPlayer *player;
@property(readonly, getter=isPlaying) BOOL playing;
@property (readonly) NSTimeInterval duration;


-(void)GetSoundFileDuration:(NSString *) sound_file_name;
-(void)play;
-(void)stop;

-(void)setVolume:(float) volume;

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;
- (void)PlaySoundFile:(NSString *) sound_file_name;

- (void)notPlaying;

@end

以下はAudioPlayer1.mファイルの内容です。

#import "AudioPlayer1.h"

@implementation AudioPlayer1

@synthesize player;
@synthesize duration;
@synthesize playing;

- (id)init
{
self = [super init];
if (self != nil)
{
    player = [[AVAudioPlayer alloc] init];
    [player initWithContentsOfURL:nil error:nil];
    player.delegate = self;
}
return self;
}

- (void) setVolume:(float)volume
{
[player setVolume:volume];
}

- (void)PlaySoundFile:(NSString *) sound_file_name
{
[player stop];
NSURL *sound_file = [[NSURL alloc] initFileURLWithPath: [[NSBundle mainBundle] pathForResource:sound_file_name ofType:@"mp3"]];

[player initWithContentsOfURL:sound_file error:nil];
[player prepareToPlay];
playing = YES;
[sound_file release];
}

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


- (void) play
{
NSLog(@"Play Called");
[player setVolume:0.1];
[player play];
playing = YES;
}

- (void) stop
{
NSLog(@"Stop Called");
[player setVolume:0.0];
[player stop];
playing = NO;
}


-(void)GetSoundFileDuration:(NSString *) sound_file_name
{
NSLog(@"%@",duration);
}

-(void) notPlaying
{
playing = NO;
}

@end

そして、以下はオーディオを開始するコードです:

- (IBAction)WPNaritive01:(id)sender
{
AudioPlayer1 * player = [[AudioPlayer1 alloc] init ];

if (player.playing == YES) 
{
    [player stop];
}

if (player.playing == NO)
{
    [player PlaySoundFile:@"1"];
    [player setVolume:0.1];
    [player play];
}
}

まだ学習中なので、コードのレイアウトがおかしいことをお詫びします。別の質問を読んで、たまたまこれらのクラスを作ることを知ったのは今だけです。笑

4

1 に答える 1

0

わかりました、私はそれを理解しました。

上記のコードで行っていたようにオブジェクトを何度も作成するのではなく、IBActionで行うのではなく、viewdidloadでプレーヤーを割り当てて初期化する必要がありました。

これは、他の誰かが同じ問題に遭遇した場合に備えて私がしたことです。

LockonLocation.h

@interface LockOnLocation : UIViewController {

AudioPlayer1 *player;
...

LockonLocation.m

- (void)viewDidLoad
player = [[AudioPlayer1 alloc] init ];
...

そして、私は上記と同じコードを使用してオーディオを再生したので、それは正しいことでした。

誰かが私や他のメンバーに何かアドバイスがあれば、私はあなたから聞いてみたいです...

于 2012-11-04T22:32:20.673 に答える