इस कॉन्टेंट में, ज़्यादा अपटाइम रेंडरर (एचएआर) में घंटी बजने की सुविधा के बारे में बताया गया है.
एक Audio क्रेट, एचएआर ऐप्लिकेशन के लिए AudioManager को दिखाता है. यह घंटी बजने की सुविधा को कंट्रोल करता है.
इंतज़ार का समय कम रखने के लिए, प्लेबैक थ्रेड, ऐप्लिकेशन के लाइफ़साइकल के दौरान चलते रहते हैं. जब कोई ऑडियो नहीं चलता, तो वे आइडल हो जाते हैं और यिल्ड करते हैं.
शब्दावली
- ऐसेट
AudioAsset, चलाए जा सकने वाले ऑडियो से जुड़ा होता है. ऐसेट को आम तौर पर जाना जाता है और ये ऐप्लिकेशन रनटाइम में मौजूद होते हैं.- डिवाइस
AudioDeviceका मतलब, ऑडियो चलाने के लिए अलग बस से है. डिवाइस, हार्डवेयर से जुड़ी सबसे छोटी यूनिट है. इसे सिस्टम ऐक्सेस करता है. स्टैंडर्ड एसडीवीएम सेटअप में,AudioDeviceका मतलब, एडवांस्ड लिनक्स साउंड आर्किटेक्चर (एएलएसए) पीसीएम से है.- स्ट्रीम
- किसी डिवाइस पर, ऐसेट के प्लेबैक का इंस्टेंस. स्ट्रीम, शेड्यूल किए जाने से लेकर पूरी होने, रद्द होने या गड़बड़ी की वजह से खत्म होने तक बनी रहती हैं.
घटक
पहली इमेज में, घंटी बजने की सुविधा के लिए कॉम्पोनेंट डायग्राम दिखाया गया है:
पहली इमेज. कॉम्पोनेंट डायग्राम.
ऑडियो डिवाइस और पीसीएम
ऑडियो हार्डवेयर कॉन्फ़िगरेशन, स्टैंडर्ड एचएआर प्लैटफ़ॉर्म ऐब्स्ट्रैक्शन लेयर डिज़ाइन के मुताबिक होता है. साथ ही, यह har-platform-api में शामिल होता है.
एचएआर Audio क्रेट, AudioDevice के लिए एक नया स्ट्रक्चर तय करता है. यह उन सभी डेटा स्ट्रक्चर के लिए फ़ील्ड तय करता है जो इंटरनल एचएआर Audio क्रेट
और प्लेबैक पर असर डालते हैं. AudioDevice , प्लैटफ़ॉर्म के हिसाब से संभावित अतिरिक्त पैरामीटर को रैप करने के लिए, जेनेरिक का भी इस्तेमाल करता है. tinyalsa के मामले में, PlatformAudioDevice में एएलएसए पीसीएम के डिस्क्रिप्टर और प्रॉपर्टी शामिल होती हैं.
/// NOTE: The following code is a sample definition to help understanding, it is not a
/// representation of the final code/implementation.
AudioDevice<PlatformAudioDevice> {
/// Internal HAR Identifier for the device.
AudioDeviceID,
/// The size (in bytes) for chunks of audio data to stream to the device.
ChunkSize,
/// Properties necessary to control volume (details in "Mixer control" section).
VolumeControl,
/// Properties necessary to control spatialization (details in "Mixer control"
/// section).
SpatialControl,
/// Platform specific data for the AudioDevice.
/// E.g. ALSA properties and reference to opened PCM.
PlatformAudioDevice
}
/// Elaboration of the previously mentioned VolumeControl
VolumeControl {
/// Identifier for the control used to change volume.
ControlID,
/// Mapping between Decibel and control values. (see Mixer control section)
VolumeOutputIndex
}
ऑडियो ऐसेट
इस सेक्शन में, ऑडियो ऐसेट को कॉन्फ़िगर और लागू करने के तरीके के बारे में बताया गया है.
कॉन्फ़िगरेशन
एचएआर ऑडियो का शुरुआती सेटअप, स्टैटिक तौर पर कॉन्फ़िगर की गई ऑडियो ऐसेट के साथ काम करता है. JSON कॉन्फ़िगरेशन से यह तय होता है कि कौनसी ऐसेट उपलब्ध हैं और कौनसी ऐसेट WAV फ़ाइलों के तौर पर तय की गई हैं.
सेटअप, सिंथेसाइज़ की गई और स्ट्रीम की गई ऑडियो ऐसेट के साथ भी काम करता है. इसके लिए, ज़्यादा जेनेरिक ऐसेट सेटअप का इस्तेमाल किया जाता है. यह ऑडियो डेटा जनरेट करने के लिए, एक फ़ंक्शन स्वीकार करता है.
लागू करना
AudioAsset और AudioStream नाम के दो अलग-अलग कंस्ट्रक्ट का इस्तेमाल करके, ऐसेट लागू करें.
AudioAsset, किसी ऐसेट की स्टैटिक प्रॉपर्टी और ऐसेट से जुड़े संभावित इंटरनल डेटा के लिए एक कंटेनर तय करता है. AudioAsset AudioStream से
को डिराइव किया जा सकता है. यह ऐसेट का एक स्ट्रीम किया जा सकने वाला इंस्टेंस है. AudioStream
में, सिंगुलर स्ट्रीम प्लेबैक से जुड़ी इंटरनल स्थिति शामिल होती है.
/// NOTE: The following code is a sample definition to help understanding, it is not a
/// representation of the final code/implementation.
/// Static properties and definition of an Asset.
AudioAsset {
/// Perform optional initialization steps, e.g. load bytes from file into memory.
/// Can also define lazy loading, to load data at first playback instead.
fn initialize(LazyLoad);
/// Create a new AudioStream from the asset.
fn create_stream() -> AudioStream;
/// More functions for metadata etc. of the asset.
...
}
/// Single streamable instance of an AudioAsset
AudioStream {
/// Gets the next bytes to play from the Asset together with if the current chunk of
/// bytes contains any control signals (e.g. fade-out).
fn get_playback(num_bytes: usize) -> ([u8], ControlSignals);
/// Gets playback Mode details used to handle special states of playback
/// e.g. when a chime gets is interrupted and put in "fade-out" mode.
fn playback_mode() -> PlaybackMode;
/// [0.0, 1.0] indication of how much of the stream was played.
fn progress() -> f32;
/// Reset the stream, e.g. if it should play again.
fn reset();
/// Time of which the stream was created.
fn created_at() -> Instant;
/// Additional metadata etc. for the stream.
...
}
घंटी बजने की सुविधा
इस सेक्शन में, घंटी बजने की सुविधा के लिए एपीआई और प्रोसेस के बारे में बताया गया है. घंटी बजने की सुविधा को स्ट्रीम कहा जाता है.
स्ट्रीम का लाइफ़साइकल
दूसरी इमेज में, स्ट्रीम का लाइफ़साइकल दिखाया गया है:
दूसरी इमेज. स्ट्रीम प्लेबैक और इवेंट.
दूसरी इमेज में, इन चरणों के बारे में बताया गया है:
चलाना: स्ट्रीम को चलाने के लिए शेड्यूल करें.
प्राथमिकता तय करना: प्लेबैक की प्राथमिकता तय करती है कि:
- घंटी बजने की सुविधा को अभी चलाना है या नहीं (पहले बाइट मिलने पर, started इवेंट)
- घंटी बजने की सुविधा को बाद में चलाना है या नहीं (paused या resumed इवेंट)
- घंटी बजने की सुविधा को प्राथमिकता नहीं देनी है या नहीं (canceled इवेंट)
मिक्सर कंट्रोल: अगर ज़रूरत हो, तो कॉन्फ़िगर किए गए व्यवहार के आधार पर, मिक्सर कंट्रोल अपडेट करें.
बाइट लिखना:
AudioDeviceमें बाइट का एक हिस्सा लिखें.ज़्यादा डेटा: अगर स्ट्रीम में ज़्यादा डेटा है, तो दूसरे चरण पर वापस जाएं.
दोहराना: अगर स्ट्रीम को दोहराना है, तो रीसेट करें और दूसरे चरण पर वापस जाएं (restarted इवेंट).
पूरा हुआ: स्ट्रीम सही तरीके से पूरी हो गई है (
FinishedSuccessfullyइवेंट).
घंटी बजने की सुविधा को, pause, resume या stop कॉल की मदद से कभी भी रोका जा सकता है.
घंटी बजने की सुविधा की प्राथमिकताएं
इस लॉजिक से, घंटी बजने की सुविधा की प्राथमिकताएं सेट की जाती हैं:
प्लेबैक मोड ओवरराइड. उदाहरण के लिए, फ़ेड आउट मोड में घंटी बजने की सुविधा को हमेशा सबसे ज़्यादा प्राथमिकता दी जाती है. यह प्राथमिकता, फ़ेड आउट पूरा होने तक दी जाती है.
तय की गई प्राथमिकता.
अगर बराबर प्राथमिकता हाल ही में दी गई है, तो घंटी बजने की सुविधा पहले चलती है.
जब घंटी बजने की सुविधा की प्राथमिकताएं बराबर होती हैं, तो AudioManager को enum वैल्यू के साथ इंस्टैंशिएट किया जाता है.
एपीआई
इवेंट
अगर घंटी बजने की सुविधा शुरू होने पर, कोई इवेंट चैनल दिया जाता है, तो एचएआर Audio, प्लेबैक के दौरान कई इवेंट एमिट करता है. इस उदाहरण में, काम करने वाले इवेंट दिखाए गए हैं:
/// NOTE: The following code is a sample definition to help understanding, it is not a
/// representation of the final code/implementation.
StreamBehaviors<PlatformStreamBehaviors> {
/// What should happen if the stream is interrupted for a higher priority stream.
/// e.g. pause-and-resume or cancel, will also define preference for fade-out.
OverrunBehavior,
/// Urgency, if interrupted streams are allowed to "fade-out", or if the stream should
/// urgently disrupt any other playback.
Optional<Urgency>,
/// Priority for the stream (or minimum if not specified).
Optional<StreamPriority>
/// Descriptor if a stream should be played on repeat.
Optional<RepeatBehavior>
/// Volume, if the stream should play at a specific volume.
Optional<Volume>
/// Spatialization, if the stream should play with specific spatialization.
Optional<Spatialization>
/// Optional generic for future expandability of the API, or pass-through of platform
/// specific Stream Behaviors
Optional<PlatformStreamBehaviors>
}
/// Plays a chime on specified device with given behaviors. StreamEvents are delivered
/// using the provided event transmitter. This method won't wait for any events.
fn play(AudioDeviceID, AssetID, StreamBehaviors, Option<EventTransmitter>) -> StreamController
/// Object used to control a Stream.
StreamController {
/// Gets the current state/metadata of a stream (e.g. ID, progress, playback_state).
fn metadata() -> StreamMetadata
/// Stops the stream.
fn stop()
/// Pauses a given stream, if the specified duration expires the stream is cancelled.
/// Timeout is required to make sure there are no paused streams left indefinitely
/// pending resumption.
fn pause(TimeoutDuration)
/// Resumes a paused stream.
fn resume()
/// Updates the spatialization of a playing stream.
fn set_spatialization(Spatialization)
/// Updates the volume of a playing stream.
fn set_volume(Volume)
}
मिक्सर कंट्रोल
इस सेक्शन में, वॉल्यूम और स्पेसियलाइज़ेशन को कंट्रोल करने के तरीके के बारे में बताया गया है.
आवाज़
एचएआर, वॉल्यूम को मिलीबेल में तय करता है. har-platform-api क्रेट, मिलीबेल से कंट्रोल सिग्नल में कन्वर्ज़न को हैंडल करता है.
मिलीबेल और हार्डवेयर पावर आउटपुट के बीच का संबंध लॉगरिद्मिक होता है. साथ ही, यह अलग-अलग हार्डवेयर और स्पीकर सेटअप के बीच काफ़ी अलग होता है. इसलिए,
वैल्यू के बीच कॉन्फ़िगरेशन उपलब्ध कराएं. यह कॉन्फ़िगरेशन AudioDevice
(ऑडियो डिवाइस और पीसीएम) कॉन्फ़िगरेशन का हिस्सा है. साथ ही, प्लैटफ़ॉर्म लेयर को कॉल करने से पहले,
कन्वर्ज़न होना चाहिए.
इसलिए, पीएएल एपीआई में सेटअप, दो फ़ंक्शन तय करता है.
fn set_volume_millibel(AudioDeviceID, Millibel) {
/// Default implementation with conversion using DeviceConfig.
}
fn set_volume_control(AudioDeviceID, ControlValue);
set_volume_millibel के लिए डिफ़ॉल्ट सेटअप, AudioDevice के लिए दिए गए कॉन्फ़िगरेशन का इस्तेमाल करता है. इसमें रेफ़रंस मिलीबेल - कंट्रोल के लिए, कुंजी-वैल्यू पेयर का सेट शामिल होता है. यह मिलीबेल को कंट्रोल वैल्यू में बदलता है. इसके बाद, बदली गई वैल्यू के साथ set_volume_control फ़ंक्शन को कॉल करता है.
इस डिज़ाइन में एक डिफ़ॉल्ट वैल्यू दी जाती है. साथ ही, बाद के सेटअप को डिफ़ॉल्ट मैपिंग को ओवरराइड करने की अनुमति मिलती है.
तीसरी इमेज. एचएआर ऑडियो फ़्लो.
स्पेसियलाइज़ेशन
ऑडियो एपीआई, यह कंट्रोल करने की सुविधा देता है कि ऑडियो डेटा को किस स्पेसियल एरिया में चलाना है. इन पैरामीटर को पीएएल लेयर में पास किया जाता है. साथ ही, हार्डवेयर कंट्रोल का इस्तेमाल करके, इन्हें डाउनस्ट्रीम में लागू किया जाता है. विकल्पों को पीएएल एपीआई के हिस्से के तौर पर इस तरह तय किया जाता है:
/// NOTE: The following code is a sample definition to help understanding, it is not a
/// representation of the final code/implementation.
enum Spatialization {
Front,
FrontLeft,
FrontRight,
Center, // No spatialization
Rear,
RearLeft,
RearRight,
Right,
Left
}
मिक्सर कंट्रोल के टियर
किसी ऐसेट और स्ट्रीम के लिए, वॉल्यूम और स्पेसियलाइज़ेशन तय किया जा सकता है. अगर स्ट्रीम की प्राथमिकता तय की जाती है, तो स्ट्रीम, ऐसेट के लिए तय किए गए कंट्रोल को ओवरराइड कर देती है.
थ्रेड मैनेजमेंट
ऑडियो मैनेजर, हर AudioDevice इंस्टेंस के लिए एक थ्रेड बनाए रखता है. हर थ्रेड, स्वतंत्र रूप से काम करता है. AudioManager और प्लेबैक थ्रेड के बीच इंटरैक्शन के लिए, प्राथमिकता के हिसाब से क्रम में लगाई गई शेयर की गई स्ट्रीम क्यू का इस्तेमाल किया जाता है.
एएलएसए कॉल, एसिंक्रोनस राइट का इस्तेमाल करते हैं. साथ ही, यह पता लगाने के लिए पोलिंग का इस्तेमाल करते हैं कि डेटा कब डाइजेस्ट हुआ.
चौथी इमेज. थ्रेड मैनेजमेंट सीक्वेंस.
पोलिंग के दौरान कंट्रोल सिग्नल
साउंड कार्ड के बाइट डाइजेस्ट करने का इंतज़ार करते समय, कंट्रोल सिग्नल जारी किए जा सकते हैं. उदाहरण के लिए, ऑडियो के फ़ेड या स्पेसियलाइज़ेशन को बदलने के लिए. ऑडियो डिवाइस की स्थिति पाने के लिए पोलिंग को AudioManager लेवल पर कॉन्फ़िगर किया जाता है. इसके अलावा, यह डिफ़ॉल्ट रूप से एक मिलीसेकंड पर सेट होता है. हर पोलिंग साइकल के बाद, प्लेबैक थ्रेड, टाइम किए गए कंट्रोल कमांड को डाइजेस्ट और जारी करता है.
बफ़र मैनेजमेंट
इंटररप्शन लेटेन्सी को कम करने के लिए, डिवाइस में लिखे गए बफ़र साइज़ को छोटा रखा जाता है. TinyALSA को डिफ़ॉल्ट के तौर पर इस्तेमाल करने पर, बफ़र साइज़ को startup_threshold पैरामीटर के बराबर कॉन्फ़िगर किया जाता है.
TinyALSA, डिफ़ॉल्ट के तौर पर, डिवाइस के लिए अलॉट किए गए पूरे बफ़र को
दो से भाग देने पर मिलने वाली वैल्यू को तय करता है.
स्ट्रीम में समस्या आ रही है
जब स्ट्रीम में समस्या आती है, तो स्ट्रीम, थ्रेड की प्राथमिकता बनाए रखती हैं. ऐसा तब तक होता है, जब तक कार्ड में लिखा गया डेटा खत्म नहीं हो जाता. इसलिए, इंटररप्शन और नई स्ट्रीम के बीच ट्रांज़िशन पीरियड होता है.
उदाहरण के लिए, अगर एचएआर में कोई ऑडियो सैंपल, इनका इस्तेमाल करता है:
- साइज़ 3,072
- रेट 48,000
- सैंपल साइज़ दो
पेंडिंग बफ़र को 3,072 और 6,144 फ़्रेम के तौर पर कैलकुलेट किया जाता है. इससे इंटररप्शन में 64 से 128 मिलीसेकंड की देरी होती है. प्रोडक्शन सेटअप के लिए, छोटे बफ़र की ज़रूरत होगी.
गड़बड़ी को मैनेज करना और जोखिम
इस सेक्शन में, गड़बड़ियों को मैनेज करने और संभावित जोखिमों के बारे में बताया गया है.
पुरानी स्ट्रीम और क्यू स्टार्वेशन
AudioStream को रोका जा सकता है. साथ ही, प्लेबैक सिर्फ़ सबसे ज़्यादा प्राथमिकता वाले AudioStream इंस्टेंस से हो सकता है. इसलिए, कम प्राथमिकता वाली स्ट्रीम के लिए, क्यू स्टार्वेशन का जोखिम बढ़ जाता है.
इससे बचने के लिए, हर क्यू को कॉन्फ़िगर किए जा सकने वाले साइज़ पर कैप किया जाता है. जब यह वैल्यू पार हो जाती है, तो सबसे कम प्राथमिकता वाली स्ट्रीम को हटा दिया जाता है.
मॉनिटर करना और सूचनाएं सेट अप करना
प्रोडक्शन में, सुरक्षा मॉनिटर, ऑडियो सुविधाओं को ट्रैक करता है. इससे यह ट्रैक किया जाता है कि प्लेबैक, उम्मीद के मुताबिक हो रहा है या नहीं.
AudioManager , लेटेन्सी और लॉगिंग परफ़ॉर्मेंस तय करने वाले फ़्लैग से जुड़े इंटरनल आंकड़ों को मॉनिटर करता है. इन थ्रेशोल्ड को सेट करने के बाद, सभी डीबग बिल्ड के लिए चेतावनी लॉग जनरेट किए जाते हैं. ऐसा तब होता है, जब:
- शेड्यूल करने और प्लेबैक शुरू करने के बीच का समय,
xमिलीसेकंड से ज़्यादा हो जाता है. - (बिना किसी रुकावट वाली स्ट्रीम के लिए) ऐसेट की लंबाई और प्लेबैक का समय,
yप्रतिशत से ज़्यादा अलग होता है.
डिवाइस ब्लॉक किया गया
ऑडियो डिवाइस के काम न करने का हमेशा थोड़ा जोखिम होता है. उदाहरण के लिए, अगर इसे सिस्टम में किसी दूसरी प्रोसेस से अलॉट किया जाता है और इसमें लिखा जाता है. प्लेबैक, अलग-अलग थ्रेड में एसिंक्रोनस तरीके से चलता है. साथ ही, घंटी बजने की सुविधा को बाद में चलाने के लिए, क्यू किया जा सकता है. इसलिए, यह कॉलिंग ऐप्लिकेशन के लिए पूरी तरह से पारदर्शी होता है.
इसका पता लगाने के लिए, हर बार घंटी बजने की सुविधा को शेड्यूल किए जाने पर, थ्रेड की हेल्थ की जांच की जाती है. अगर प्लेबैक थ्रेड में भरी हुई क्यू है और पिछले एक सेकंड में कोई नया बाइट डाइजेस्ट नहीं किया गया है, तो गड़बड़ी का मैसेज दिखता है.
भविष्य में, डिवाइसों को रीस्टार्ट / खोलने की कोशिश करना ज़रूरी हो सकता है. हालांकि, शुरुआती सेटअप के लिए, गड़बड़ियां दिखनी चाहिए.
कोड का स्ट्रक्चर
बड़े लेवल पर, घंटी बजने की सुविधा से जुड़ा कोड, इन क्रेट में मौजूद होता है:
CRATE: display-safety/crates/(harry-app|harry)
मौजूदा एचएआर ऐप्लिकेशन, जो घंटी बजने की सुविधा को चलाने के लिए कॉल करता है.
NEW CRATE: display-safety/crates/audio
नया: ऑडियो कंट्रोल और प्लेबैक को मैनेज करने के लिए क्रेट (ज़्यादातर सुविधाएं यहीं मौजूद होती हैं).
CRATE: display-safety/crates/har-platform-api/audio
पीएएल, जिसमें ऑडियो के लिए ज़रूरी सभी सिस्टम कॉल शामिल हैं.
CRATE: display-safety/crates/har-platform-(android|linux)/audio
TinyALSA का इस्तेमाल करके प्लेबैक के लिए, tinyalsa-rs को कॉल करना. शुरुआती समाधान में, QNX के लिए सहायता की सुविधा लागू नहीं की गई है. ज़्यादा प्लैटफ़ॉर्म के लिए सहायता की सुविधा मिलने पर, यह बढ़ेगी.
TINYALSA PAL: display-safety/crates/tinyalsa-audio
प्लेबैक के लिए, TinyALSA से जुड़ा कोड. इसका इस्तेमाल, Android और Linux प्लैटफ़ॉर्म के सेटअप में किया जाता है.
CRATE: display-safety/crates/tinyalsa-rs
TinyALSA C सेटअप के लिए, रस्ट बाइंडिंग
रस्ट सेटअप की जानकारी
सेटअप से जुड़ी कुछ खास जानकारी:
- सभी एपीआई फ़ंक्शन
Result<X, AudioError>दिखाते हैं. इसमेंXया तो () या कोई रिटर्न वैल्यू होती है. - किसी भी एपीआई फ़ंक्शन को
unsafeके तौर पर मार्क नहीं किया गया है. - म्यूटक्स और सिंक्रनाइज़ेशन के तरीके इंटरनल होते हैं. इन्हें
AudioManagerएपीआई में नहीं दिखाया जाता है.
ओनरशिप मॉडल और AudioManager
ऑडियो सिस्टम के साथ ऐप्लिकेशन का सभी इंटरैक्शन,
AudioManagerयाAudioManagerसे लौटाए गए ऑब्जेक्ट के ज़रिए होता है.AudioManager, थ्रेड सेफ़ है.AudioManagerको HARry ऐप्लिकेशन में एक बार इंस्टैंशिएट किया जाता है. साथ ही,Looperके पास मालिकाना हक होने के लिए, इसेMovedकिया जाता है.AudioManagerअपने शुरू किए गए प्लेबैक थ्रेड को मैनेज करने के लिए,tokio_util::CancellationTokenटोकन का इस्तेमाल करता है. इससे यह पक्का होता है किAudioManagerकेDroppedहोने पर, थ्रेड खत्म हो जाएं और संसाधन रिलीज़ हो जाएं.AudioManager, एक से ज़्यादा इंस्टेंस बनने से साफ़ तौर पर नहीं रोकता है. अगर एक से ज़्यादा इंस्टेंस मौजूद हैं, तो यहwarnलेवल के साथ लॉग करता है.
शेयर किया गया मालिकाना हक
कई ऑब्जेक्ट का मालिकाना हक शेयर किया जाता है. इन्हें रैप किया जाता है और एक्सक्लूसिव ऐक्सेस के साथ सिंक्रनाइज़ किया जाता है. इन तरीकों को AudioManager एपीआई में नहीं दिखाया जाता है. हालांकि, ये ऑडियो और पीएएल सेटअप के लिए इंटरनल होते हैं.
AudioDevice- हर हार्डवेयर रेफ़रंस (उदाहरण के लिए, TinyALSA PCM) जो खोला गया है (जिसका हैंडल है) के पास एक्सक्लूसिव ऐक्सेस होता है. एसएमपी डिज़ाइन देखें.AudioStreamइंस्टेंस के पास, प्लेबैक के लिए शेड्यूल किए जाने के बाद एक्सक्लूसिव ऐक्सेस होता है. ऐसा इसलिए, क्योंकि इन्हें ऐप्लिकेशन से कंट्रोल किया जा सकता है. साथ ही, प्लेबैक थ्रेड से एक साथ ऐक्सेस किया जा सकता है.प्लेबैक थ्रेड, प्लेबैक के दौरान लॉक नहीं रखता है. हालांकि, यह चलाने के लिए अगले बफ़र का इम्यूटेबल स्नैपशॉट बनाता है. साथ ही, अगले बफ़र के डाइजेस्ट होने तक, बदलावों को ध्यान में नहीं रखता है.
हर प्लेबैक थ्रेड में एक प्लेबैक क्यू होती है. यह
AudioManagerऔर प्लेबैक थ्रेड के बीच शेयर किया गया रेफ़रंस होता है. इसलिए, थ्रेड को म्यूटेशन के लिए एक्सक्लूसिव ऐक्सेस की ज़रूरत होती है.जिन थ्रेड में कोई स्ट्रीम नहीं होती है वे
Condvarवैरिएबल के साथ आइडल हो जाती हैं. इससे नया डेटा मिलने पर, वेकअप इवेंट मिलते हैं. इस तरीके का मालिकाना हक शेयर किया जाता है.
डिपेंडेंसी
क्रेट और ऑडियो क्रेट को इस तरह डिज़ाइन किया गया है कि Android सोर्स ट्री में बनाए जाने की अनुमति न पाने वाले क्रेट पर डिपेंडेंसी कम हो. शामिल किए गए क्रेट की यह सूची देखें.
Android और Linux के लिए डाउनस्ट्रीम प्लैटफ़ॉर्म सेटअप,
TinyALSA और मौजूदा डिसप्ले सेफ़्टी tinyalsa-rs क्रेट पर निर्भर करते हैं.
क्वालिटी एट्रिब्यूट
विश्वसनीयता
ऑडियो प्लेबैक, सुरक्षा के लिहाज़ से ज़रूरी है. हालांकि, इस डिज़ाइन में सुरक्षा मॉनिटरिंग के सेटअप को शामिल नहीं किया गया है. हार्डवेयर और प्रोडक्शन में ऑडियो प्लेबैक की विश्वसनीयता की पुष्टि करने के लिए, इसे अलग से लागू करें.
बढ़ाए जा सकने की योग्यता
हर डिवाइस के लिए एक थ्रेड का तरीका, अलग-अलग हार्डवेयर सेटअप के लिए स्केल करने के लिए है. हर थ्रेड, मुख्य रूप से आइडल होता है. यह डेटा का इंतज़ार करता है या डिवाइस के लिखे गए डेटा को डाइजेस्ट करने का इंतज़ार करता है. इसलिए, यह प्रोसेसर पर ज़्यादा लोड नहीं डालता है. साथ ही, सिस्टम परफ़ॉर्मेंस के लिहाज़ से ज़्यादा इंटेंसिव नहीं होता है.
सिर्फ़ एक डिवाइस पर डेटा चलाने का डिज़ाइन, मिक्सर कंट्रोल कमांड के साथ मिलकर, यह पक्का करता है कि सभी आउटपुट कंट्रोल के लिए, सटीक आउटपुट को साउंड हार्डवेयर हैंडल करे. साथ ही, यह आने वाले समय के सिस्टम के लिए स्केल होना चाहिए.
इंतज़ार का समय
ऑडियो सिस्टम के लिए, इंतज़ार का समय ज़रूरी है. इसलिए, सेटअप के बाद, सिस्टम के इंतज़ार के समय के लिए, सर्विस-लेवल ऑब्जेक्टिव (एसएलओ) का सेट तय किया जाता है. इंतज़ार के समय की स्थिति को लगातार मॉनिटर करने के लिए, सिस्टम लॉग में मॉनिटरिंग की जाती है. इसमें सभी डीबग बिल्ड में, तय किए गए एसएलओ पूरे नहीं किए जाते हैं.
प्रोडक्शन वर्शन के लिए, मॉनिटरिंग डेटा को ऑडियो सेटअप के बाहर मौजूद किसी सिस्टम में पास किया जाता है. इसके लिए, लॉग पर निर्भर नहीं रहा जाता.
टेस्ट और टेस्ट की रणनीति
क्रेट और ऑडियो क्रेट को टेस्ट कवरेज के साथ डिज़ाइन किया गया है. हमने यह पुष्टि करने के लिए, मॉक प्लैटफ़ॉर्म सेटअप जोड़ा है कि सभी क्षमताओं की जांच की गई है.
हार्डवेयर और बाइंडिंग की जटिलता की वजह से, प्लैटफ़ॉर्म सेटअप के लिए, ज़्यादा टेस्ट कवरेज नहीं दिया जा सकता. हम हार्डवेयर और Cuttlefish एम्युलेटर पर, मैन्युअल तरीके से समाधान की जांच करने के लिए, सैंपल सेटअप उपलब्ध कराते हैं.
दस्तावेज़
Audio crates/audio में मौजूद README.md फ़ाइल में, AudioManager का इस्तेमाल करने का तरीका बताया गया है. crates/audio/examples में, इनके उदाहरण शामिल हैं:
- कोई प्लैटफ़ॉर्म लागू करना.
AudioManagerका इंस्टेंस बनाना.WavAssetचलाना.- कस्टम फ़ंक्शन ऐसेट को बार-बार चलाना.
- प्लेबैक इवेंट लॉग करना.