ব্লুটুথ LE ব্যবহার করে হিয়ারিং এইডে অডিও সাপোর্ট

ব্লুটুথ লো এনার্জি (BLE)-এর মাধ্যমে কানেকশন-ওরিয়েন্টেড L2CAP চ্যানেল (CoC) ব্যবহার করে হিয়ারিং এড (HA) ডিভাইস Android-চালিত মোবাইল ডিভাইসে উন্নত অ্যাক্সেসিবিলিটি পেতে পারে। CoC, অডিওর অবিচ্ছিন্ন প্রবাহ বজায় রাখতে, এমনকি প্যাকেট লস হলেও, একাধিক অডিও প্যাকেটের ইলাস্টিক বাফার ব্যবহার করে। এই বাফার লেটেন্সি কমানোর বিনিময়ে হিয়ারিং এড ডিভাইসের জন্য অডিও কোয়ালিটি প্রদান করে।

CoC-এর ডিজাইন ব্লুটুথ (BT) কোর স্পেসিফিকেশন ভার্সন ৬.০-এর রেফারেন্স দেয়। মূল স্পেসিফিকেশন মেনে চলতে, এই পৃষ্ঠার সব মাল্টি-বাইট ভ্যালু অবশ্যই লিটল-এন্ডিয়ান হিসেবে পড়তে হবে।

পরিভাষা

কেন্দ্রীয়
Android ডিভাইস যা ব্লুটুথের মাধ্যমে বিজ্ঞাপন স্ক্যান করে।
পেরিফেরাল
ব্লুটুথের মাধ্যমে বিজ্ঞাপন প্যাকেট পাঠানো হিয়ারিং এইড।

নেটওয়ার্ক টোপোলজি ও সিস্টেম আর্কিটেকচার

শ্রবণ সহায়ক ডিভাইসের জন্য CoC ব্যবহার করার সময়, নেটওয়ার্ক টপোলজি একটি সেন্ট্রাল ও দুটি পেরিফেরাল ধরে নেয়, একটি বাঁদিকে ও একটি ডানদিকে, যেমন ১ নম্বর ছবিতে দেখানো হয়েছে। ব্লুটুথ অডিও সিস্টেম বাঁদিক ও ডানদিকের পেরিফেরালকে একটি অডিও সিঙ্ক হিসেবে দেখে। কোনও পেরিফেরাল মোনাউরাল ফিট বা কানেকশন হারানোর কারণে না থাকলে, তাহলে সেন্ট্রাল বাঁদিক ও ডানদিকের অডিও চ্যানেল মিক্স করে এবং বাকি পেরিফেরালে অডিও ট্রান্সমিট করে। সেন্ট্রাল যদি দুটি পেরিফেরালের সাথে কানেকশন হারিয়ে ফেলে, তাহলে সেন্ট্রাল অডিও সিঙ্কের সাথে কানেকশন হারিয়ে গেছে বলে ধরে নেয়। সেইসব ক্ষেত্রে, সেন্ট্রাল রুট অডিওকে অন্য আউটপুটে পাঠায়।

ডায়াগ্রামে দেখানো হয়েছে যে একটি কেন্দ্রীয় Android ডিভাইস দুটি
          পেরিফেরাল হিয়ারিং এডের সাথে ব্লুটুথ LE-এর মাধ্যমে কানেক্ট করা আছে, একটি বাঁদিকের এবং একটি ডানদিকের।
ছবি ১. BLE-এর মাধ্যমে CoC ব্যবহার করে Android মোবাইল ডিভাইসের সাথে হিয়ারিং এড পেয়ার করার টপোলজি।

সেন্ট্রাল যখন পেরিফেরালে অডিও ডেটা স্ট্রিম করছে না এবং BLE কানেকশন মেনে চলতে পারছে, তখন সেন্ট্রালকে পেরিফেরাল থেকে ডিসকানেক্ট করা উচিত নয়। কানেকশন বজায় রাখলে পেরিফেরালে থাকা GATT সার্ভারের সাথে ডেটা কমিউনিকেশন করা যায়।

