সতর্কতা: এটি একটি অত্যন্ত উন্নত গাইড যেটি আপনার অ্যান্ড্রয়েডে ব্লুটুথ স্ট্যাক মডিফাই করার সাথে জড়িত - এই গাইডটি পুরোপুরি পড়ুন এবং সব নির্দেশনা সঠিকভাবে ফলো করুন।
ব্লুটুথ হেডসেট এবং ব্লুটুথ অডিও জনপ্রিয় হওয়ার সত্ত্বেও, এটি অডিওফাইলদের জন্য একটু সমস্যা কারণ ব্লুটুথ প্রুভ করা হয়েছে অডিও কোয়ালিটি কমাতে, কারণ অডিও ইনফরমেশন এবং ফ্রিকোয়েন্সির বিটস ব্লুটুথ স্ট্রিমিং এর ওপর হয়ে যাওয়ায় হারিয়ে যায়।
এইই কারণ কিছু ম্যানুফ্যাকচারার aptX এবং LDAC কোডেক বের করছে, সাউন্ড কোয়ালিটি ব্লুটুথের ওপর বেড়ানোর জন্য স্ট্যান্ডার্ড SBC ব্লুটুথ কোডেকের চেয়ে যা সকল হেডফোন এবং অধিকাংশ ব্লুটুথ ডিভাইস সাপোর্ট করে - যাইহোক, aptX এবং LDAC কোডেক বিশিষ্ট ডিভাইস অনেক বেশি দামি কারণ এই কোডেকগুলো লাইসেন্সিং ফি প্রয়োজন, যা কনসিউমার দীর্ঘমেয়াদে পেয় করে।
SBC ব্লুটুথ কোডেকের কম অডিও কোয়ালিটি হলো সকল বর্তমান ব্লুটুথ স্ট্যাক এবং হেডফোনের কনফিগারেশনের কৃত্রিম লিমিটেশন Wegen, এবং এই লিমিটেশন যেকোনো এক্সিস্টিং ডিভাইসে বাইপাস করা যায়।
আপনি যদি ব্লুটুথ অডিওতে আগ্রহী হন, তবে আমরা এই গাইডের শেষে আপনাকে দেখাব কীভাবে একটি ব্লুটুথ অডিও লগ ডাম্প নেওয়া যায় এবং তা ইন্সপেক্ট করা যায় আপনার অ্যান্ড্রয়েডের ব্লুটুথ রিসিভার থেকে আপনি কী ধরনের অডিও কোয়ালিটি এবং ফ্রিকোয়েন্সি পাচ্ছেন সেটি দেখতে।
এই গাইডের অধিকাংশ পার্ট কিছু সিম্পল টুইকস এবং আপনার ব্লুটুথ অডিও আউটপুট পড়ার উপায়ের ওপর ফোকাস করবে স্ট্যান্ডার্ড SBC ব্লুটুথ কোডেকের আউটপুট কোয়ালিটি উল্লেখযোগ্যভাবে বেড়ানোর জন্য - অনুগ্রহ করে এই পুরো গাইড সাবধানে পড়ুন কারণ এটি khá শিক্ষামূলক এবং আপনার ডিভাইস মডেলের ওপর নির্ভর করে ফ্ল্যাশ বা টুইক করার জন্য অনেক ভিন্ন জিনিস আছে।
এই গাইডের শেষে অনেক জনপ্রিয় অ্যান্ড্রয়েড ডিভাইসের জন্য প্রি-প্যাচড ব্লুটুথ স্ট্যাকের একটি তালিকা আছে - এগুলো রিকভারিতে ফ্ল্যাশ করা যায় যেকোনো অন্য ফ্ল্যাশেবল .zip-এর মত - আপনার ডিভাইস যদি তালিকার কোনোটিই না হয়, তবে আপনাকে অ্যান্ড্রয়েডে ব্লুটুথ স্ট্যাক মডিফাই করার গাইড ফলো করতে হবে।
SBC কোডেক সম্পর্কে সংক্ষিপ্ত টেকনিক্যাল তথ্য
SBC-র অনেক ভিন্ন প্যারামিটার আছে যা কানেকশন সেটআপ ফেজে নেগোশিয়েট হয়:
- অডিও চ্যানেল টাইপ এবং সংখ্যা: Joint Stereo, Stereo, Dual Channel, Mono;
- ফ্রিকোয়েন্সি ব্যান্ডের সংখ্যা: 4 বা 8;
- এক প্যাকেটে অডিও ব্লকের সংখ্যা: 4, 8, 12, 16;
- কোয়ান্টাইজেশন বিট এলোকেশন অ্যালগরিদম: Loudness, SNR;
- কোয়ান্টাইজেশন প্রসেসে ব্যবহৃত ম্যাক্সিমাম এবং মিনিমাম বিটপুল: সাধারণত 2-53।
ডিকোডারকে এই প্যারামিটারগুলোর যেকোনো কম্বিনেশন সাপোর্ট করতে হবে। এনকোডার শুধু একটি অংশ ইমপ্লিমেন্ট করতে পারে।
এক্সিস্টিং ব্লুটুথ স্ট্যাকস সাধারণত নিচের প্রোফাইল নেগোশিয়েট করে: Joint Stereo, 8 bands, 16 blocks, Loudness, bitpool 2..53। এই প্রোফাইল 44.1 kHz অডিও এনকোড করে 328 kbps বিটরেটে।
বিটপুল প্যারামিটার সরাসরি বিটরেটকে প্রভাবিত করে একই প্রোফাইলের মধ্যে: এটি যত বেশি, বিটরেট তত বেশি, এবং অতএব কোয়ালিটি।
যাইহোক, বিটপুল প্যারামিটার কোনো স্পেসিফিক প্রোফাইলের সাথে বাউন্ড নয়। বিটরেট অন্যান্য প্যারামিটার দ্বারা উল্লেখযোগ্যভাবে প্রভাবিত হয়: অডিও চ্যানেল টাইপ, ফ্রিকোয়েন্সি ব্যান্ডের সংখ্যা, অডিও ব্লকের সংখ্যা। আপনি বিটরেট ইনডায়রেক্টলি বেড়াতে পারেন নন-স্ট্যান্ডার্ড প্রোফাইল নেগোশিয়েট করে, বিটপুল পরিবর্তন ছাড়া।
উদাহরণস্বরূপ, Dual Channel চ্যানেলগুলো আলাদা করে এনকোড করে, প্রতিটি চ্যানেলের জন্য পুরো বিটপুল ব্যবহার করে। ডিভাইসকে Dual Channel ব্যবহার করতে বাধ্য করা Joint Stereo-এর বদলে আমাদের প্রায় ডবল বিটরেট দেবে একই ম্যাক্সিমাম বিটপুলে, 617 kbps।
আমার মতে বিটপুল একটি ইন্টারন্যাল ভেরিয়েবল হওয়া উচিত। এটি A2DP স্পেসিফিকেশন ডিজাইন ফল্ট যে বিটপুল ভ্যালু অন্যান্য কোডেক প্যারামিটারসহ বাউন্ড নয় এবং শুধু একটি গ্লোবাল ভ্যালু হিসেবে ডিফাইন করা হয়েছে।
এই ফিক্সড বিটপুল এবং বিটরেট ভ্যালু হাই-কোয়ালিটি অডিওর জন্য রিকমেন্ডেড ভ্যালু থেকে আসল। কিন্তু রিকমেন্ডেশন হলো এই ভ্যালুগুলোতে প্রোফাইল লিমিট করার এক্সকিউজ নয়।
A2DP স্পেসিফিকেশন v1.2, যা ২০০৭ থেকে ২০১৫ পর্যন্ত সক্রিয় ছিল, সকল ডিকোডারকে ৫১২ kbps পর্যন্ত বিটরেটে সঠিকভাবে কাজ করতে বাধ্য করত:
SNK-এর ডিকোডার সব সম্ভব বিটপুল ভ্যালু সাপোর্ট করবে যা ম্যাক্সিমাম বিট রেটের এক্সেসের ফলাফল দেয় না। এই প্রোফাইল উপলব্ধ ম্যাক্সিমাম বিট রেটকে ৩২০kb/s-এ লিমিট করে মোনোর জন্য, এবং ৫১২kb/s-এ টু-চ্যানেল মোডের জন্য।
স্পেসিফিকেশনের নতুন ভার্সনে কোনো বিটরেট লিমিটেশন নেই। অনুমান করা হয় ২০১৫-এর পর রিলিজ হওয়া আধুনিক হেডফোন ১০০০ kbps পর্যন্ত বিটরেট সাপোর্ট করতে পারে।
যেকোনো কারণে, সকল বর্তমানে টেস্ট করা ব্লুটুথ স্ট্যাক (Linux (PulseAudio), Android, Blackberry এবং macOS) ম্যাক্সিমাম বিটপুল প্যারামিটারের কৃত্রিম রেস্ট্রিকশন রেখেছে, যা সরাসরি ম্যাক্সিমাম বিটরেটকে প্রভাবিত করে। কিন্তু এটিই সবচেয়ে বড় সমস্যা নয়, প্রায়শই সব হেডফোনও ম্যাক্সিমাম বিটপুল ভ্যালুকে ৫৩-এ লিমিট করে।
অনেক ডিভাইস মডিফাইড ব্লুটুথ স্ট্যাকের সাথে ৫০৭ kbps বিটরেটে ঠিকমতো কাজ করে, বিনা ইন্টারাপ্ট এবং ক্র্যাকলিং-র। কিন্তু এই বিটরেট কখনো নেগোশিয়েট হবে না স্বাভাবিক কন্ডিশনে, স্টক ব্লুটুথ স্ট্যাকসের সাথে।
***নিচের গাইডগুলো ব্যবহার করে টেস্ট করার জন্য প্রয়োজনীয়: bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso.torrent
PC-এ টেস্ট করার পদ্ধতি
হাই বিটরেট SBC হেডফোন কম্প্যাটিবিলিটি টেস্ট সবচেয়ে সহজ পারফর্ম করা যায় PC-এ একটি ব্লুটুথ অ্যাডাপ্টার দিয়ে। আমি Ubuntu ইমেজ প্রস্তুত করেছি একটি মডিফাইড ব্লুটুথ স্ট্যাকসহ, যা ভার্চুয়াল মেশিনে রান করা যায় (ব্লুটুথ অ্যাডাপ্টার কানেক্ট করে USB ডিভাইস হিসেবে ভার্চুয়াল মেশিনের ভিতরে, এটি ল্যাপটপে বিল্ট-ইন অ্যাডাপ্টারসহও কাজ করে) বা USB ফ্ল্যাশ ড্রাইভ থেকে বুট করে। এই ইমেজ নিচের প্রোফাইল ব্যবহার করে: Dual Channel, 8 bands, 16 blocks, Loudness, bitpool 2..41, 44.1 kHz, যা ৪৮৫ kbps বিটরেট প্রদান করে।
VM-এ রান করা
- Virtualbox এবং Virtualbox Extension Pack ডাউনলোড করুন: https://www.virtualbox.org/wiki/Downloads;
- Virtualbox ইনস্টল করুন, শুরু করুন;
- File → Preferences → Extensions ব্যবহার করে Extension Pack ইনস্টল করুন;
- নতুন ভার্চুয়াল মেশিন তৈরি করুন: Linux, Ubuntu (64-bit), 1024 RAM. HDD তৈরি করবেন না।
- ভার্চুয়াল মেশিন সেটিংসে নেভিগেট করুন, Storage-এ Controller: IDE, Empty নির্বাচন করুন, CD আইকনে প্রেস করুন → Choose virtual optical disk file;
- ডাউনলোড করা bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso সিলেক্ট করুন;
- সেভ করুন এবং সেটিংস উইন্ডো বন্ধ করুন, ভার্চুয়াল মেশিন শুরু করুন;
- নিচে ডান কোণে USB কেবিল আইকনে রাইট-ক্লিক করুন, আপনার ব্লুটুথ অ্যাডাপ্টার সিলেক্ট করুন;
PC-এ রান করা
ইমেজ BIOS/CSM এবং UEFI বুটিং সাপোর্ট করে।
- Etcher ব্যবহার করে ইমেজটি একটি USB ফ্ল্যাশ ড্রাইভে বানান: https://www.balena.io/etcher/. এই অপারেশন USB ড্রাইভের সকল এক্সিস্টিং ফাইল ডিলিট করবে।
- PC বন্ধ করুন;
- USB ফ্ল্যাশ ড্রাইভ ইনসার্ট করুন, PC অন করুন এবং বুট অর্ডার বাটন প্রেস করুন (সাধারণত Esc বা F12);
- আপনার USB ফ্ল্যাশ ড্রাইভ সিলেক্ট করুন।
টেস্ট পারফর্ম করা
- (ঐচ্ছিক কিন্তু সুপারিশকৃত) ডেস্কটপে "Btsnoop Dump" স্ক্রিপ্টে ডাবল ক্লিক করুন। এটি পাশাপাশি বিশ্লেষণের জন্য ব্লুটুথ ডেটা ক্যাপচার শুরু করবে। টার্মিনাল উইন্ডো বন্ধ করবেন না।
- হেডফোনকে পেয়ারিং মোডে স্যুইচ করুন;
- উপরের ডান কোণে অ্যারোতে ক্লিক করুন, ব্লুটুথ আইকন সিলেক্ট করুন → Bluetooth Settings;
- আপনার হেডফোন বেছে নিন, পেয়ারিং কমপ্লিট হওয়া পর্যন্ত অপেক্ষা করুন এবং উইন্ডো বন্ধ করুন;
- Ubuntu ভলিউম প্রায় ২/৩-এ সেট করুন। হেডসেট বাটন ব্যবহার করে ভলিউমও কমান যাতে পেয়ারিংয়ের পর খুব লাউড নয়।
- "music" ফোল্ডার খুলুন, "testrecord1.flac" প্লে করুন;
- (ঐচ্ছিক কিন্তু সুপারিশকৃত) প্লেয়ার বন্ধ করুন, টার্মিনাল উইন্ডো বন্ধ করুন। এটি ডেটা ক্যাপচার বন্ধ করবে।
- (ঐচ্ছিক কিন্তু সুপারিশকৃত) Firefox ব্রাউজার খুলুন, ডেটা ডাম্প আপলোড করুন (ডেস্কটপে btsnoop_hci.btsnoop) https://btcodecs.valdikss.org.ru/-এ
আপনি music ফোল্ডারের অন্যান্য মিউজিক শুনতে পারেন, বা আপনার নিজের আপলোড করতে পারেন;
হেডফোনে কোনো ক্র্যাকলিং, অডিও ইন্টারাপশন বা অন্যান্য সাউন্ড ডিস্টর্টশন হওয়া উচিত নয়। আপনি যদি ভালো হাই-কোয়ালিটি সাউন্ড শুনেন, তবে এর মানে আপনার হেডফোন ৪৮৫ kbps বিট রেটের অডিও সাপোর্ট করে।
অ্যান্ড্রয়েড ডিভাইসে টেস্ট করার পদ্ধতি
অ্যান্ড্রয়েড স্মার্টফোন বা ট্যাবলেট থেকে টেস্ট করতে আপনাকে মডিফাইড ব্লুটুথ স্ট্যাক ব্যবহার করতে হবে, যেটি রুট প্রিবিলেজ চায়।
অ্যান্ড্রয়েডে ব্লুটুথ ডেটা ডাম্প ক্যাপচার করার পদ্ধতি
- ব্লুটুথ বন্ধ করুন;
- Developer Settings-এ, "Enable Bluetooth HCI snoop log" সুইচ ইনেবল করুন;
- ব্লুটুথ অন করুন, ব্লুটুথ মেনু ব্যবহার করে আপনার হেডসেটের সাথে কানেক্ট করুন (এটি গুরুত্বপূর্ণ! অটো কানেকশন দেবেন না!);
- ছোট অডিও স্যাম্পল প্লে করুন;
- Developer settings খুলুন, "Enable Bluetooth HCI snoop log" সুইচ ডিসেবল করুন;
- /storage/emulated/0/btsnoop_hci.log বা /data/misc/bluetooth/logs/btsnoop_hci.log তৈরি হওয়া উচিত। যদি মিসিং হয়, /etc/bluetooth/bt_stack.conf টেক্সট এডিটর দিয়ে খুলুন এবং BtSnoopFileName অপশনে পাথ দেখুন।
হেডফোনে কোনো ক্র্যাকলিং, অডিও ইন্টারাপশন বা অন্যান্য সাউন্ড ডিস্টর্টশন হওয়া উচিত নয়। আপনি যদি প্যাচড লাইব্রেরির সাথে ভালো হাই-কোয়ালিটি সাউন্ড শুনেন, তবে এর মানে আপনার হেডফোন ৫১২ kbps বিট রেটের অডিও সাপোর্ট করে।
উপরের অ্যালগরিদমটি সাবধানে ফলো করুন। বিশেষ করে, আপনি যদি হেডফোন বন্ধ বা ডিসকানেক্ট করেন পেয়ারিংয়ের পর, এটি গুরুত্বপূর্ণ যে আপনি ব্লুটুথ সেটিংস থেকে ম্যানুয়ালি হেডফোনের সাথে কানেক্ট করুন, অটো কানেকশন দেবেন না!
কমপক্ষে ৫১২ kbit/s SBC সাপোর্ট করা ডিভাইস
- 1MORE iBFree
- JBL Everest 310
- JBL Everest 700
- Skullcandy HESH 3
- Sony WI-C400
- Sony MDR-1ABT
- Sony MDR-ZX770BT
- Sony MDR-XB650BT
- Sony MDR-XB950B1
- Sony SBH50
- Bluedio T4s (Bitpool max 39. Dual Channel সাপোর্ট না করার রেসপন্স দেয়, কিন্তু ফোর্স করলে কাজ করে, 462 kbit/s. A2DP স্পেসিফিকেশনের সাথে কনফর্ম করে না।)
- Bluedio T5 (Dual Channel সাপোর্ট না করার রেসপন্স দেয়, কিন্তু ফোর্স করলে কাজ করে। A2DP স্পেসিফিকেশনের সাথে কনফর্ম করে না।)
- Bluedio T6 (Dual Channel সাপোর্ট না করার রেসপন্স দেয়, কিন্তু ফোর্স করলে কাজ করে। A2DP স্পেসিফিকেশনের সাথে কনফর্ম করে না। Adopt Max 97220 চিপ।)
- Marshall Major II Bluetooth
- Overdrive RealForce D1
- Edifier W830BT
- DEXP BT-250
- Logitech BT Adapter
- Noname automotive head unit (CSR8645 chip)
- Sony DSX-A400BT automotive head unit
৫১২ kbit/s-এর চেয়ে বেশি SBC সাপোর্ট করা ডিভাইস
- JBL Everest 310 (617-660 kbit/s)
- Sony WI-C400 (576 kbit/s)
- Sony MDR-ZX770BT (617-660 kbit/s)
- Marshall Major II Bluetooth (617-660 kbit/s)
- Overdrive RealForce D1 (730 kbit/s, dual channel, 4 subbands)
উচ্চ বিটরেট বা Dual Channel-এ কাজ না করার ডিভাইস
- Harper HB-202 (cracklings; Beken BK3256 chip)
- Sony Ericsson MW600 (high frequency distortion, cracklings; ২০০৯ সালের ডিভাইস)
কেন এটি গুরুত্বপূর্ণ: SBC 328k এবং 485k vs aptX
aptX সাউন্ড কোয়ালিটির জনপ্রিয় বিশ্বাসের বিপরীতে, কিছু কেসে এটি SBC-এর চেয়ে খারাপ অডিও কোয়ালিটি প্রোডিউস করতে পারে স্ট্যান্ডার্ড 328k বিটরেটে।
SBC ডাইনামিক্যালি কোয়ান্টাইজেশন বিটস এলোকেট করে ফ্রিকোয়েন্সি ব্যান্ডের জন্য, "bottom-to-top" বেসিসে অ্যাক্ট করে। যদি পুরো বিটরেট লোয়ার এবং মিডল ফ্রিকোয়েন্সির জন্য ব্যবহার হয়, তবে আপার ফ্রিকোয়েন্সিগুলো "কাট অফ" হয় (সাইলেন্ট)।
aptX ফ্রিকোয়েন্সি ব্যান্ড কোয়ান্টাইজ করে একই সংখ্যক বিট কনস্ট্যান্টলি, যা এটাকে একটি কনস্ট্যান্ট বিটরেট কোডেক বানায়: 44.1 kHz-এ 352 kbps, 48 kHz-এ 384 kbps। এটি ফ্রিকোয়েন্সি "ট্রান্সফার" করতে পারে না যেগুলো সেখানে বেশি প্রয়োজন। SBC-এর বিপরীতে, aptX ফ্রিকোয়েন্সি "কাট" করবে না, কিন্তু কোয়ান্টাইজেশন নויז যোগ করবে সেগুলোতে, অডিওর ডাইনামিক রেঞ্জ রিডিউস করবে, এবং কখনো কখনো ক্র্যাকলস ইন্ট্রোডিউস করবে। SBC, বিপরীতে, "ডিটেলস খায়" - শান্ত এলাকা ডিসকার্ড করে।
গড়ে, SBC 328k-এর সাথে তুলনা করলে, aptX ওয়াইড ফ্রিকোয়েন্সি রেঞ্জের মিউজিকে কম ডিস্টর্টশন তৈরি করে, কিন্তু ন্যারো ফ্রিকোয়েন্সি রেঞ্জ এবং ওয়াইড ডাইনামিক রেঞ্জের মিউজিকে SBC 328k কখনো কখনো জিতে।
আমরা একটি স্পেশাল কেস বিবেচনা করি, একটি পিয়ানো রেকর্ডিং। এখানে একটি স্পেক্ট্রোগ্রাম:

