2008-11-13 11 views
5

मैं अपने मैक के लिए में एक सस्ते & हंसमुख ध्वनि बोर्ड लिखा है फीका करने के लिए कैसे, और मैं इस तरह 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]; 
    } 
} 

तो यह केवल फ़ेड आउट, भी, मैं नैनोस्लीप के लिए चला गया नींद के बजाए, क्योंकि उस पर 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

मैंने अभी इस क्रिस की कोशिश की, स्लीप फ़ंक्शन ने पूरे लैपटॉप को सोने के लिए रखा, जिससे मुझे चकित कर दिया गया। नींद ठीक काम करता है, पैरामीटर को छोड़कर यह मिलीसेकंड के बजाय सेकंड में लेता है। –

+0

आप पर शापित कुंजी कुंजी शापित! –

1

मैं NSTimer का प्रयोग करेंगे है मुख्य धागे को अवरुद्ध करने से बचने के लिए।

+0

क्या आप शायद विस्तार से बता सकते हैं कि आप एनएसटीमर का उपयोग कैसे करेंगे? – Matt

संबंधित मुद्दे