2008-11-13 7 views
5

ich einen günstigen & fröhlich Soundkarte in meinen Mac geschrieben habe, und ich spiele die verschiedenen Klänge mit NSSound wie folgt aus:Wie ein NSSound Objekt verblassen

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

Anstatt nur tot es aufhören, ich würde es gerne ein paar Sekunden ausbleichen lassen.

Antwort

1

Dies ist die letzte Version des Verfahrens:

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

es verblasst also nur, wenn ich den gleichen Ton in (dh klicken Sie auf die gleiche Taste), auch passieren, ging ich für Nanosleep anstatt zu schlafen, da das auf eine Granularität von 1 Sekunde hat.

ich für eine Weile zu kämpfen versuchen, warum Verzögerung meiner 200 Millisekunden zu arbeiten, keine Wirkung zu haben schien, aber dann 200 ns ist eigentlich ist es nicht so lange :-)

0

So etwas vielleicht? Wahrscheinlich möchten Sie einen lineareren Dropoff, aber die Grundidee ist, eine Schleife zu erstellen und den Zeitraum bis zum nächsten Update zu schlafen.

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

Ich habe gerade versucht, Chris, die Sleep-Funktion legte den ganzen Laptop schlafen, was mich kicherte. Sleep funktioniert gut, außer dem Parameter dauert es in Sekunden anstelle von Millisekunden. –

+0

Flüche auf dir fehlender Umschalttaste! –

1

ich NSTimer verwenden würde um das Blockieren des Hauptthreads zu vermeiden.

+0

Können Sie vielleicht näher ausführen, wie genau Sie den NSTimer verwenden würden? – Matt