হিয়ারিং ডিভাইস পেয়ার ও কানেক্ট করার সময় সেন্ট্রালকে এগুলি অবশ্যই করতে হবে:

  • পেয়ার করা সাম্প্রতিক বাঁদিকের ও ডানদিকের পেরিফেরাল ট্র্যাক করুন।
  • বৈধ পেয়ারিং থাকলে ধরে নিতে হবে যে পেরিফেরাল ব্যবহার করা হচ্ছে। কানেকশন বিচ্ছিন্ন হয়ে গেলে, সেন্ট্রালকে অবশ্যই পেয়ার করা ডিভাইসের সাথে কানেক্ট বা আবার কানেক্ট করার চেষ্টা করতে হবে।
  • পেয়ারিং মুছে দেওয়া হলে ধরে নিতে হবে যে পেরিফেরাল আর ব্যবহার করা হচ্ছে না।

উপরের ক্ষেত্রে, পেয়ারিং বলতে, OS-এ প্রদত্ত UUID এবং বাম/ডান ডেজিগনেটর সহ এক সেট হিয়ারিং এড রেজিস্টার করার অ্যাকশনকে বোঝায়, ব্লুটুথ পেয়ারিং প্রসেসকে নয়।

সিস্টেমের প্রয়োজনীয়তা

ব্যবহারকারীর ভালো অভিজ্ঞতার জন্য CoC সঠিকভাবে প্রয়োগ করতে, সেন্ট্রাল ও পেরিফেরাল ডিভাইসের ব্লুটুথ সিস্টেমকে অবশ্যই নিম্নলিখিত কাজগুলি করতে হবে:

  • মানানসই BT 4.2 বা তার পরের যেকোনও ভার্সনের কন্ট্রোলার প্রয়োগ করুন। আমরা LE সুরক্ষিত কানেকশন ব্যবহার করার জন্য বিশেষভাবে সাজেস্ট করি।
  • অডিও প্যাকেট ফর্ম্যাট ও টাইমিং-এ বর্ণিত প্যারামিটার সহ সেন্ট্রালে অন্তত দুটি যুগপৎ LE লিঙ্ক কাজ করে।
  • অডিও প্যাকেট ফর্ম্যাট ও টাইমিং-এ বর্ণিত প্যারামিটার সহ পেরিফেরালে অন্তত একটি LE লিঙ্ক কাজ করে।
  • LE ক্রেডিট ভিত্তিক ফ্লো কন্ট্রোল [BT Vol 3, Part A, Sec 10.1] কাজ করে। ডিভাইসগুলিকে অবশ্যই CoC-তে অন্তত ১৬৭ বাইট MTU এবং MPS সাইজ সাপোর্ট করতে হবে এবং আটটি প্যাকেট পর্যন্ত বাফার করতে হবে।
  • অন্তত ১৬৭ বাইট পে-লোড সহ LE ডেটা লেন্থ এক্সটেনশন [BT Vol 6, Part B, Sec 5.1.9] সাপোর্ট করে।
  • নিশ্চিত করুন যে সেন্ট্রাল ডিভাইস HCI LE কানেকশন আপডেট কমান্ড সাপোর্ট করে এবং নন-জিরো maximum_CE_Length ও minimum_CE_Length প্যারামিটার মেনে চলে।
  • দুটি LE CoC কানেকশনের জন্য সেন্ট্রালে ডেটা থ্রুপুট বজায় রাখুন। এর জন্য দুটি আলাদা পেরিফেরাল কানেকশন ইন্টারভ্যাল ও পে-লোড সাইজ অডিও প্যাকেট ফর্ম্যাট ও টাইমিং ব্যবহার করুন।
  • এইসব স্পেসিফিকেশনের জন্য প্রয়োজনীয় সবচেয়ে ছোট ভ্যালু হিসেবে পেরিফেরালের LL_LENGTH_REQ বা LL_LENGTH_RSP ফ্রেমে MaxRxOctets এবং MaxRxTime প্যারামিটার সেট করুন। এর ফলে, ফ্রেম পাওয়ার জন্য প্রয়োজনীয় সময় গণনা করার সময় সেন্ট্রাল নিজের টাইম শিডিউলারকে অপ্টিমাইজ করতে পারে।

