2008-11-13 1 views
5

я написал дешевую & веселую деку в моем Mac, и я играю различные звуки с NSSound так:Как выцветает объект NSSound

-(void)play:(NSSound *)soundEffect:(BOOL)stopIfPlaying { 
    BOOL wasPlaying = FALSE; 

    if([nowPlaying isPlaying]) { 
     [nowPlaying stop]; 
     wasPlaying = TRUE; 
    } 

    if(soundEffect != nowPlaying) 
    { 
     [soundEffect play]; 
     nowPlaying = soundEffect; 
    } else if(soundEffect == nowPlaying && ![nowPlaying isPlaying] && !wasPlaying) { 
     [nowPlaying play]; 
    } 
} 

Вместо того, чтобы остановить его мертвым, я «Мне нравится, когда он исчезает через пару секунд или около того.

ответ

1

Это последняя версия метода:

-(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]; 
    } 
} 

Так что только исчезает, если я прохожу один и тот же звук (т.е. нажмите на ту же кнопку), а также, я пошел на nanosleep а не спать, поскольку это имеет степень детализации 1 секунду.

я боролся на некоторое время, пытаясь понять, почему моя 200 задержка миллисекунды, похоже, не имеет никакого эффекта, но затем 200 наносекунд не так уж долго это :-)

0

Возможно, что-то подобное? Вы, вероятно, хотите более линейное падение, но основная идея заключается в создании цикла и спящем период времени до следующего обновления.

if([nowPlaying isPlaying]) { 
    for(int i = 1; i < 100; ++i) 
    { 
     [nowPlaying setVolume: (1.0/i)]; 
     Sleep(20); 
    } 
    [nowPlaying stop]; 
    wasPlaying = TRUE; 
} 
+0

Я только что попробовал этот Крис, функция сна поставила весь ноутбук спать, что заставило меня усмехнуться. Сон работает отлично, за исключением параметра, который требуется в секундах, а не в миллисекундах. – 2008-11-15 15:43:48

+0

Проклятия на вас странствующий ключ переключения! – 2008-11-17 22:09:31

1

Я хотел бы использовать NSTimer чтобы избежать блокировки основной нити.

Смежные вопросы