VolumeShaper দিয়ে প্রশস্ততা নিয়ন্ত্রণ করা

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

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

ভলিউমশেপার।কনফিগারেশন

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

আয়তনের বক্ররেখা

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

সময়ের স্থানাঙ্কগুলি ব্যবধানে দেওয়া হয় [0.0, 1.0]। প্রথম সময় বিন্দু 0.0 হতে হবে, শেষ 1.0 হতে হবে, এবং সময় একঘেয়ে বৃদ্ধি হতে হবে.

ভলিউম স্থানাঙ্কগুলি ব্যবধানে রৈখিক স্কেলে নির্দিষ্ট করা হয় [0.0, 1.0]।

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

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

  • ভলিউমশেপার।কনফিগারেশন।INTERPOLATOR_TYPE_STEP
  • ভলিউমশেপার।কনফিগারেশন।INTERPOLATOR_TYPE_LINEAR
  • ভলিউমশেপার।কনফিগারেশন।INTERPOLATOR_TYPE_CUBIC
  • ভলিউমশেপার।কনফিগারেশন।INTERPOLATOR_TYPE_CUBIC_MONOTONIC

সময়কাল

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

একটি ভলিউমশেপার ব্যবহার করে

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

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

কোটলিন

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.Operation.PLAY এর সাথে apply() পদ্ধতিতে কল করেন। শেপার তৈরি করার পরে, শেপার শুরু করার জন্য apply() এর প্রথম আহ্বান অবশ্যই PLAY অপারেশনটি নির্দিষ্ট করতে হবে। এটি তার প্রথম থেকে শেষ নিয়ন্ত্রণ পয়েন্ট পর্যন্ত বক্ররেখা চালায়:

কোটলিন

shaper.apply(VolumeShaper.Operation.PLAY)

Java

shaper.apply(VolumeShaper.Operation.PLAY);

যখন শেপার চলছে তখন আপনি রিভার্স এবং প্লে অপারেশনগুলি নির্দিষ্ট করে বিকল্প apply() কল ইস্যু করতে পারেন। এটি প্রতিবার নিয়ন্ত্রণ পয়েন্টগুলির রিডআউটের দিক পরিবর্তন করে।

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

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

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

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

বক্ররেখা পরিবর্তন

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

কোটলিন

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)

Java

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 সংগ্রহ করে যখন এর AudioTrack বা MediaPlayer প্রকাশিত হয় বা আর ব্যবহার করা হয় না। আপনি এটিকে অবিলম্বে ধ্বংস করতে একটি শেপারে close() পদ্ধতিতে কল করতে পারেন। সিস্টেমটি প্রায় 20 ms এর মধ্যে অডিও পাইপলাইন থেকে শেপারটিকে সরিয়ে দেয়। অডিও চালানোর সময় VolumeShaper বন্ধ করার সময় সতর্ক থাকুন। আপনি close() কল করার সময় শেপারের ভলিউম 1.0 এর কম হলে, শেপারের ভলিউম স্কেল 1.0 এ পরিবর্তিত হয়। এটি ভলিউম হঠাৎ বৃদ্ধি হতে পারে।