2012-07-02 9 views
8

पर कॉल किया गया है, मैं ऑडियोट्रैक क्लास के साथ प्रयोग कर रहा हूं। असल में, जब उपयोगकर्ता स्क्रीन पर किसी विशिष्ट ऑब्जेक्ट को स्पर्श करता है तो मेरे ऐप को ध्वनि उत्पन्न करनी होती है। मैंने एक गाइड के रूप में this example का उपयोग किया है।
वर्ग उत्पन्न करता है सेऑडियोट्रैक: प्ले() अनियमित ऑडियोट्रैक

07-02 20:40:53.459: E/AndroidRuntime(11973): FATAL EXCEPTION: Thread-10 
07-02 20:40:53.459: E/AndroidRuntime(11973): java.lang.IllegalStateException: play() called on uninitialized AudioTrack. 
07-02 20:40:53.459: E/AndroidRuntime(11973): at android.media.AudioTrack.play(AudioTrack.java:824) 
07-02 20:40:53.459: E/AndroidRuntime(11973): at com.mysounds_experimental.SoundThread.playSound(SoundThread.java:108) 
07-02 20:40:53.459: E/AndroidRuntime(11973): at com.mysounds_experimental.SoundThread.run(SoundThread.java:69) 

तरीके लगता

public void initAudioTrack() { 
     int bufferSize = AudioTrack.getMinBufferSize(sampleRate 
       , AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); 

     audioTrack = new AudioTrack(
       AudioManager.STREAM_MUSIC 
       , sampleRate 
       , AudioFormat.CHANNEL_CONFIGURATION_MONO 
       , AudioFormat.ENCODING_PCM_16BIT 
       , bufferSize 
       , AudioTrack.MODE_STREAM); 
    } 

    private void playSound(){ 
      audioTrack.write(generatedSnd, 0, numSamples); 
      audioTrack.play(); 
     } 

public void stopPlaying() { 
    audioTrack.flush(); 
    audioTrack.stop(); 
    audioTrack.release(); 
} 

@Override 
    public void run() { 
     while (mRun) { 
      try{ 
       Thread.sleep(200); 
       while(soundCycle){ 
        if(freqOfTone != -1f) { 
         generateTone(); 
         playSound(); 
         Thread.sleep(200); 
        } 
       } 
      } catch(InterruptedException e){ 
       //    soundCycle = false; 
       //    soundPool.stop(BEEP); 
      } 
     } 
    } 

इस से एक विधि है:
मेरा ऐप एकदम सही ढंग से लेकिन आम तौर पर एक मिनट के बारे में के लिए स्क्रीन को छूने के बाद यह दुर्घटनाओं काम करने के लिए लगता है एक कस्टम दृश्य मेरे धागे का उपयोग किया जाता है

@Override 
    public boolean onTouchEvent(final MotionEvent ev) { 
     int currentXPosition = (int) ev.getX(); 
     int currentYPosition = (int) ev.getY(); 

     if(ev.getX() < smBitmap.getWidth()) 
      if(ev.getY() < smBitmap.getHeight()){ 
       tempCol = smBitmap.getPixel(currentXPosition, currentYPosition); 
      } 

     final int action = ev.getAction(); 

     switch (action & MotionEvent.ACTION_MASK) { 

     case MotionEvent.ACTION_DOWN: { 

      sThread.freqOfTone = getFreqPreset(tempCol); 
      if(col != tempCol){ 
//    sThread.initAudioTrack(); 
       sThread.interrupt(); 
       if(shouldInit) { 
        shouldInit = false; 
        sThread.initAudioTrack(); 
       } 
       sThread.soundCycle = true; 
       col = tempCol; 
       invalidate(); 
      } 
      break; 
     } 

     case MotionEvent.ACTION_MOVE: { 
      sThread.freqOfTone = getFreqPreset(tempCol); 

      if (tempCol == -1 || tempCol == 0) { 
       sThread.soundCycle = false; 
       shouldInit = true; 
//    sThread.stopPlaying(); 
       sThread.interrupt(); 
       invalidate(); 
      } else { 
       if(col != tempCol){ 
        sThread.interrupt(); 
        col = tempCol; 
        invalidate(); 
       }else { 
        sThread.soundCycle = true; 
        col = tempCol; 
        invalidate(); 
       } 
      } 
      break; 
     }// case ACTION_MOVE 

     case MotionEvent.ACTION_UP: { 
      sThread.soundCycle = false; 
      shouldInit = true; 
//   sThread.stopPlaying(); 
      sThread.interrupt(); 
      col = -1; 
      mActivePointerId = INVALID_POINTER_ID; 
      break; 
     }// case ACTION_UP 

     } 

     return true; 
    } 

कोई विचार क्या यह हो रहा है?

+0

'// sThread.initAudioTrack(); 'इस –

+0

को अनमोलमेंट करें, मैंने असंतोष कहा, –

+0

को हटाएं क्षमा करें, मुझे असहमति कहना था। – droid8421

उत्तर

0

मुझे लगता है कि write() पर कॉल करने से पहले आपको play() पर कॉल करने की आवश्यकता होगी।

लेकिन मैं यह भी देखा है कि जब आप AudioTrack उदाहरणों की बहुत सारी बनाने के भी अगर आपको लगता है कि आपके पास लेखन अप सब कुछ सफाई कर रहे हैं, कभी कभी एक play() काम करने के लिए विफल रहता है, और ट्रैक अप्रारंभीकृत है।

आप कोशिश करना चाहते हैं ... IllegalStateException को पकड़ें, और write() को play() पर कॉल अप से बचने के बिना अपवाद फेंकने के बिना काम करता है।

1

आपने अपनी रोकथाम() विधि क्यों टिप्पणी की है?

आप केवल 32 ऑडियोट्रैक बना सकते हैं। यदि आप और चाहते हैं तो आपको रिलीज() विधि कॉल करना चाहिए।

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