আমরা বিশেষভাবে সাজেস্ট করি যে BT 5.0 স্পেসিফিকেশনে উল্লিখিত অনুযায়ী সেন্ট্রাল ও পেরিফেরাল যেন 2M PHY কাজ করে। সেন্ট্রালকে অবশ্যই 1M এবং 2M PHY-তে অন্তত 64 kbit/s-এর অডিও লিঙ্ক সাপোর্ট করতে হবে। BLE লং রেঞ্জ PHY ব্যবহার করা যাবে না।

CoC, লিঙ্ক লেয়ার এনক্রিপশন ও ফ্রিকোয়েন্সি হপিংয়ের জন্য স্ট্যান্ডার্ড ব্লুটুথ মেকানিজম ব্যবহার করে।

ASHA GATT পরিষেবা

পেরিফেরালকে অবশ্যই নিচে বর্ণিত হিয়ারিং এডের জন্য অডিও স্ট্রিমিং (ASHA) GATT সার্ভার পরিষেবা প্রয়োগ করতে হবে। পেরিফেরালকে অবশ্যই সাধারণভাবে ডিসকভারেবল মোডে থাকাকালীন এই পরিষেবার বিজ্ঞাপন দিতে হবে, যাতে সেন্ট্রাল একটি অডিও সিঙ্ক শনাক্ত করতে পারে। যেকোনও LE অডিও স্ট্রিমিং অপারেশন অবশ্যই এনক্রিপশন প্রয়োজন। BLE অডিও স্ট্রিমিংয়ে নিম্নলিখিত বৈশিষ্ট্য থাকে:

বৈশিষ্ট্য প্রপার্টি বর্ণনা
ReadOnlyProperties পড়ুন ReadOnlyProperties দেখুন।
AudioControlPoint উত্তর না পাওয়া পর্যন্ত লিখে যাওয়া অডিও স্ট্রিমের জন্য কন্ট্রোল পয়েন্ট। AudioControlPoint দেখুন।
AudioStatusPoint পড়ো/বিজ্ঞপ্তি পাঠাও অডিও কন্ট্রোল পয়েন্টের জন্য স্ট্যাটাস রিপোর্ট ফিল্ড। AudioStatusPoint দেখুন।
Volume উত্তর না দিয়েই লেখা -১২৮ থেকে ০-এর মধ্যে বাইট, যা স্ট্রিম করা অডিও সিগন্যালে প্রয়োগ করার জন্য অ্যাটেনুয়েশনের পরিমাণ নির্দেশ করে, যার রেঞ্জ -৪৮ dB থেকে ০ dB পর্যন্ত। সেটিং -128-কে সম্পূর্ণ মিউট করা হিসেবে ধরে নিতে হবে, অর্থাৎ, মিউট না করা সর্বনিম্ন ভলিউম লেভেল হল -127 যা -47.625 dB অ্যাটেন্যুয়েশনের সমান। সেটিং ০-এ, স্ট্রিম করা রেল-টু-রেল সাইন টোনকে অবশ্যই হিয়ারিং ইন্সট্রুমেন্টে ১০০ dBSPL ইনপুট সমতুল্য হতে হবে। সেন্ট্রালকে অবশ্যই স্বাভাবিক সম্পূর্ণ স্কেলে স্ট্রিম করতে হবে এবং পেরিফেরালের কাঙ্ক্ষিত প্রেজেন্টেশন লেভেল সেট করতে এই ভেরিয়েবল ব্যবহার করতে হবে।
LE_PSM_OUT পড়ুন অডিও চ্যানেল কানেক্ট করার জন্য PSM ব্যবহার করতে হবে। ডায়নামিক রেঞ্জ [BT Vol 3, Part A, Sec 4.22] থেকে বেছে নিতে হবে।

নিচের সারণীতে পরিষেবায় অ্যাসাইন করা UUID এবং সেগুলির বৈশিষ্ট্য বর্ণনা করা আছে।

পরিষেবা UUID: {0xFDF0}

বৈশিষ্ট্য UUID
ReadOnlyProperties {6333651e-c481-4a3e-9169-7c902aad37bb}
AudioControlPoint {f0d4de7e-4a88-476c-9d9f-1937b0996cc0}
AudioStatus {38663f1a-e711-4cac-b641-326b56404837}
Volume {00e4ca9e-ab14-41e4-8823-f9e70c7e91df}
LE_PSM_OUT {2d410339-82b6-42aa-b34e-e2e01df8cc1a}

