Это окончательная версия метода:
-(void)play:(NSSound *)soundEffect:(BOOL)stopIfPlaying {
BOOL wasPlaying = FALSE;
if([nowPlaying isPlaying]) {
struct timespec ts;
ts.tv_sec = 0;
ts.tv_nsec = 25000000;
// If the sound effect is the same, fade it out.
if(soundEffect == nowPlaying)
{
for(int i = 1; i < 30; ++i)
{
[nowPlaying setVolume: (1.0 / i )];
nanosleep(&ts, &ts);
}
}
[nowPlaying stop];
[nowPlaying setVolume:1];
wasPlaying = TRUE;
}
if(soundEffect != nowPlaying)
{
[soundEffect play];
nowPlaying = soundEffect;
} else if(soundEffect == nowPlaying && ![nowPlaying isPlaying] && !wasPlaying) {
[nowPlaying play];
}
}
Таким образом, он исчезает только в том случае, если я передаю тот же звук (т. Е. Нажимаю одну и ту же кнопку), а также я предпочел наноспать, а не спать, поскольку он имеет зернистость 1 секунду.
Я некоторое время пытался понять, почему моя задержка в 200 миллисекунд, похоже, не имела никакого эффекта, но тогда 200 NANOseconds не так уж и длинны: -)