সবচেয়ে বেশি এনার্জি ০-৪ kHz ফ্রিকোয়েন্সিতে রয়েছে, এবং ১০ kHz পর্যন্ত kéoয়া হয়েছে।
aptX ফাইলের স্পেক্ট্রোগ্রাম দেখতে এরকম:

এখানে SBC 328k:

দেখা যাচ্ছে SBC 328k পিরিয়ডিক্যালি ১৬ kHz-এর উপরের রেঞ্জ সম্পূর্ণ কাট অফ করে, এবং এই ভ্যালুর নিচের রেঞ্জের জন্য সব উপলব্ধ বিটরেট ব্যবহার করে। যাইহোক, aptX মানুষের শ্রবণযোগ্য ফ্রিকোয়েন্সি স্পেকট্রামে আরও ডিস্টর্টশন ইন্ট্রোডিউস করেছে, যা aptX স্পেক্ট্রোগ্রাম থেকে অরিজিনাল স্পেক্ট্রোগ্রাম বিয়োগ করলে দেখা যায় (যত্ন ব্রাইটার, তত্ন ডিস্টর্টশন):

যতক্ষণ SBC 328k ০ থেকে ১০ kHz রেঞ্জে কম ডিস্টর্টশন ইন্ট্রোডিউস করেছে সিগন্যালে, এবং বাকিটি কাট দিয়েছে:

SBC-এর জন্য ৪৮৫k বিটরেট পুরো ফ্রিকোয়েন্সি রেঞ্জ সংরক্ষণ করার জন্য যথেষ্ট, ব্যান্ড কাট অফ ছাড়া।

এই অডিও স্যাম্পলে SBC ৪৮৫k aptX-এর চেয়ে ০-১৫ kHz রেঞ্জে অনেক ভালো, এবং একটু ছোট কিন্তু এখনও লক্ষণীয় পার্থক্য - ১৫-২২ kHz-এ (যত্ন ডার্কার, তত্ন কম ডিস্টর্টশন):

হাই-বিটরেট SBC-এ স্যুইচ করলে, আপনি অধিকাংশ সময় aptX-এর চেয়ে সুপিরিয়র সাউন্ড পাবেন, যেকোনো হেডফোনে।
- original_and_aptx.zip
- sbc.zip
অ্যান্ড্রয়েড ৫ - ৭-এ ব্লুটুথ স্ট্যাক মডিফাই করার পদ্ধতি
এই মডিফিকেশনগুলো স্টক অ্যান্ড্রয়েড ব্লুটুথ স্ট্যাক Bluedroid (Android 5) এবং Fluoride (Android 6-7)-এ প্রয়োগ করা উচিত। Qualcomm-মডিফাইড স্ট্যাক সাপোর্টেড নয়।
স্ট্যান্ডার্ড SBC কনফিগারেশনে Joint Stereo-কে Dual Channel-এ রিপ্লেস করুন
android/platform/external/bluetooth/bluedroid/btif/co/bta_av_co.c:99
Code:
const tA2D_SBC_CIE btif_av_sbc_default_config = { BTIF_AV_SBC_DEFAULT_SAMP_FREQ, /* samp_freq */ A2D_SBC_IE_CH_MD_JOINT, /* ch_mode */ A2D_SBC_IE_BLOCKS_16, /* block_len */ A2D_SBC_IE_SUBBAND_8, /* num_subbands */ A2D_SBC_IE_ALLOC_MD_L, /* alloc_mthd */ BTA_AV_CO_SBC_MAX_BITPOOL, /* max_bitpool */ A2D_SBC_IE_MIN_BITPOOL /* min_bitpool */ };
A2D_SBC_IE_CH_MD_JOINT কে A2D_SBC_IE_CH_MD_DUAL-এ রিপ্লেস করুন।
Dual Channel প্রায়োরিটি বেড়ান
android/platform/external/bluetooth/bluedroid/btif/co/bta_av_co.c:41
Code:
if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_JOINT) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_JOINT; else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_STEREO) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_STEREO; else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_DUAL) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_DUAL; else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_MONO) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_MONO; A2D_SBC_IE_CH_MD_DUAL-সহ if-কে টপে সরান।
- বিটরেট রেস্ট্রিকশন ডিসেবল বা বেড়ান
অ্যান্ড্রয়েড ব্লুটুথ স্ট্যাকের শুধু বিটপুল লিমিট নয়, বরং বিটরেট লিমিটও আছে, 328 kbit/s। যদি হেডফোন সাপোর্ট করে, উদাহরণস্বরূপ, 48 kHz-এ bitpool 53, অ্যান্ড্রয়েড বিটপুল কমিয়ে দেবে 328 kbit/s লিমিটে ফিট করার জন্য। এটি হবে কোডেক নেগোশিয়েশনের পর, এনকোডিং স্টেজে, ব্লুটুথ SetCapabilities প্যাকেটে বিটপুল ভ্যালু নেওয়ার কথা না বিবেচনা করে।
android/platform/external/bluetooth/bluedroid/btif/src/btif_media_task.c:172
Code:
#define DEFAULT_SBC_BITRATE 328
512-এ রিপ্লেস করুন।
- (শুধু এক্সপেরিমেন্টের জন্য) MTU লিমিট ডিসেবল করুন।
এটি প্রয়োজন ~580 kbit/s-এর চেয়ে বেশি বিটরেটের জন্য।
btif/src/btif_media_task.c:174
Code:
/* 2DH5 payload size of 679 bytes - (4 bytes L2CAP Header + 12 bytes AVDTP Header) */ #define MAX_2MBPS_AVDTP_MTU 663
অ্যান্ড্রয়েড 8 - 9-এ ব্লুটুথ স্ট্যাক মডিফাই করার পদ্ধতি
এই মডিফিকেশনগুলো টেস্ট করা হয়নি, কিন্তু কাজ করা উচিত।
A2DP SBC Source-এ Dual Channel সাপোর্ট যোগ করুন
/platform/system/bt/stack/a2dp/a2dp_sbc.cc:55
Code:
/* SBC SRC codec capabilities */ static const tA2DP_SBC_CIE a2dp_sbc_caps = { A2DP_SBC_IE_SAMP_FREQ_44, /* samp_freq */ (A2DP_SBC_IE_CH_MD_MONO | A2DP_SBC_IE_CH_MD_JOINT), /* ch_mode */ (A2DP_SBC_IE_BLOCKS_16 | A2DP_SBC_IE_BLOCKS_12 | A2DP_SBC_IE_BLOCKS_8 | A2DP_SBC_IE_BLOCKS_4), /* block_len */ A2DP_SBC_IE_SUBBAND_8, /* num_subbands */ A2DP_SBC_IE_ALLOC_MD_L, /* alloc_method */ A2DP_SBC_IE_MIN_BITPOOL, /* min_bitpool */ A2DP_SBC_MAX_BITPOOL, /* max_bitpool */ BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16 /* bits_per_sample */ };
ch_mode-এ A2DP_SBC_IE_CH_MD_DUAL যোগ করুন।
ডিফল্ট কনফিগে Joint Stereo-কে Dual Channel-এ রিপ্লেস করুন
/platform/system/bt/stack/a2dp/a2dp_sbc.cc:82
Code:
/* Default SBC codec configuration */ const tA2DP_SBC_CIE a2dp_sbc_default_config = { A2DP_SBC_IE_SAMP_FREQ_44, /* samp_freq */ A2DP_SBC_IE_CH_MD_JOINT, /* ch_mode */ A2DP_SBC_IE_BLOCKS_16, /* block_len */ A2DP_SBC_IE_SUBBAND_8, /* num_subbands */ A2DP_SBC_IE_ALLOC_MD_L, /* alloc_method */ A2DP_SBC_IE_MIN_BITPOOL, /* min_bitpool */ A2DP_SBC_MAX_BITPOOL, /* max_bitpool */ BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16 /* bits_per_sample */ };
A2DP_SBC_IE_CH_MD_JOINT কে A2DP_SBC_IE_CH_MD_DUAL-এ রিপ্লেস করুন।
Dual Channel প্রায়োরিটি বেড়ান
/platform/system/bt/stack/a2dp/a2dp_sbc.cc:1155
Code:
static bool select_best_channel_mode(uint8_t ch_mode, tA2DP_SBC_CIE* p_result, btav_a2dp_codec_config_t* p_codec_config) { if (ch_mode & A2DP_SBC_IE_CH_MD_JOINT) { p_result->ch_mode = A2DP_SBC_IE_CH_MD_JOINT; p_codec_config->channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO; return true; } if (ch_mode & A2DP_SBC_IE_CH_MD_STEREO) { p_result->ch_mode = A2DP_SBC_IE_CH_MD_STEREO; p_codec_config->channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO; return true; } if (ch_mode & A2DP_SBC_IE_CH_MD_DUAL) { p_result->ch_mode = A2DP_SBC_IE_CH_MD_DUAL; p_codec_config->channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO; return true; } if (ch_mode & A2DP_SBC_IE_CH_MD_MONO) { p_result->ch_mode = A2DP_SBC_IE_CH_MD_MONO; p_codec_config->channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_MONO; return true; } return false; }
A2DP_SBC_IE_CH_MD_DUAL-সহ if-কে টপে সরান।
বিটরেট লিমিট বেড়ান
/platform/system/bt/stack/a2dp/a2dp_sbc_encoder.cc:42
Code:
#define A2DP_SBC_DEFAULT_BITRATE 328
512-এ রিপ্লেস করুন।
- (শুধু এক্সপেরিমেন্টের জন্য) MTU লিমিট ডিসেবল করুন
এটি প্রয়োজন ~580 kbit/s-এর চেয়ে বেশি বিটরেটের জন্য।
/platform/system/bt/stack/a2dp/a2dp_sbc_encoder.cc:47
Code:
#define MAX_2MBPS_AVDTP_MTU 663