ASHA GATT পরিষেবা ছাড়াও, পেরিফেরালকে অবশ্যই ডিভাইস সংক্রান্ত তথ্য পরিষেবা প্রয়োগ করতে হবে যাতে সেন্ট্রাল পেরিফেরালের প্রস্তুতকারীর নাম ও ডিভাইসের নাম শনাক্ত করতে পারে।

ReadOnlyProperties

ReadOnlyProperties-এর নিম্নলিখিত মান আছে:

বাইট বর্ণনা
0 ভার্সন - 0x01 হতে হবে
1 DeviceCapabilities দেখুন।
2-9 HiSyncId দেখুন।
10 FeatureMap দেখুন।
11-12 RenderDelay। পেরিফেরাল অডিও ফ্রেম পাওয়ার পর থেকে পেরিফেরাল আউটপুট রেন্ডার করা পর্যন্ত সময়, মিলিসেকেন্ডে। এইসব বাইট ব্যবহার করে ভিডিও ডিলে করা যায় যাতে অডিওর সাথে সিঙ্ক করা যায়।
13-14 ভবিষ্যতে ব্যবহারের জন্য সংরক্ষিত। শূন্যে ইনিশিয়ালাইজ করুন।
15-16 কাজ করে এমন কোডেক আইডি। এটি হল কাজ করে এমন কোডেক আইডির বিটমাস্ক । বিট লোকেশনে ১ থাকলে তা কাজ করে এমন কোডেককে বোঝায়। যেমন, 0x0002-এর অর্থ হল ১৬ kHz-এ G.722 কাজ করে। অন্যান্য সব বিট ০ হিসেবে সেট করতে হবে।

DeviceCapabilities

বিট বর্ণনা
0 ডিভাইসের দিক (০: বাঁদিক, ১: ডানদিক)
1 ডিভাইসটি স্ট্যান্ডঅ্যালোন এবং মনো ডেটা গ্রহণ করে নাকি ডিভাইসটি কোনও সেটের অংশ (০: মনোরাল, ১: বাইনরাল) তা নির্দেশ করে
2 ডিভাইসে CSIS কাজ করে (0: কাজ করে না, 1: কাজ করে)
3-7 রিজার্ভ করা (০ হিসেবে সেট করা)

HiSyncId

এই ফিল্ডটি সব বাইনরাল ডিভাইসের জন্য অনন্য হতে হবে, তবে এটি বাম এবং ডান সেটের জন্য একই হতে হবে।

বাইট বর্ণনা
0-1 প্রস্তুতকারকের আইডি। এটি হল BTSIG-এর অ্যাসাইন করা কোম্পানির আইডেন্টিফায়ার।
2-7 হিয়ারিং এইড সেট শনাক্তকারী অনন্য আইডি। এই আইডিটি অবশ্যই বাঁ ও ডানদিকের পেরিফেরাল, দুটিতেই একই সেট করতে হবে।

FeatureMap

বিট বর্ণনা
0 LE CoC অডিও আউটপুট স্ট্রিমিং কাজ করে (হ্যাঁ/না)।
1-7 রিজার্ভ করা (০ হিসেবে সেট করা)।

কোডেক আইডি

বিট সেট করা থাকলে, সেই নির্দিষ্ট কোডেক কাজ করে।

আইডি / বিট নম্বর কোডেক ও স্যাম্পেল রেট প্রয়োজনীয় বিটরেট ফ্রেম টাইম সেন্ট্রাল (C) বা পেরিফেরাল (P) হিসেবে বাধ্যতামূলক
0 রিজার্ভ করা হয়েছে রিজার্ভ করা হয়েছে রিজার্ভ করা হয়েছে রিজার্ভ করা হয়েছে
1 G.722 @ ১৬ kHz ৬৪ kbit/s ভেরিয়েবেল C এবং P
২-১৫ নম্বর রিজার্ভ করা আছে।

AudioControlPoint

LE CoC বন্ধ থাকলে এই কন্ট্রোল পয়েন্ট ব্যবহার করা যাবে না। পদ্ধতির বিবরণের জন্য অডিও স্ট্রিম শুরু ও বন্ধ করুন দেখুন।

Opcode আর্গুমেন্ট GATT উপ-পদ্ধতি বর্ণনা
১ «Start»
  • uint8_t codec
  • uint8_t audiotype
  • int8_t volume
  • int8_t otherstate
