VolumeShaper-এর মাধ্যমে অ্যামপ্লিচিউড নিয়ন্ত্রণ করা

আপনি অডিও অ্যাপে VolumeShaper ব্যবহার করে ফেড-ইন, ফেড-আউট, ক্রস ফেড, ডাকিং এবং অন্যান্য ছোট অটোমেটিক ভলিউম ট্রানজিশন পারফর্ম করতে পারবেন। VolumeShaper ক্লাস Android 8.0 (API লেভেল ২৬) ও তার পরবর্তী ভার্সনে উপলভ্য।

আপনি AudioTrack বা MediaPlayer-এর ইনস্ট্যান্সে createVolumeShaper() কল করে VolumeShaper তৈরি করেন। VolumeShaper শুধুমাত্র AudioTrack বা MediaPlayer-এর মাধ্যমে তৈরি করা অডিওতে কাজ করে যা এটি তৈরি করেছে।

VolumeShaper.Configuration

VolumeShaper-এর আচরণ তার VolumeShaper.Configuration দ্বারা সংজ্ঞায়িত করা হয়। কনফিগারেশনটি একটি *ভলিউম কার্ভ, ইন্টারপোলেটর টাইপ, এবং সময়কাল নির্দিষ্ট করে।*

ভলিউম কার্ভ

ভলিউম কার্ভ সময়ের সাথে সাথে অ্যাম্প্লিটিউডের পরিবর্তন দেখায়। এটি এক জোড়া ফ্লোট অ্যারে, x[] এবং y[] দ্বারা সংজ্ঞায়িত করা হয় যা কন্ট্রোল পয়েন্টের একটি সিরিজ সংজ্ঞায়িত করে। প্রতিটি (x, y) জোড়া যথাক্রমে সময় ও ভলিউমকে বোঝায়। অ্যারেগুলির দৈর্ঘ্য সমান হতে হবে এবং এতে কমপক্ষে ২টি এবং ১৬টির বেশি মান থাকতে হবে। (কার্ভের সর্বাধিক দৈর্ঘ্য getMaximumCurvePoints()-এ উল্লেখ করা আছে।)

সময়ের স্থানাঙ্ক [0.0, 1.0] ইন্টারভ্যালে দেওয়া আছে। প্রথম টাইম পয়েন্ট অবশ্যই ০.০, শেষটি অবশ্যই ১.০ হতে হবে এবং সময় অবশ্যই একঘেয়েভাবে বৃদ্ধি পেতে হবে।

ভলিউম কোঅর্ডিনেট লিনিয়ার স্কেলে [০.০, ১.০] ইন্টারভ্যালে নির্দিষ্ট করা হয়।

ইন্টারপোলেটরের ধরন

ভলিউম কার্ভ সবসময় নির্দিষ্ট কন্ট্রোল পয়েন্টের মধ্যে দিয়ে যায়। কন্ট্রোল পয়েন্টের মধ্যেকার ভ্যালু কনফিগারেশনের ইন্টারপোলেটর টাইপ অনুযায়ী স্প্লাইন দ্বারা প্রাপ্ত হয়। উপলভ্য VolumeShaper ইন্টারপোলেটর ধরনের জন্য চারটি কনস্ট্যান্ট আছে:

  • VolumeShaper.Configuration.INTERPOLATOR_TYPE_STEP
  • VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR
  • VolumeShaper.Configuration.INTERPOLATOR_TYPE_CUBIC
  • VolumeShaper.Configuration.INTERPOLATOR_TYPE_CUBIC_MONOTONIC

সময়সীমা

[0.0, 1.0] ইন্টারভ্যালে নির্দিষ্ট করা সময় কোঅর্ডিনেট, আপনার উল্লেখ করা সময়সীমা অনুযায়ী মিলিসেকেন্ডে স্কেল করা হয়। শেপার যখন চলছে এবং অডিও আউটপুটে কার্ভ প্রয়োগ করছে তখন এটি ভলিউম কার্ভের প্রকৃত দৈর্ঘ্য নির্ধারণ করে।

VolumeShaper ব্যবহার করা

কনফিগারেশন তৈরি করা হচ্ছে

VolumeShaper তৈরি করার আগে, আপনাকে অবশ্যই VolumeShaper.Configuration-এর একটি ইনস্ট্যান্স তৈরি করতে হবে। VolumeShaper.Configuration.Builder() ব্যবহার করে এটি করুন:

Kotlin

val config: VolumeShaper.Configuration = VolumeShaper.Configuration.Builder()
        .setDuration(3000)
        .setCurve(floatArrayOf(0f, 1f), floatArrayOf(0f, 1f))
        .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
        .build()

Java

VolumeShaper.Configuration config =
  new VolumeShaper.Configuration.Builder()
      .setDuration(3000)
      .setCurve(new float[] {0.f, 1.f}, new float[] {0.f, 1.f})
      .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
      .build();

