2008-11-13 11 views
5

Pisałem tani & wesoły karty dźwiękowej w mojej Mac i Gram różne dźwięki z NSSound tak:Jak znikną obiekt 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]; 
    } 
} 

Zamiast po prostu przestać to martwi, ja Chciałbym, żeby zniknął w ciągu kilku sekund.

Odpowiedz

1

To jest ostateczna wersja metody:

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

Więc to tylko zanika jeśli mijam ten sam dźwięk (tj kliknij ten sam przycisk), a także, poszedłem do nanosleep raczej niż spać, ponieważ ma on ziarnistość 1 sekundy.

Walczyłem na chwilę stara się wypracować dlaczego moja 200 milisekund opóźnienia nie wydaje się mieć żadnego wpływu, ale potem 200 nanosekund nie jest aż tak długo jest to :-)

0

Może coś takiego? Prawdopodobnie chcesz bardziej liniowego spadku, ale podstawową ideą jest zrobić pętlę i przespać czas do następnej aktualizacji.

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

Właśnie wypróbowałem to Chris, funkcja uśpienia uśpiła cały laptop, który kazał mi chichotać. zasypianie działa poprawnie, z wyjątkiem parametru, który zajmuje kilka sekund zamiast milisekund. –

+0

Przeklina na ciebie błędny klawisz shift! –

1

użyłbym NSTimer aby uniknąć zablokowania głównego wątku.

+0

Czy mógłbyś zastanowić się, jak dokładnie używasz NSTimer? – Matt

Powiązane problemy