मेरे पास एक कस्टम दृश्य है (PieView) जिसमें एक घूर्णन एनीमेशन है। अब मैं tick tick tick tick... ध्वनि को रोटेशन स्पीड के साथ सिंक्रोनाइज़ करना चाहूंगा (अर्थात, जब रोटेशन की गति तेज हो, तो टिक टिक तेज होनी चाहिए, जब रोटेशन धीमा हो, तो टिक टिक धीमा होना चाहिए)। ऐसा करने के लिए, पहले मैंने magicbox_tick.mp3 नाम की एक mp3 फ़ाइल बनाई जिसमें केवल एक (1) टिक है। इसके बाद मैंने Animation.setUpdateListener() के साथ ध्वनि चलाने की कोशिश की।

पहले मैंने MediaPlayer के साथ संगीत चलाने की कोशिश की, लेकिन कुछ १० या १५ टिक के बाद, यह बंद हो गया। तो अब मैं संगीत चलाने के लिए SoundPool कोशिश कर रहा हूं।

प्रासंगिक कोड खंड इस तरह दिखता है:

public PieView extends View {
  // ... constructors, other methods etc
  private SoundPool soundPool;
  private int soundId;

  void init(){  // called inside those constructors
        SoundPool soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
        soundId = soundPool.load(getContext(), R.raw.magicbox_tick, 1);
  }

  public void rotateTo(){
    animate()..setInterpolator(new DecelerateInterpolator())
                .setDuration(mDuration)
                .setListener(someListener)
                .rotation(targetAngle)
                .setUpdateListener(animation -> {
                    myPlaySound();  // <----------------------- This is the sound playing code
                })
                .start();
  }

  void myPlaySound(){
          soundPool.play(soundId, 1, 1, 0, 0, 1); // this doesnot play the `tick` sound
          // previously I used MediaPlayer like this:
         /*
            MediaPlayer mp = new MediaPlayer.create(getContext(), R.raw.magicbox_tick);
            mp.play(); 
               // these 2 line, after some 10 ticks, stopped working. 
          */
  }

}

मैंने कभी ऐसा कुछ नहीं किया है, और मुझे नहीं पता कि इसे कैसे ठीक किया जाए। क्या कोई मेरी मदद कर सकता है? कृपया ध्यान दें कि जब तक यह काम करता है, मैं सभी उत्तरों के लिए खुला हूं। आपको SoundPool का उपयोग करने की आवश्यकता नहीं है। तो मान लीजिए कि अगर आप इसे एंड्रॉइड MediaPlayer के साथ काम कर सकते हैं, तो मैं इसके साथ ठीक हूं।

0
Qazi Fahim Farhan 6 अप्रैल 2020, 06:30

1 उत्तर

सबसे बढ़िया उत्तर

श्रीमान माइक एम को उनकी बहुमूल्य टिप्पणी के लिए विशेष धन्यवाद। मैं इसे MediaPlayer का उपयोग करके ठीक करने में सक्षम था। MediaPlayer.release() विधि को कॉल किया जाना चाहिए। और ध्वनि को कोणीय गति के साथ समन्वयित करने के लिए, मैंने एक if ब्लॉक रखा जो जांचता है कि क्या रोटेशन dTheta tolerance कोण से अधिक है। तो, अगर किसी को इसकी आवश्यकता है, तो पूरा कोड इस तरह दिखता है:

public PieView extends View{
     private float omega0; // holds the previous rotation
    /**
     * @brief: plays a music using mediaPlayer
     * @input:
     * @output: void, plays a music
     * */
    private void myPlayTick() {
        float omega1 = Math.abs(getRotation());
        float dOmeda = 0;
        if(omega1>omega0){
            dOmeda = omega1 - omega0;
        }else{
            dOmeda = omega0-omega1;
        }
        if(dOmeda > threshold){
            omega0 = omega1; // update previous rotation
            final MediaPlayer mp = MediaPlayer.create(getContext(), R.raw.magicbox_tick);
            mp.start();
            mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    releaseMediaPlayer(mp);
                }
            });
        }
    }

    /**
     * @brief: releases mediaPlayer resource so that other mediaPlayers can use sound hardware resources
     * @input: MediaPlayer object
     * @output: void
     * */
    private void releaseMediaPlayer(MediaPlayer mediaPlayer) {
        try {
            if (mediaPlayer != null) {
                if (mediaPlayer.isPlaying())
                    mediaPlayer.stop();
                mediaPlayer.release();
                mediaPlayer = null;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


 public void rotateTo(){
    animate()..setInterpolator(new DecelerateInterpolator())
                .setDuration(mDuration)
                .setListener(someListener)
                .rotation(targetAngle)
                .setUpdateListener(animation -> {
                   myPlayTick();                  
                })
                .start();
  }
     // ... rest of the code, such as constructors, etc
}
0
Qazi Fahim Farhan 6 अप्रैल 2020, 05:37