উত্তর সহ লিখুন এবং AudioStatusPoint বৈশিষ্ট্য ব্যবহার করে অতিরিক্ত স্ট্যাটাস বিজ্ঞপ্তি আশা করুন। কোডেক রিসেট করতে এবং ফ্রেম ০-এর প্লেব্যাক শুরু করতে পেরিফেরালকে নির্দেশ দেয়। এই প্লেব্যাকের জন্য কোন কোডেক আইডি ব্যবহার করতে হবে তা codec ফিল্ডে উল্লেখ করা থাকে। যেমন, ১৬ kHz-এ G.722-এর জন্য codec ফিল্ড হল `১`।

স্ট্রিমের মধ্যে উপস্থিত অডিওর ধরন, অডিওর ধরন বিট ফিল্ডের মাধ্যমে বোঝা যায়:
  • ০ - অজানা
  • ১ - রিংটোন
  • ২ - ফোনকল
  • ৩ - মিডিয়া
otherstate ফিল্ড থেকে বোঝা যায় যে বাইনরাল ডিভাইসের অন্য দিকটি কানেক্ট করা আছে কিনা। অন্য পেরিফেরাল ডিভাইস কানেক্ট করা থাকলে ফিল্ড ভ্যালু ১ হয়, অন্যথায় ভ্যালু ০ হয়।

«Stop» ওপকোড পাওয়ার আগে পেরিফেরালকে কানেকশন আপডেট করার অনুরোধ করলে চলবে না।
২ «Stop» কোনওটিই নয় উত্তর সহ লিখুন এবং AudioStatusPoint বৈশিষ্ট্য ব্যবহার করে অতিরিক্ত স্ট্যাটাস বিজ্ঞপ্তি আশা করুন। পেরিফেরালকে অডিও রেন্ডার করা বন্ধ করার নির্দেশ দেয়। আবার অডিও রেন্ডার করার জন্য, এই স্টপ অর্ডারের পরে অবশ্যই একটি নতুন অডিও সেট-আপ সিকোয়েন্স শুরু করতে হবে।
৩ «Status»
  • uint8_t connected
উত্তর না দিয়েই লেখা কানেক্ট করা পেরিফেরালকে জানায় যে অন্য পেরিফেরালের স্ট্যাটাস আপডেট হয়েছে। connected ফিল্ড থেকে আপডেটের ধরন বোঝা যায়:
  • 0 - Other peripheral disconnected
  • ১ - অন্যান্য পেরিফেরাল কানেক্ট করা আছে
  • ২ - যেকোনও কানেকশনে LE কানেকশন প্যারামিটার আপডেট হয়েছে

AudioStatusPoint

অডিও কন্ট্রোল পয়েন্টের জন্য স্ট্যাটাস রিপোর্ট ফিল্ড

অপকোড বর্ণনা
0 স্ট্যাটাস ঠিক আছে
-1 অজানা কমান্ড
-2 বেআইনি প্যারামিটার

ASHA GATT পরিষেবার বিজ্ঞাপন

পরিষেবা UUID অবশ্যই বিজ্ঞাপন প্যাকেটে থাকতে হবে। বিজ্ঞাপন বা স্ক্যান রেসপন্স ফ্রেমে, পেরিফেরাল ডিভাইসে অবশ্যই একটি পরিষেবা ডেটা ধরন থাকতে হবে:

বাইট অফসেট নাম বর্ণনা
0 বিজ্ঞাপনের দৈর্ঘ্য >= 0x09
1 বিজ্ঞাপনের ধরন 0x16 (পরিষেবা ডেটা - ১৬-বিট UUID)
2-3 পরিষেবা UUID 0xFDF0 (little-endian)

মনে রাখবেন: এটি একটি অস্থায়ী আইডি।
4 প্রোটোকল ভার্সন 0x01
5 ক্ষমতা
  • ০ - বাঁ (০) বা ডান (১) দিক
  • ১ - একটি (০) বা দুটি (১) ডিভাইস।
  • ২ - ডিভাইসে CSIS কাজ করে কিনা (<0: কাজ করে না, 1: কাজ করে)
  • ৩-৭ - সংরক্ষিত। এই বিটগুলি শূন্য হতে হবে।
