1

システム サウンドは再生できますが、複数のシステム サウンドをオーバーラップせずに再生したいと考えています。AudioToolboxフレームワークを含む、ARCを使用した次のコードがあります。

SSDViewController.h

#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioToolbox.h>

bool            flagDelegate;
SystemSoundID   soundId;
CFURLRef        soundFileURLRef;

@interface SSDViewController : UIViewController
{
}

@property (readwrite)   CFURLRef        soundFileURLRef;

- (IBAction)play:(id)sender;
- (void)tocar:(NSString *)nameSound;

@end

SSDViewController.m

#import "SSDViewController.h"

@interface SSDViewController ()

@end

@implementation SSDViewController

@synthesize soundFileURLRef;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)play:(id)sender
{
    flagDelegate = NO;
    bool flagPlayingOnce = NO;
    while (flagDelegate == NO){
        if(flagPlayingOnce == NO){
            flagPlayingOnce = YES;
            [self tocar:@"HelloWorld"];
        }
    }

    [self tocar:@"HowAreYouWorld"];

} // end of button play

- (void)tocar:(NSString *)nameSound{

// Create the URL for the source audio file. The URLForResource:withExtension:    method is new in iOS 4.0
    NSURL *tapSound   = [[NSBundle mainBundle] URLForResource: nameSound
                                                withExtension: @"wav"];

    // Store the URL as a CFURLRef instance
    self.soundFileURLRef = (CFURLRef) CFBridgingRetain([tapSound self]);

    // Create a system sound object representing the sound file.
    soundId = 0;
    if ( soundId == 0 )
    {
        AudioServicesCreateSystemSoundID (
                                          soundFileURLRef,
                                          &soundId
                                          );
    }

    // Delegate to cacth the end of playing
    AudioServicesAddSystemSoundCompletion(soundId,
                                          NULL,
                                          NULL,
                                          myAudioCallback,
                                          NULL);

    AudioServicesPlaySystemSound (soundId);

    NSLog(@"end of tocar");

//    AudioServicesRemoveSystemSoundCompletion(soundId);
//    AudioServicesDisposeSystemSoundID(soundId);

} // end of tocar


void myAudioCallback(SystemSoundID mysound, void *clientData)
{
    NSLog(@"System sound finished playing!");
    flagDelegate = YES;
}

@end

オーバーラップflagDeletageを制御しようとしていますが、ループ内で myAudioCallbackは決して呼び出されません。とがないflagDelegateflagPlayingOnce、2 つの音が重なります。

私の目的は、システム サウンドをオーバーラップせずに再生することです。

事前にどうもありがとう。

本社。

4

1 に答える 1