AudioServicesAddSystemSoundCompletion обратный вызов не вызывается в беззвучном режиме - PullRequest
3 голосов
/ 28 ноября 2011

Если я переключаю устройство в беззвучный режим с помощью переключателя, метод обратного вызова AudioServicesAddSystemSoundCompletion не вызывается. Если переключатель включен, я имею в виду, если устройство НЕ находится в беззвучном режиме, метод вызывается идеально.

Кто-нибудь испытывал что-то подобное? Это ошибка?

Ответы [ 3 ]

2 голосов
/ 25 марта 2012

Вот как вы можете использовать NSTimer для обратного вызова soundDidFinishPlaying даже в тихом режиме.

    - (IBAction)playSelectedSound:(id)sender {

    if (!self.isPlaying)
    {        

        // playing the sound

        NSString *fileName = [soundsFileNames objectAtIndex:self.selectedIndex];

        SystemSoundID topClick;
        NSBundle *bundle = [NSBundle mainBundle];
        NSString *topClikFile = [bundle pathForResource:fileName ofType:@"aiff"];

        AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL URLWithString:topClikFile], &topClick);
        AudioServicesPlaySystemSound(topClick);

        // getting the file duration

        AudioFileID audioFileID;
        AudioFileOpenURL((__bridge CFURLRef)[NSURL URLWithString:topClikFile], kAudioFileReadPermission, 0, &audioFileID);

        NSTimeInterval seconds;
        UInt32 propertySize = sizeof(seconds);
        OSStatus st = AudioFileGetProperty(audioFileID, kAudioFilePropertyEstimatedDuration, &propertySize, &seconds);

        // fire the timer
        if (st == 0)
        {
            [NSTimer scheduledTimerWithTimeInterval:seconds target:self selector:@selector(soundDidFinishPlaying) userInfo:nil repeats:NO];
        }

        self.isPlaying = YES;

    }
}



- (void)soundDidFinishPlaying {

    self.isPlaying = NO;
}
2 голосов
/ 27 января 2012

У меня была такая же проблема.Это не ошибка.Если звук не воспроизводится, из-за отключения звука устройства обратный вызов никогда не вызывается.

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

0 голосов
/ 26 января 2015

Исходный код Sound Switch (с демонстрационным проектом) указывает, что обратный вызов действительно происходит, даже если устройство находится в беззвучном режиме.

Я только что попробовал это с iOS 8.1 на iPhone 5, и беззвучный режим включался / выключался кнопкой на устройстве.

...