2012-07-11 9 views
5

मेरे पास एक एंड्रॉइड गेम है जिसे मुझे छोटी आवाज़ें चलाने की ज़रूरत है। SoundPooldual core phones पर क्रैश, Mediaplayer तक 200ms + देरी है, ओपनएसएल को एसडीके 9 + (मैं 1.5 का समर्थन करता हूं) की आवश्यकता है। तो AudioTrack छोड़ देता है।स्थिर मोड में ऑडियोट्रैक का उपयोग करने का उचित तरीका क्या है?

यही मैंने कोशिश की है। मैं इस तरह ऑडियोट्रैक ऑब्जेक्ट्स बना देता हूं।

protected AudioTrack createAudioTrack() { 
    final int trackSize = 17408; 
    return new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT, trackSize, AudioTrack.MODE_STATIC); 
} 

मैं फिर गेम ध्वनि (लगभग 8) में प्रत्येक के लिए एक रननेबल बनाता हूं।

private static class SoundRunnable implements Runnable { 

    private final AudioTrack sound; 
    private final byte[] rawAudio; 

    public SoundRunnable(final AudioTrack sound, final byte[] rawAudio){ 
     this.sound = sound; 
     this.rawAudio = rawAudio; 
     sound.write(rawAudio, 0, rawAudio.length); 
    } 

    @Override 
    public void run() { 
     playSound(); 
    } 

    private synchronized void playSound() { 
     switch (sound.getPlayState()) { 
     case AudioTrack.PLAYSTATE_PAUSED: 
      sound.stop(); 
      sound.reloadStaticData(); 
      sound.play(); 
     break; 
     case AudioTrack.PLAYSTATE_PLAYING: 
      sound.stop(); 
      sound.reloadStaticData(); 
      sound.play(); 
     break; 
     case AudioTrack.PLAYSTATE_STOPPED: 
      sound.reloadStaticData(); 
      sound.play(); 
     break; 
     default: 
      break; 
     } 
    } 

    public synchronized void release() { 
     sound.release(); 
    } 

} 

तब जब मुझे ध्वनि चलाने की आवश्यकता होती है तो मैं इसे थ्रेडपूल पर भेजता हूं।

private void playSound(final int soundToPlay) { 
    final SoundRunnable soundRunnable = mediaPlayers.get(soundToPlay); 
    if(soundRunnable != null){ 
     threadPool.execute(soundRunnable); 
    } 
} 

मुख्य मुद्दा रहा है कि लगता है दो बार पहली बार मैं runnable निष्पादित खेलने है। उसके बाद हर बार एक बार मुझे अभी भी एक डबल ध्वनि मिल सकती है लेकिन यह बहुत अच्छी तरह से काम करता है।

मैंने स्ट्रीमिंग मोड में एक ऑडियोट्रैक बनाने और रननेबल से कच्चे ऑडियो लिखने के साथ भी प्रयोग किया है। यह कुछ हद तक सफल था लेकिन नाटक को रोकने के लिए जानना मुश्किल था। मैं जल्दी से रुक जाता हूं कि ध्वनि बहुत कम हो जाती है, बहुत देर हो चुकी है और आपको एक प्राप्तकर्ता त्रुटि मिलती है और ऐप लॉक हो जाता है। एक ही समय में दो आवाज़ें भी खेलना मुश्किल है (संभवतः ऑडियोट्रैक के पूल का उपयोग कर सकता है)।

मुझे ऑडियोट्रैक के लिए नमूना कोड देखना अच्छा लगेगा जिसमें ऑडियो स्ट्रीमिंग शामिल नहीं है।

उत्तर

1

मैंने Google कार्यालय के घंटों के दौरान इस प्रश्न से पूछा। उन्होंने कहा कि ऑडियोट्रैक में ध्वनिपूल के समान ही बग है। इस समस्या का एकमात्र समाधान देशी मीडिया प्लेयर लिखना है। हालांकि, यह समस्या केवल जिंजरब्रेड चलाने वाले दोहरे कोर फोन को प्रभावित करती है।