Играть в NSSound два раза - PullRequest
0 голосов
/ 15 марта 2012

Я хочу сыграть NSSound два раза, за исключением того, что он короче 10 секунд, затем я хочу подождать, пока 10 секунд не закончатся, а затем начать второй..

NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"MessageArrived" ofType:@"wav"];
NSSound *sound = [[NSSound alloc] initWithContentsOfFile:resourcePath byReference:YES];
[sound play] //It plays the fist time
[sound play] //I get the following Error and it doesn't play a secont time
/*malloc: *** auto malloc[498]: error: GC operation on unregistered thread. Thread registered implicitly. Break on auto_zone_thread_registration_error() to debug.*/

Может кто-нибудь сказать мне, в чем причина этой ошибки?Как я могу справиться с этим?

Есть ли другой способ сделать это?

Ответы [ 2 ]

1 голос
/ 19 марта 2012

Итак, после множества поисков и попыток исправить это, я нашел решение своей проблемы ...

NSSound *sound = [NSSound soundNamed:@"MessageArrived"];
BOOL res = [sound play];
NSLog(@"%d", res);
[NSThread detachNewThreadSelector:@selector(playSecondSound:) toTarget:self withObject:sound];

-(void)playSecondSound:(NSSound*)sound
{
    [NSThread sleepForTimeInterval:10-[sound duration]];
    [sound stop];
    BOOL res = [sound play];
    NSLog(@"%d", res);
}

Я обнаружил, что даже когда звук закончился, мне нужно позвонить [остановка звука] перед началом второго.

0 голосов
/ 15 марта 2012

Звук уже воспроизводится, когда вы вызываете второй метод воспроизведения, очевидно, это ошибка в сборке мусора, так как вторая игра должна игнорироваться, но это не будет проблемой с тем, чего вы хотите достичь.

NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"MessageArrived" ofType:@"wav"];
NSSound *sound = [[NSSound alloc] initWithContentsOfFile:resourcePath byReference:YES];
[sound play];

//Will play the second time after 10.0 seconds have passed.
NSInteger wait = ([sound duration] < 10.0) ? 10.0 - [sound duration] : 0.0; 
[sound performSelector:@selector(play) withObject:nil afterDelay:wait];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...