6-9 HiSyncId ট্রাঙ্কেট করা হয়েছে HiSyncId-এর চারটি সবচেয়ে গুরুত্বপূর্ণ বাইট। এইসব বাইটকে অবশ্যই আইডির সবচেয়ে র‍্যান্ডম অংশ হতে হবে।

পেরিফেরাল ডিভাইসে অবশ্যই সম্পূর্ণ লোকাল নাম ডেটা টাইপ থাকতে হবে যা হিয়ারিং এইডের নাম নির্দেশ করে। এই নামটি মোবাইল ডিভাইসের ইউজার ইন্টারফেসে ব্যবহার করা হয় যাতে ব্যবহারকারী সঠিক ডিভাইস বেছে নিতে পারেন। নামে যেন বাঁদিক বা ডানদিকের চ্যানেলের উল্লেখ না থাকে, কারণ এই তথ্য DeviceCapabilities-এ দেওয়া আছে।

পেরিফেরাল যদি একই ফ্রেমের ধরনে (ADV বা SCAN RESP) নাম ও ASHA পরিষেবা ডেটার ধরন রাখে, তাহলে দুটি ডেটার ধরন ("সম্পূর্ণ স্থানীয় নাম" ও "ASHA পরিষেবার জন্য পরিষেবা ডেটা") অবশ্যই একই ফ্রেমে দেখাতে হবে। এর ফলে মোবাইল ডিভাইস স্ক্যানার একই স্ক্যান ফলাফলে দুটি ডেটাই পায়।

প্রাথমিক পেয়ারিংয়ের সময়, পেরিফেরালকে এমন একটি রেটে বিজ্ঞাপন দিতে হবে যা মোবাইল ডিভাইসকে দ্রুত পেরিফেরাল খুঁজে পেতে এবং সেটির সাথে কানেক্ট করতে দেয়।

বাঁদিক ও ডানদিকের পেরিফেরাল ডিভাইস সিঙ্ক্রোনাইজ করা

Android মোবাইল ডিভাইসে ব্লুটুথের সাথে কাজ করার জন্য, পেরিফেরাল ডিভাইস সিঙ্ক্রোনাইজ করা হয়েছে কিনা তা নিশ্চিত করার দায়িত্ব নেয়। বাঁদিক ও ডানদিকের পেরিফেরাল ডিভাইসে প্লেব্যাক সময়মতো সিঙ্ক করতে হবে। দুটি পেরিফেরাল ডিভাইসকেই একই সাথে সোর্স থেকে অডিও স্যাম্পেল প্লেব্যাক করতে হবে।

পেরিফেরাল ডিভাইস, অডিও পেলোডের প্রতিটি প্যাকেটের আগে যোগ করা একটি সিকোয়েন্স নম্বর ব্যবহার করে তাদের সময় সিঙ্ক্রোনাইজ করতে পারে। সেন্ট্রাল নিশ্চিত করে যে প্রতিটি পেরিফেরালে একই সময়ে চালানোর জন্য অডিও প্যাকেটের একই ক্রমিক সংখ্যা আছে। প্রতিটি অডিও প্যাকেটের পরে ক্রমিক সংখ্যা এক করে বৃদ্ধি পায়। প্রতিটি সিকোয়েন্স নম্বর ৮-বিট দীর্ঘ হয়, তাই ২৫৬টি অডিও প্যাকেটের পরে সিকোয়েন্স নম্বরগুলি আবার রিপিট হয়। প্রতিটি কানেকশনের জন্য প্রতিটি অডিও প্যাকেট সাইজ এবং স্যাম্পেল রেট নির্দিষ্ট হওয়ায়, দুটি পেরিফেরাল আপেক্ষিক বাজানোর সময় অনুমান করতে পারে। অডিও প্যাকেট সম্পর্কে আরও তথ্যের জন্য, অডিও প্যাকেট ফর্ম্যাট এবং টাইমিং দেখুন।