With no arguments the VolumeShaper.Configuration.Builder constructor returns a builder that creates a configuration with default settings: INTERPOLATOR_TYPE_CUBIC, a one second duration, and no curve. You must add a curve to the builder before calling build().

The framework provides constants for configurations with pre-built curves, each with one second duration:

  • VolumeShaper.Configuration.LINEAR_RAMP
  • VolumeShaper.Configuration.CUBIC_RAMP
  • VolumeShaper.Configuration.SINE_RAMP
  • VolumeShaper.Configuration.SCURVE_RAMP

Creating a VolumeShaper

To create a VolumeShaper, call createVolumeShaper() on an instance of the appropriate class, passing in a VolumeShaper.Configuration:

Kotlin

volumeShaper = myMediaPlayer.createVolumeShaper(config)
volumeShaper = myAudioTrack.createVolumeShaper(config)

Java

volumeShaper = myMediaPlayer.createVolumeShaper(config);
volumeShaper = myAudioTrack.createVolumeShaper(config);

A single track or media player can have many shapers attached to it, and you can control each shaper separately. The outputs of all the shapers on a track or player are multiplied together. A VolumeShaper cannot be shared between AudioTracks or MediaPlayers, but you can use the same configuration in calls to createVolumeShaper to build identical shapers on multiple AudioTracks or MediaPlayers.

When you create the shaper, its first control point (at t = 0) is applied to the audio stream. If the initial volume is not 1.0 and your app is playing material at create time, your audio might have an abrupt change in volume. Best practice is to start playing audio from silence and use a VolumeShaper to implement a fade-in when playback starts. Create a VolumeShaper that starts at 0 volume and fades up. For example:

setCurve(new float[] {0.f, 1.f}, new float[] {0.f, 1.f})

একই সময়ে প্লেব্যাক ও শেপার চালু করুন। এটি নিশ্চিত করে যে প্লেব্যাক নীরবতা থেকে শুরু হয় এবং ভলিউম সম্পূর্ণ ভলিউমে বৃদ্ধি পায়। পরবর্তী বিভাগে এটি ব্যাখ্যা করা হয়েছে।

VolumeShaper চালানো হচ্ছে

শেপার তৈরি হওয়ার সাথে সাথেই প্রথম কন্ট্রোল পয়েন্টের ভলিউম লেভেল অডিও পাথে প্রয়োগ করা হলেও, আপনি VolumeShaper.Operation.PLAY সহ apply() পদ্ধতি কল না করা পর্যন্ত শেপার কার্ভ বরাবর এগোয় না। শেপার তৈরি করার পরে, শেপার শুরু করার জন্য apply()-এর প্রথম ইনভোকেশনে অবশ্যই PLAY অপারেশন উল্লেখ করতে হবে। এটি প্রথম থেকে শেষ কন্ট্রোল পয়েন্ট পর্যন্ত কার্ভ রান করে:

Kotlin

shaper.apply(VolumeShaper.Operation.PLAY)

জাভা

shaper.apply(VolumeShaper.Operation.PLAY);

শেপার চলাকালীন আপনি REVERSE এবং PLAY অপারেশন নির্দিষ্ট করে বিকল্প apply() কল ইস্যু করতে পারবেন। এটি প্রতিবার কন্ট্রোল পয়েন্টের রিডআউটের দিক পরিবর্তন করে।

শেপার ক্রমাগত ভলিউম অ্যাডজাস্ট করে এবং সমস্ত কন্ট্রোল পয়েন্টের মধ্য দিয়ে যায় যতক্ষণ না এটি শেষ হয়। শেপার কার্ভের শেষ (প্লে অপারেশনের জন্য) বা প্রথম (রিভার্স অপারেশনের জন্য) কন্ট্রোল পয়েন্টে পৌঁছালে এটি ঘটে।

শেপারের মেয়াদ শেষ হয়ে গেলে, ভলিউম শেষ সেটিংয়েই থেকে যায়, যা প্রথম বা শেষ কন্ট্রোল পয়েন্ট হতে পারে। আপনি যেকোনও সময় বর্তমান ভলিউম লেভেলের জন্য VolumeShaper.getVolume()-কে কল করতে পারবেন।

শেপারের মেয়াদ শেষ হয়ে গেলে, আপনি কার্ভটি বিপরীত দিকে চালানোর জন্য আরেকটি apply() কল ইস্যু করতে পারেন। যেমন, PLAY চলার সময় শেপার শেষ হয়ে গেলে, পরবর্তী apply() অবশ্যই REVERSE হতে হবে। PLAY-এর মেয়াদ শেষ হওয়ার পরে PLAY কল করা অথবা REVERSE-এর মেয়াদ শেষ হওয়ার পরে REVERSE কল করার কোনও প্রভাব নেই।

