เนื้อหานี้อธิบายการเล่นเสียงกริ่งในตัวแสดงผลที่มีความพร้อมใช้งานสูง (HAR)
ลัง Audio จะแสดง AudioManager ให้แอป HAR ซึ่งควบคุมการเล่นเสียงกริ่ง
เพื่อให้เวลาในการตอบสนองต่ำ เธรดการเล่นจะทำงานตลอดอายุการใช้งานของแอป โดยจะหยุดทำงานและปล่อย CPU ให้เธรดอื่นเมื่อไม่มีเสียงเล่น
คำศัพท์
- ชิ้นงาน
AudioAssetเกี่ยวข้องกับเสียงที่เล่นได้ โดยชิ้นงานเป็นที่รู้จักกันโดยทั่วไปและมีอยู่ในรันไทม์ของแอป- อุปกรณ์
AudioDeviceหมายถึงบัสแยกสำหรับการเล่นเสียง อุปกรณ์เป็นหน่วยที่ละเอียดที่สุดที่เกี่ยวข้องกับฮาร์ดแวร์ที่ระบบเข้าถึง ในการติดตั้งใช้งาน SDVM มาตรฐานAudioDeviceหมายถึง PCM เดียวของ Advanced Linux Sound Architecture (ALSA)- สตรีม
- อินสแตนซ์ของการเล่นชิ้นงานในอุปกรณ์ สตรีมจะคงอยู่ตั้งแต่เวลาที่กำหนดเวลาไว้จนกว่าจะเสร็จสมบูรณ์ ยกเลิก หรือสิ้นสุดด้วยข้อผิดพลาด
คอมโพเนนต์
รูปที่ 1 แสดงแผนภาพคอมโพเนนต์สำหรับเสียงกริ่ง
รูปที่ 1 แผนภาพคอมโพเนนต์
อุปกรณ์เสียงและ PCM
การกำหนดค่าฮาร์ดแวร์เสียงเป็นไปตามการออกแบบเลเยอร์การแยกส่วนแพลตฟอร์ม HAR มาตรฐาน และ har-platform-api มีการกำหนดค่าดังกล่าว
ลัง Audio ของ HAR กำหนดโครงสร้างใหม่สำหรับ AudioDevice ซึ่งกำหนด
ช่องสำหรับโครงสร้างข้อมูลทั้งหมดที่ส่งผลต่อลัง Audio ภายในของ HAR
และการเล่น AudioDevice ยังใช้ Generics เพื่อรวมพารามิเตอร์เพิ่มเติมที่อาจเฉพาะเจาะจงกับแพลตฟอร์ม ในกรณีของ tinyalsa นั้น PlatformAudioDevice จะมีตัวอธิบายและพร็อพเพอร์ตี้ของ ALSA PCM
/// 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
}
เนื้อหาเสียง
ส่วนนี้อธิบายวิธีกำหนดค่าและติดตั้งใช้งานเนื้อหาเสียง
การกำหนดค่า
การติดตั้งใช้งานเสียง HAR เริ่มต้นรองรับเนื้อหาเสียงที่กำหนดค่าแบบคงที่ การกำหนดค่า JSON จะกำหนดว่ามีเนื้อหาใดบ้างและเนื้อหาใดบ้างที่กำหนดเป็นไฟล์ WAV
การติดตั้งใช้งานยังรองรับเนื้อหาเสียงที่สังเคราะห์และสตรีมผ่านการติดตั้งใช้งานเนื้อหาที่ทั่วไปมากขึ้น ซึ่งยอมรับฟังก์ชันในการสร้างข้อมูลเสียง
การใช้งาน
ติดตั้งใช้งานเนื้อหาโดยใช้โครงสร้างแยกกัน 2 รายการ ได้แก่ 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.
...
}
การเล่นเสียงกริ่ง
ส่วนนี้อธิบาย API และขั้นตอนสำหรับการเล่นเสียงกริ่ง การเล่นเสียงกริ่งเดียวจะเรียกว่า สตรีม
วงจรการใช้งานของสตรีม
รูปที่ 2 แสดงวงจรการใช้งานของสตรีม
รูปที่ 2 การเล่นสตรีมและเหตุการณ์
รูปที่ 2 อธิบายขั้นตอนต่อไปนี้
เล่น: กำหนดเวลาให้สตรีมเล่น
จัดลำดับความสำคัญ: การจัดลำดับความสำคัญในการเล่นจะตัดสินใจว่าจะดำเนินการต่อไปนี้หรือไม่
- เล่นเสียงกริ่งเลย (เหตุการณ์เริ่มต้นเมื่อได้รับไบต์แรก)
- เล่นเสียงกริ่งในภายหลัง (เหตุการณ์หยุดชั่วคราวหรือกลับมาเล่นต่อ)
- ลดลำดับความสำคัญของเสียงกริ่ง (เหตุการณ์ยกเลิก)
การควบคุมมิกเซอร์: หากจำเป็น ให้อัปเดตการควบคุมมิกเซอร์ตามลักษณะการทำงานที่กำหนดค่าไว้
เขียนไบต์: เขียนไบต์เป็นกลุ่มลงใน
AudioDeviceข้อมูลเพิ่มเติม: หากสตรีมมีข้อมูลเพิ่มเติม ให้กลับไปที่ขั้นตอนที่ 2
เล่นซ้ำ: หากควรเล่นสตรีมซ้ำ ให้รีเซ็ตและกลับไปที่ขั้นตอนที่ 2 (เหตุการณ์เริ่มเล่นใหม่)
เสร็จสมบูรณ์: สตรีมเล่นเสร็จสมบูรณ์ (
FinishedSuccessfullyevent)
คุณสามารถขัดจังหวะเสียงกริ่งด้วยการหยุดชั่วคราว กลับมาเล่นต่อ หรือหยุดการโทรได้ทุกเมื่อ
ลำดับความสำคัญของเสียงกริ่ง
ตรรกะนี้กำหนดลำดับความสำคัญของเสียงกริ่งดังนี้
การลบล้างโหมดการเล่น เช่น ระบบจะให้ลำดับความสำคัญสูงสุดแก่เสียงกริ่งในโหมดเฟดเอาต์เสมอจนกว่าจะเฟดเอาต์เสร็จสมบูรณ์
ลำดับความสำคัญที่ระบุ
หากเสียงกริ่งมีลำดับความสำคัญเท่ากันและเพิ่งกำหนดล่าสุด ระบบจะเล่นเสียงกริ่งนั้นก่อน
เมื่อเสียงกริ่งมีลำดับความสำคัญเท่ากัน ระบบจะสร้างอินสแตนซ์ AudioManager ด้วยค่า enum
API
กิจกรรม
หากมีการระบุช่องเหตุการณ์เมื่อเสียงกริ่งเริ่มเล่น Audio ของ HAR จะปล่อยเหตุการณ์จำนวนหนึ่งระหว่างการเล่น เหตุการณ์ที่รองรับจะแสดงในตัวอย่างนี้
/// 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)
}
การควบคุมมิกเซอร์
ส่วนนี้อธิบายวิธีควบคุมระดับเสียงและการสร้างเสียงแบบ 3 มิติ
เล่ม
HAR กำหนดระดับเสียงอย่างสม่ำเสมอในหน่วยมิลลิเบล ลัง har-platform-api จะจัดการการแปลงจากมิลลิเบลเป็นสัญญาณควบคุม
ความสัมพันธ์ระหว่างมิลลิเบลกับเอาต์พุตกำลังของฮาร์ดแวร์เป็นแบบลอการิทึม และแตกต่างกันอย่างมากระหว่างการตั้งค่าฮาร์ดแวร์และลำโพงต่างๆ ดังนั้น
ให้ระบุการกำหนดค่าระหว่างค่าต่างๆ เป็นส่วนหนึ่งของการกำหนดค่า AudioDevice
(อุปกรณ์เสียงและ PCM) และการแปลงต้องเกิดขึ้นก่อนที่จะ
เรียกเลเยอร์แพลตฟอร์ม
ดังนั้น การติดตั้งใช้งานใน PAL API จึงกำหนดฟังก์ชัน 2 ฟังก์ชัน
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 ด้วยค่าที่แปลงแล้ว
การออกแบบนี้มีการกำหนดค่าเริ่มต้นและช่วยให้การติดตั้งใช้งานในภายหลังลบล้างการแมปเริ่มต้นได้
รูปที่ 3 โฟลว์เสียง HAR
การสร้างเสียงแบบ 3 มิติ
Audio API แสดงฟังก์ชันการทำงานเพื่อควบคุมพื้นที่เชิงพื้นที่ที่ควรเล่นข้อมูลเสียง ระบบจะส่งพารามิเตอร์เหล่านี้ไปยังเลเยอร์ PAL และใช้พารามิเตอร์เหล่านี้ในภายหลังโดยใช้การควบคุมฮาร์ดแวร์ ตัวเลือกจะกำหนดเป็นส่วนหนึ่งของ PAL API ดังนี้
/// 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
}
ระดับการควบคุมมิกเซอร์
คุณสามารถกำหนดระดับเสียงและการสร้างเสียงแบบ 3 มิติในเนื้อหาและสำหรับสตรีม หากคุณกำหนดลำดับความสำคัญของสตรีม สตรีมจะลบล้างการควบคุมที่กำหนดโดยเนื้อหา
การจัดการเธรด
ตัวจัดการเสียงจะดูแลเธรด 1 เธรดต่ออินสแตนซ์ AudioDevice โดยแต่ละเธรดจะทำงานแยกกัน การโต้ตอบระหว่าง AudioManager กับเธรดการเล่นใช้คิวสตรีมที่แชร์ซึ่งจัดเรียงตามลำดับความสำคัญ
การเรียก ALSA ใช้การเขียน ASYNC พร้อมการโพลเพื่อกำหนดเวลาที่ข้อมูลจะถูกประมวลผล
รูปที่ 4 ลำดับการจัดการเธรด
สัญญาณควบคุมระหว่างการโพล
เมื่อรอให้การ์ดเสียงประมวลผลไบต์ คุณจะส่งสัญญาณควบคุมได้ เช่น เพื่อเปลี่ยนการเฟดหรือการสร้างเสียงแบบ 3 มิติของเสียง การโพลเพื่อรับสถานะของอุปกรณ์เสียงจะกำหนดค่าที่ระดับ AudioManager หรือค่าเริ่มต้นเป็น 1 มิลลิวินาที หลังจากรอบการโพลแต่ละรอบ เธรดการเล่นจะประมวลผลและส่งคำสั่งควบคุมที่กำหนดเวลาไว้
การจัดการบัฟเฟอร์
ขนาดบัฟเฟอร์ที่เขียนลงในอุปกรณ์จะคงไว้ให้มีขนาดเล็กเพื่อลดเวลาในการตอบสนองของการขัดจังหวะ เมื่อใช้ TinyALSA เป็นค่าเริ่มต้น ระบบจะกำหนดค่าขนาดบัฟเฟอร์ให้เท่ากับพารามิเตอร์ startup_threshold
TinyALSA กำหนดค่าเริ่มต้น เป็นบัฟเฟอร์อุปกรณ์ที่จัดสรรทั้งหมด
หารด้วย 2
การขัดจังหวะสตรีม
เมื่อสตรีมถูกขัดจังหวะ สตรีมจะคงลำดับความสำคัญของเธรดไว้จนกว่าข้อมูลที่เขียนลงในการ์ดจะหมด ดังนั้นจึงมีช่วงเปลี่ยนผ่านระหว่างการขัดจังหวะกับสตรีมใหม่
ตัวอย่างเช่น หากตัวอย่างเสียงใน HAR ใช้ค่าต่อไปนี้
- ขนาด 3,072
- อัตรา 48,000
- ขนาดตัวอย่าง 2
ระบบจะคำนวณบัฟเฟอร์ที่รอดำเนินการเป็น 3,072 และ 6,144 เฟรม ซึ่งส่งผลให้เกิดการหน่วงเวลาในการขัดจังหวะ 64 ถึง 128 มิลลิวินาที การติดตั้งใช้งานจริงจะต้องใช้บัฟเฟอร์ที่เล็กลง
การจัดการข้อผิดพลาดและความเสี่ยง
ส่วนนี้อธิบายวิธีจัดการข้อผิดพลาดและความเสี่ยงที่อาจเกิดขึ้น
สตรีมที่ล้าสมัยและการขาดแคลนคิว
เนื่องจาก AudioStream สามารถหยุดชั่วคราวได้ และการเล่นจะเกิดขึ้นได้จากอินสแตนซ์ AudioStream ที่มีลำดับความสำคัญสูงสุดเท่านั้น จึงมีความเสี่ยงที่คิวจะเติบโตขึ้นและทำให้สตรีมที่มีลำดับความสำคัญต่ำขาดแคลน
เพื่อหลีกเลี่ยงเหตุการณ์นี้ ระบบจะจำกัดขนาดของแต่ละคิวไว้ที่ขนาดที่กำหนดค่าได้ เมื่อขนาดเกินค่านี้ ระบบจะทิ้งสตรีมที่มีลำดับความสำคัญต่ำที่สุด
ตรวจสอบและแจ้งเตือน
ในเวอร์ชันที่ใช้งานจริง ตัวตรวจสอบความปลอดภัยจะติดตามฟีเจอร์เสียงเพื่อให้แน่ใจว่าการเล่นเกิดขึ้นตามที่คาดไว้
AudioManager จะตรวจสอบสถิติภายในที่เฉพาะเจาะจงกับเวลาในการตอบสนองและแฟล็กที่กำหนดประสิทธิภาพการบันทึก หลังจากตั้งค่าเกณฑ์เหล่านี้แล้ว ระบบจะสร้างบันทึกคำเตือนสำหรับการสร้างทั้งหมดในโหมดดีบักเมื่อเกิดเหตุการณ์ต่อไปนี้
- ระยะเวลาระหว่างการกำหนดเวลาและการเริ่มเล่นเกิน
xมิลลิวินาที - (สำหรับสตรีมที่ไม่ถูกขัดจังหวะ) ความยาวของเนื้อหาและเวลาเล่นแตกต่างกันมากกว่า
yเปอร์เซ็นต์
บล็อกอุปกรณ์แล้ว
อุปกรณ์เสียงอาจไม่ตอบสนองได้เสมอไป เช่น หากกระบวนการอื่นในระบบจัดสรรและเขียนข้อมูลลงในอุปกรณ์ เนื่องจากการเล่นทำงานแบบไม่พร้อมกันในเธรดแยกกัน และสามารถจัดคิวเสียงกริ่งให้เล่นในภายหลังได้ แอปการโทรจึงไม่ได้รับผลกระทบใดๆ
หากต้องการตรวจหาเหตุการณ์นี้ ระบบจะตรวจสอบสถานะของเธรดทุกครั้งที่กำหนดเวลาให้เล่นเสียงกริ่งใหม่ และจะแสดงข้อผิดพลาดหากเธรดการเล่นมีคิวที่เต็มและไม่ได้ประมวลผลไบต์ใหม่ใดๆ ในช่วง 1 วินาทีที่ผ่านมา
ในอนาคต คุณอาจต้องพยายามรีสตาร์ท / เปิดอุปกรณ์ แต่สำหรับการติดตั้งใช้งานเริ่มต้น ข้อผิดพลาดไม่ควรถูกซ่อนไว้
โครงสร้างโค้ด
โดยทั่วไป โค้ดที่เกี่ยวข้องกับการเล่นเสียงกริ่งจะอยู่ในลังต่อไปนี้
CRATE: display-safety/crates/(harry-app|harry)
แอป HAR ที่มีอยู่ซึ่งส่งการเรียกให้เล่นเสียงกริ่ง
NEW CRATE: display-safety/crates/audio
ใหม่: ลังสำหรับจัดการการควบคุมและการเล่นเสียง (ฟังก์ชันการทำงานส่วนใหญ่อยู่ที่นี่)
CRATE: display-safety/crates/har-platform-api/audio
PAL รวมถึงการเรียกของระบบทั้งหมดที่จำเป็นสำหรับเสียง
CRATE: display-safety/crates/har-platform-(android|linux)/audio
การเรียก tinyalsa-rs สำหรับการเล่นโดยใช้ TinyALSA ระบบยังไม่ได้ติดตั้งใช้งานการรองรับ QNX ในโซลูชันเริ่มต้น และการรองรับนี้จะเพิ่มขึ้นเมื่อมีการรองรับแพลตฟอร์มเพิ่มเติม
TINYALSA PAL: display-safety/crates/tinyalsa-audio
โค้ดเฉพาะของ TinyALSA สำหรับการเล่น การติดตั้งใช้งานแพลตฟอร์ม Android และ Linux ใช้โค้ดนี้
CRATE: display-safety/crates/tinyalsa-rs
การผูก Rust สำหรับการติดตั้งใช้งาน TinyALSA C
รายละเอียดการติดตั้งใช้งาน Rust
รายละเอียดการติดตั้งใช้งานที่เฉพาะเจาะจงบางรายการ
- ฟังก์ชัน API ทั้งหมดจะแสดงผล
Result<X, AudioError>โดยที่Xคือ () หรือ ค่าที่แสดงผล - ไม่มีฟังก์ชัน API ใดที่ทำเครื่องหมายเป็น
unsafe - กลไกการทำงานของ Mutex และการซิงโครไนซ์เป็นแบบภายในและไม่ได้แสดงใน
AudioManagerAPI
โมเดลการเป็นเจ้าของและ AudioManager
การโต้ตอบทั้งหมดของแอปกับระบบเสียงจะเกิดขึ้นผ่าน
AudioManagerหรือออบเจ็กต์ที่แสดงผลจากAudioManagerAudioManagerปลอดภัยต่อเธรดระบบจะสร้างอินสแตนซ์
AudioManagerเพียงครั้งเดียวในแอป HARry และMovedเพื่อให้Looperเป็นเจ้าของAudioManagerใช้โทเค็นtokio_util::CancellationTokenเพื่อจัดการ เธรดการเล่นที่เริ่มแล้ว เพื่อให้แน่ใจว่าเธรดจะสิ้นสุดลงและ ทรัพยากรจะได้รับการเผยแพร่หากAudioManagerเป็นDroppedAudioManagerไม่ได้ป้องกันไม่ให้มีการสร้างอินสแตนซ์หลายรายการอย่างชัดเจน หากมีอินสแตนซ์มากกว่า 1 รายการ ระบบจะบันทึกด้วยระดับwarn
การเป็นเจ้าของร่วม
ออบเจ็กต์จำนวนหนึ่งมีการเป็นเจ้าของร่วมที่รวมและซิงโครไนซ์ด้วยการเข้าถึงแบบพิเศษ กลไกการทำงานเหล่านี้ไม่ได้แสดงใน AudioManager API แต่เป็นแบบภายในของการติดตั้งใช้งานเสียงและ PAL
AudioDevice- การอ้างอิงฮาร์ดแวร์แต่ละรายการ (เช่น TinyALSA PCM) ที่ เปิดอยู่ (มีแฮนเดิล) จะมีการเข้าถึงแบบพิเศษ ดูการออกแบบ SMPอินสแตนซ์
AudioStreamมีการเข้าถึงแบบพิเศษหลังจากกำหนดเวลาให้เล่นแล้ว เนื่องจากแอปสามารถควบคุมอินสแตนซ์เหล่านี้และเธรดการเล่นสามารถเข้าถึงอินสแตนซ์เหล่านี้ได้พร้อมกันเธรดการเล่นจะไม่ล็อกไว้ระหว่างการเล่น แต่จะสร้างสแนปช็อตที่ไม่เปลี่ยนแปลงของบัฟเฟอร์ถัดไปที่จะเล่น และจะไม่พิจารณาการเปลี่ยนแปลงจนกว่าจะประมวลผลบัฟเฟอร์ถัดไป
เธรดการเล่นแต่ละเธรดมีคิวการเล่น ซึ่งเป็นการอ้างอิงที่แชร์ระหว่าง
AudioManagerกับเธรดการเล่น ดังนั้นเธรดจึงต้องมีการเข้าถึงแบบพิเศษสำหรับการเปลี่ยนแปลงเธรดที่ไม่มีสตรีมจะไม่มีการใช้งานโดยใช้ตัวแปร
Condvarเพื่อรับเหตุการณ์การปลุกระบบเมื่อตรวจพบข้อมูลใหม่ กลไกการทำงานนี้มีการเป็นเจ้าของร่วม
ความสัมพันธ์
ลังและลังเสียงได้รับการออกแบบมาเพื่อลดความสัมพันธ์กับลังที่ไม่ได้รับอนุมัติให้สร้างในซอร์สโค้ดของ Android ดูรายการลังที่รวมไว้ crates.
การติดตั้งใช้งานแพลตฟอร์มปลายทางสำหรับ Android และ Linux ขึ้นอยู่กับ
TinyALSA และลัง Display Safety tinyalsa-rs ที่มีอยู่
แอตทริบิวต์คุณภาพ
ความไว้ใจได้
แม้ว่าการเล่นเสียงจะเป็นสิ่งสำคัญต่อความปลอดภัย แต่การออกแบบนี้ไม่ได้ครอบคลุมการติดตั้งใช้งานการตรวจสอบความปลอดภัย คุณต้องติดตั้งใช้งานการตรวจสอบความปลอดภัยนี้แยกต่างหากเพื่อยืนยันความไว้ใจได้ของการเล่นเสียงในฮาร์ดแวร์และในเวอร์ชันที่ใช้งานจริง
ความสามารถในการปรับขนาด
แนวทาง 1 เธรดต่ออุปกรณ์ได้รับการออกแบบมาเพื่อปรับขนาดให้เข้ากับการตั้งค่าฮาร์ดแวร์ต่างๆ เนื่องจากแต่ละเธรดส่วนใหญ่จะหยุดทำงาน รอข้อมูล หรือรอให้อุปกรณ์ประมวลผลข้อมูลที่เขียนลงไป จึงไม่ควรใช้โปรเซสเซอร์มากหรือใช้ทรัพยากรของระบบมาก
การตัดสินใจออกแบบให้เล่นข้อมูลในอุปกรณ์เดียวเท่านั้น รวมถึงคำสั่งควบคุมมิกเซอร์สำหรับการควบคุมเอาต์พุตเพิ่มเติมทั้งหมด ช่วยให้ฮาร์ดแวร์เสียงจัดการเอาต์พุตที่แน่นอน และควรปรับขนาดให้เข้ากับระบบในอนาคตได้
เวลาในการตอบสนอง
เวลาในการตอบสนองเป็นสิ่งสำคัญสำหรับระบบเสียง ดังนั้นหลังจากติดตั้งใช้งานแล้ว คุณต้องกำหนดชุดเป้าหมายระดับการให้บริการ (SLO) สำหรับเวลาในการตอบสนองของระบบ และตรวจสอบบันทึกในบันทึกของระบบอย่างต่อเนื่องเพื่อดูว่าเวลาในการตอบสนองไม่เป็นไปตาม SLO ที่กำหนดไว้ในการสร้างทั้งหมดในโหมดดีบัก
สำหรับเวอร์ชันที่ใช้งานจริง ระบบจะส่งข้อมูลการตรวจสอบไปยังระบบบางระบบภายนอกการติดตั้งใช้งานเสียง แทนที่จะใช้บันทึก
การทดสอบและกลยุทธ์การทดสอบ
ลังและลังเสียงได้รับการออกแบบมาให้มีการครอบคลุมการทดสอบ เราได้เพิ่มการติดตั้งใช้งานแพลตฟอร์มจำลองเพื่อยืนยันว่ามีการทดสอบความสามารถทั้งหมด
ความซับซ้อนของฮาร์ดแวร์และการผูกทำให้การติดตั้งใช้งานแพลตฟอร์มไม่สามารถครอบคลุมการทดสอบได้อย่างกว้างขวาง เราจึงจัดเตรียมการติดตั้งใช้งานตัวอย่างเพื่อทดสอบโซลูชันด้วยตนเองในฮาร์ดแวร์และในโปรแกรมจำลอง Cuttlefish
เอกสารประกอบ
ไฟล์ README.md ใน Audio crates/audio อธิบายวิธีใช้ AudioManager crates/audio/examples มีตัวอย่างสำหรับกรณีต่อไปนี้
- ติดตั้งใช้งานแพลตฟอร์ม
- สร้างอินสแตนซ์ของ
AudioManager - เล่น
WavAsset - เล่นเนื้อหาฟังก์ชันที่กำหนดเองซ้ำ
- บันทึกเหตุการณ์การเล่น