2008-11-13 7 views
5

J'ai écrit un pas cher & carte son de bonne humeur pour mon Mac, et je joue les différents sons avec NSSound comme ceci:Comment effacer un objet 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]; 
    } 
} 

Plutôt que de simplement arrêter mort, je Je voudrais l'éteindre en quelques secondes.

Répondre

1

Ceci est la version finale de la méthode:

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

Il disparaît que si je passe le même son dans (ie, cliquez sur le même bouton), aussi, je suis allé pour nanosleep plutôt que de dormir, car cela a une granularité de 1 seconde.

Je me suis battu pendant un certain temps à essayer de comprendre pourquoi mon retard de 200 millisecondes ne semble pas avoir d'effet, mais 200 nanosecondes est pas vraiment de temps cela :-)

0

Quelque chose comme ça peut-être? Vous voulez probablement une baisse plus linéaire, mais l'idée de base est de faire une boucle et de dormir la période de temps jusqu'à la prochaine mise à jour.

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

J'ai juste essayé ce Chris, la fonction Sleep a mis tout l'ordinateur portable en veille, ce qui m'a fait rire. sleep fonctionne correctement, sauf le paramètre qu'il faut en secondes plutôt qu'en millisecondes. –

+0

Malédictions sur votre clé de décalage errant! –

1

J'utiliser NSTimer pour éviter de bloquer le thread principal.

+0

Pouvez-vous nous expliquer comment exactement utiliser le NSTimer? – Matt

Questions connexes