2008-11-13 21 views
5

bir NSSound nesnesi solmaya ve böyle NSSound ile çeşitli sesler nasıl oynanır:benim Mac için ucuz bir & neşeli ses kartı yazdım

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

sadece ölü durdurmak yerine, ben Bir kaç saniyede falan sönmesini isterdim.

cevap

1

Bu yöntemin son hali: Ben de aynı sesi geçirirseniz

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

sadece dışarı kaybolur (yani aynı düğmesini tıklayın), aynı zamanda, ben nanosleep gitti uykudan ziyade, 1 saniyelik bir tanıma sahiptir.

benim 200 milisaniye gecikme herhangi bir etkiye sahip değildi neden yürütmeye çalışıyoruz bir süre mücadele etti, ama sonra 200 nanosaniye gerçekten uzun değil

0

Bunun gibi bir şey mi? Muhtemelen daha lineer bir düşüş yapmak istersiniz, ancak temel fikir bir döngü oluşturmak ve bir sonraki güncellemeye kadar geçen süreyi uyutmaktır.

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

Bu Chris'i denedim, Uyku fonksiyonu tüm dizüstü bilgisayarı uyuttu, bu da beni kıkırdıyordu. uyku, milisaniyeden ziyade saniye cinsinden alması gereken parametre dışında iyi çalışır. –

+0

Size vardiya anahtarında Curses! –

1

Ben NSTimer kullanmak :-) öyle Ana parçacığı engellemek için.

+0

NSTimer'i tam olarak nasıl kullanacağınız konusunda ayrıntılı olarak bilgi verebilir misiniz? – Matt

İlgili konular