আপনাকে অবশ্যই PLAY এবং REVERSE অপারেশনগুলি বিকল্প করতে হবে। কোনও কার্ভকে তার প্রথম থেকে শেষ কন্ট্রোল পয়েন্ট পর্যন্ত প্লে করে আবার প্রথম কন্ট্রোল পয়েন্ট থেকে রিস্টার্ট করার কোনও উপায় নেই। আপনি replace() পদ্ধতি ব্যবহার করতে পারেন, যা পরবর্তী বিভাগে বর্ণনা করা হয়েছে, কার্ভের কপি দিয়ে কার্ভটি পরিবর্তন করতে। এটি শেপার রিসেট করে, এটি আবার শুরু করার জন্য PLAY অপারেশন প্রয়োজন।

কার্ভ পরিবর্তন করা

VolumeShaper-এর কার্ভ পরিবর্তন করতে replace() পদ্ধতি ব্যবহার করুন। এই পদ্ধতিতে একটি কনফিগারেশন, একটি অপারেশন এবং একটি জয়েন প্যারামিটার লাগে। শেপার চলাকালীন বা এর মেয়াদ শেষ হওয়ার পরে, আপনি যেকোনও সময় replace() মেথড কল করতে পারেন:

Kotlin

val newConfig = VolumeShaper.Configuration.Builder()
        .setDuration(1000)
        .setCurve(floatArrayOf(0f, 0.5f), floatArrayOf(0f, 1f))
        .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
        .build()
val join = true
shaper.replace(newConfig, VolumeShaper.Operation.PLAY, join)

জাভা

VolumeShaper.Configuration newConfig =
  new VolumeShaper.Configuration.Builder()
    .setDuration(1000)
    .setCurve(new float[] {0.f, 0.5f}, new float[] {0.f, 1.f})
    .setInterpolatorType(VolumeShaper.Configuration.INTERPOLATOR_TYPE_LINEAR)
    .build();
boolean join = true;
shaper.replace(newConfig, VolumeShaper.Operation.PLAY, join);

শেপার চলাকালীন আপনি replace() কল করলে, এটি ভলিউম পরিবর্তন করা বন্ধ করে দেয় এবং বর্তমান ভ্যালুতেই থেকে যায়। তারপর শেপার প্রথম কন্ট্রোল পয়েন্ট থেকে নতুন কার্ভ শুরু করার চেষ্টা করে। এর অর্থ হল, কলের পরে শেপার চলবে কিনা তা অপারেশন আর্গুমেন্ট নিয়ন্ত্রণ করে। নতুন কার্ভ অবিলম্বে শুরু করতে PLAY নির্দিষ্ট করুন, নতুন কার্ভের প্রথম কন্ট্রোল পয়েন্টের ভলিউমে শেপার পজ করে রাখতে REVERSE নির্দিষ্ট করুন। আপনি পরে apply(VolumeShaper.Operation.PLAY)-এর মাধ্যমে শেপার চালু করতে পারবেন।

join = false-এর সাথে replace() কল করলে, শেপার তার প্রথম কন্ট্রোল পয়েন্টের মাধ্যমে নির্দিষ্ট করা লেভেলে কার্ভ শুরু করে। এর ফলে ভলিউমে অবিচ্ছিন্নতা দেখা দিতে পারে। join = true-এর মাধ্যমে replace()-কে কল করে আপনি এটি এড়াতে পারবেন। এটি নতুন কার্ভের প্রথম কন্ট্রোল পয়েন্টকে শেপারের বর্তমান লেভেলে সেট করে এবং প্রথম ও শেষ কন্ট্রোল পয়েন্টের মধ্যে থাকা সব কন্ট্রোল পয়েন্টের ভলিউম স্কেল করে যাতে নতুন কার্ভের আপেক্ষিক শেপ বজায় থাকে (শেষ কন্ট্রোল পয়েন্ট অপরিবর্তিত থাকে)। স্কেলিং অপারেশন শেপারের নতুন কার্ভে কন্ট্রোল পয়েন্ট স্থায়ীভাবে পরিবর্তন করে।

VolumeShaper সরানো হচ্ছে

সিস্টেম বন্ধ হয়ে যায় এবং VolumeShaper-এর AudioTrack বা MediaPlayer রিলিজ হয়ে গেলে বা আর ব্যবহার না হলে, সিস্টেম গার্বেজ সংগ্রহ করে। আপনি কোনও শেপারকে অবিলম্বে ধ্বংস করতে close() পদ্ধতি কল করতে পারেন। সিস্টেম প্রায় ২০ মিলিসেকেন্ডের মধ্যে অডিও পাইপলাইন থেকে শেপার সরিয়ে দেয়। অডিও চলার সময় VolumeShaper বন্ধ করার সময় সতর্ক থাকুন। আপনি close() কল করার সময় শেপারের ভলিউম ১.০-এর কম হলে, শেপারের ভলিউম স্কেল ১.০-এ পরিবর্তিত হয়। এর ফলে ভলিউম হঠাৎ বেড়ে যেতে পারে।