সিঙ্ক্রোনাইজেশন করার প্রয়োজন হলে, সেন্ট্রাল বাইনরাল ডিভাইসে ট্রিগার প্রদান করে সাহায্য করে। এইসব ট্রিগার প্রতিটি পেরিফেরালকে তার পেয়ার করা পেরিফেরাল ডিভাইসের স্ট্যাটাস সম্পর্কে জানায়, যখনই এমন কোনও অপারেশন হয় যা সিঙ্ক্রোনাইজেশনকে প্রভাবিত করতে পারে। ট্রিগারগুলি হল:

  • AudioControlPoint-এর «Start» কমান্ডের অংশ হিসেবে, বাইনোরাল ডিভাইসের অপর প্রান্তের বর্তমান কানেকশন স্ট্যাটাস দেওয়া হয়।
  • যখনই কোনও পেরিফেরাল ডিভাইসে কানেকশন, ডিসকানেকশন বা কানেকশন প্যারামিটার আপডেট অপারেশন হয়, তখন AudioControlPoint-এর «Status» কমান্ড বাইনরাল ডিভাইসের অন্য প্রান্তে পাঠানো হয়।

অডিও প্যাকেট ফর্ম্যাট ও টাইমিং

প্যাকেটে অডিও ফ্রেম (স্যাম্পেলের ব্লক) প্যাক করলে, হিয়ারিং ইনস্ট্রুমেন্ট লিঙ্ক লেয়ার টাইমিং অ্যাঙ্কর থেকে টাইমিং পেতে পারে। ইমপ্লিমেন্টেশন সহজ করতে:

  • অডিও ফ্রেম সবসময় কানেকশন ইন্টারভালের সাথে মিলতে হবে। যেমন, কানেকশন ইন্টারভাল ২০ মি.সে. এবং স্যাম্পেল রেট ১৬ kHz হলে, অডিও ফ্রেমে অবশ্যই ৩২০টি স্যাম্পেল থাকতে হবে।
  • সিস্টেমে স্যাম্পেল রেট ৮ kHz-এর মাল্টিপল হতে হবে, যাতে ফ্রেমের সময় বা কানেকশন ইন্টারভ্যাল যাই হোক না কেন, ফ্রেমের মধ্যে সবসময় পূর্ণ সংখ্যায় স্যাম্পেল থাকে।
  • অডিও ফ্রেমের আগে একটি সিকোয়েন্স বাইট থাকতে হবে। ক্রমিক বাইট অবশ্যই র‍্যাপ-অ্যারাউন্ডের সাথে গণনা করতে হবে এবং পেরিফেরালকে বাফার মিসম্যাচ বা আন্ডারফ্লো শনাক্ত করতে দিতে হবে।
  • একটি অডিও ফ্রেমকে সবসময় একটি LE প্যাকেটের মধ্যে ফিট করতে হবে। অডিও ফ্রেম আলাদা L2CAP প্যাকেট হিসেবে পাঠাতে হবে। LE LL PDU-এর সাইজ অবশ্যই:
    অডিও পেলোড সাইজ + ১ (সিকোয়েন্স কাউন্টার) + ৬ (L2CAP হেডার জন্য ৪, SDU-এর জন্য ২) হতে হবে
  • কানেকশন ইভেন্ট সবসময় যথেষ্ট বড় হতে হবে যাতে দুটি অডিও প্যাকেট এবং ACK-এর জন্য দুটি খালি প্যাকেট থাকতে পারে। এর ফলে রিট্রান্সমিশনের জন্য ব্যান্ডউইথ রিজার্ভ করা যায়। মনে রাখবেন যে অডিও প্যাকেট সেন্ট্রালের ব্লুটুথ কন্ট্রোলারের মাধ্যমে ফ্র্যাগমেন্ট করা হতে পারে। পেরিফেরালকে প্রতিটি কানেকশন ইভেন্টে দুটির বেশি ফ্র্যাগমেন্ট করা অডিও প্যাকেট গ্রহণ করতে পারতে হবে।

সেন্ট্রালকে কিছু নমনীয়তা দিতে, G.722 প্যাকেট দৈর্ঘ্য নির্দিষ্ট করা নেই। সেন্ট্রাল যে কানেকশন ইন্টারভ্যাল সেট করে তার উপর ভিত্তি করে G.722 প্যাকেট দৈর্ঘ্য পরিবর্তন হতে পারে।

G.722 আউটপুট অক্টেট ফর্ম্যাট Rec. ITU-T G.722 (09/2012) বিভাগ ১.৪.৪ "মাল্টিপ্লেক্সার"-কে রেফারেন্স করে।

