NSSound isPlaying возвращает ноль на Mac - PullRequest
0 голосов
/ 30 ноября 2011

В моем AppDelegate у меня есть этот метод, который будет запускаться при нажатии кнопки воспроизведения:

- (IBAction)actionPlayTrack:(id)sender {
    NSSound *currentSong = [[NSSound alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"03 Bazel" ofType:@"mp3"] byReference:YES];
    if([currentSong isPlaying] == NO){
        [currentSong play];
    } else {
        [currentSong stop];
        [currentSong release];
    }
}

Однако оператор if, проверяющий, воспроизводится ли в данный момент песня, не будет работать и всегда будет воспроизводиться независимо от того, воспроизводится ли уже звук. Любая идея о том, почему это будет делать это? Возможно, объект currentSong сбрасывается каждый раз, когда нажимается эта кнопка, и это мое первое предположение ...

[currentSong isPlaying] 

Всегда будет возвращать ноль.

Ответы [ 3 ]

3 голосов
/ 30 ноября 2011

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

Чтобы преодолеть эту проблему, вы можете добавить в свой класс NSSound * currentSong, а затем использовать этот объект NSSound, когда хотите проверить, воспроизводится ли он. Затем, когда вы переключаете трек, вы можете остановить существующий объект NSSound и освободить его перед созданием нового экземпляра NSSound.

Итак, ваш код должен выглядеть примерно так:

- (IBAction)actionPlayTrack:(id)sender {
    if (!currentSong) {
        currentSong = [[NSSound alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"03 Bazel" ofType:@"mp3"] byReference:YES];
    }

    if ([currentSong isPlaying]){
        [currentSong stop];
        [currentSong release];
        currentSong = nil;
    } else {
        [currentSong play];
    }
}

- (void)dealloc {
    [currentSong release];
    currentSong = nil;
}

Затем добавьте NSSound* currentSong в заголовок.

0 голосов
/ 30 ноября 2011

Всегда будет возвращаться NO, поскольку вы спрашиваете, воспроизводится ли звук, который вы только что создали , и, конечно, это не так.

Вам может понадобиться использовать функции AudioSession, чтобы проверить, воспроизводит ли устройство что-то еще:

UInt32 otherAudioIsPlaying;
UInt32 propertySize = sizeof( UInt32 );

AudioSessionGetProperty
(
    kAudioSessionProperty_OtherAudioIsPlaying,
    &propertySize,
    &otherAudioIsPlaying
);

Проверьте Руководство по программированию аудиосеанса .

0 голосов
/ 30 ноября 2011

Этот совет может не решить вашу проблему, но никогда не сравнивайте ничего с ДА или НЕТ.Ваш тест должен быть следующим:

if (![currentSong isPlaying])

Причина в том, что NO и YES - это отдельные значения, тогда как возможные значения, которые будут считаться истинными, бесконечны.

...