পেরিফেরাল কাজ করে এমন সব কোডেকের জন্য, পেরিফেরালকে অবশ্যই নিচে উল্লেখ করা কানেকশন প্যারামিটার কাজ করাতে হবে। এটি কনফিগারেশনের একটি আংশিক তালিকা যা সেন্ট্রাল প্রয়োগ করতে পারে।

কোডেক বিট রেট কানেকশন ইন্টারভ্যাল CE দৈর্ঘ্য (1M/2M PHY) অডিও পেলোড সাইজ
G.722 @ ১৬ kHz ৬৪ kbit/s ২০ ms 5000/3750 us ১৬০ বাইট

অডিও স্ট্রিম শুরু ও বন্ধ করা

অডিও স্ট্রিম শুরু করার আগে, সেন্ট্রাল পেরিফেরালকে কোয়েরি করে এবং একটি সাধারণ ডিনোমিনেটর কোডেক সেট করে। তারপরে স্ট্রিম সেট-আপ নিম্নলিখিত ক্রম অনুযায়ী এগিয়ে যায়:

  1. PSM এবং ঐচ্ছিকভাবে, RenderDelay পড়া হয়। এইসব ভ্যালু সেন্ট্রাল ক্যাশে সেভ করে রাখতে পারে।
  2. CoC L2CAP চ্যানেল খোলা হয়েছে – পেরিফেরালকে প্রাথমিকভাবে আটটি ক্রেডিট অনুমোদন করতে হবে।
  3. বেছে নেওয়া কোডেকের জন্য প্রয়োজনীয় প্যারামিটার লিঙ্ক করার জন্য কানেকশন আপডেট ইস্যু করা হয়। কেন্দ্রীয় ডিভাইস আগের ধাপে CoC কানেকশনের আগে এই কানেকশন আপডেট করতে পারে।
  4. সেন্ট্রাল ও পেরিফেরাল হোস্ট, দু'টিই আপডেট সম্পূর্ণ হওয়ার ইভেন্টের জন্য অপেক্ষা করে।
  5. অডিও এনকোডার রিস্টার্ট করুন এবং প্যাকেট সিকোয়েন্স কাউন্ট রিসেট করে ০ করুন। AudioControlPoint-এ প্রাসঙ্গিক প্যারামিটার সহ একটি «Start» কমান্ড ইস্যু করা হয়েছে। স্ট্রিমিং করার আগে, সেন্ট্রাল, পেরিফেরাল থেকে আগের «Start» কমান্ডের স্ট্যাটাস সংক্রান্ত বিজ্ঞপ্তি সফল হওয়ার জন্য অপেক্ষা করে। এই অপেক্ষার ফলে পেরিফেরাল তার অডিও প্লেব্যাক পাইপলাইন প্রস্তুত করার সময় পায়। অডিও স্ট্রিমিংয়ের সময়, বর্তমান রেপ্লিকা লেটেন্সি শূন্য না হলেও, প্রতিটি কানেকশন ইভেন্টে রেপ্লিকা উপলভ্য থাকতে হবে।
  6. পেরিফেরাল তার ইন্টার্নাল কিউ থেকে প্রথম অডিও প্যাকেট নেয় (সিকুয়েন্স নম্বর 0) এবং এটি চালায়।

সেন্ট্রাল, অডিও স্ট্রিম বন্ধ করার জন্য «বন্ধ করো» কমান্ড দেয়। এই কমান্ডের পরে, প্রতিটি কানেকশন ইভেন্টে পেরিফেরাল উপলভ্য থাকার প্রয়োজন নেই। অডিও স্ট্রিমিং আবার চালু করতে, উপরে দেওয়া ক্রম অনুযায়ী ধাপ ৫ থেকে শুরু করে ধাপগুলি অনুসরণ করুন। সেন্ট্রাল অডিও স্ট্রিম না করলেও, GATT পরিষেবার জন্য LE কানেকশন বজায় রাখতে হবে।

পেরিফেরালকে অবশ্যই সেন্ট্রালে কানেকশন আপডেট ইস্যু করলে চলবে না। পাওয়ার বাঁচাতে, সেন্ট্রাল ডিভাইসটি অডিও স্ট্রিম না করার সময় পেরিফেরাল ডিভাইসে কানেকশন আপডেট ইস্যু করতে পারে।