เสียงเตือน

เนื้อหานี้อธิบายการเล่นเสียงกริ่งในตัวแสดงผลที่มีความพร้อมใช้งานสูง (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 อธิบายขั้นตอนต่อไปนี้

  1. เล่น: กำหนดเวลาให้สตรีมเล่น

  2. จัดลำดับความสำคัญ: การจัดลำดับความสำคัญในการเล่นจะตัดสินใจว่าจะดำเนินการต่อไปนี้หรือไม่

    • เล่นเสียงกริ่งเลย (เหตุการณ์เริ่มต้นเมื่อได้รับไบต์แรก)
    • เล่นเสียงกริ่งในภายหลัง (เหตุการณ์หยุดชั่วคราวหรือกลับมาเล่นต่อ)
    • ลดลำดับความสำคัญของเสียงกริ่ง (เหตุการณ์ยกเลิก)
  3. การควบคุมมิกเซอร์: หากจำเป็น ให้อัปเดตการควบคุมมิกเซอร์ตามลักษณะการทำงานที่กำหนดค่าไว้

  4. เขียนไบต์: เขียนไบต์เป็นกลุ่มลงใน AudioDevice

  5. ข้อมูลเพิ่มเติม: หากสตรีมมีข้อมูลเพิ่มเติม ให้กลับไปที่ขั้นตอนที่ 2

  6. เล่นซ้ำ: หากควรเล่นสตรีมซ้ำ ให้รีเซ็ตและกลับไปที่ขั้นตอนที่ 2 (เหตุการณ์เริ่มเล่นใหม่)

  7. เสร็จสมบูรณ์: สตรีมเล่นเสร็จสมบูรณ์ (FinishedSuccessfully event)

คุณสามารถขัดจังหวะเสียงกริ่งด้วยการหยุดชั่วคราว กลับมาเล่นต่อ หรือหยุดการโทรได้ทุกเมื่อ

ลำดับความสำคัญของเสียงกริ่ง

ตรรกะนี้กำหนดลำดับความสำคัญของเสียงกริ่งดังนี้

  1. การลบล้างโหมดการเล่น เช่น ระบบจะให้ลำดับความสำคัญสูงสุดแก่เสียงกริ่งในโหมดเฟดเอาต์เสมอจนกว่าจะเฟดเอาต์เสร็จสมบูรณ์

  2. ลำดับความสำคัญที่ระบุ

  3. หากเสียงกริ่งมีลำดับความสำคัญเท่ากันและเพิ่งกำหนดล่าสุด ระบบจะเล่นเสียงกริ่งนั้นก่อน

เมื่อเสียงกริ่งมีลำดับความสำคัญเท่ากัน ระบบจะสร้างอินสแตนซ์ 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 ด้วยค่าที่แปลงแล้ว

การออกแบบนี้มีการกำหนดค่าเริ่มต้นและช่วยให้การติดตั้งใช้งานในภายหลังลบล้างการแมปเริ่มต้นได้

โฟลว์เสียง HAR

รูปที่ 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 และการซิงโครไนซ์เป็นแบบภายในและไม่ได้แสดงใน AudioManager API

โมเดลการเป็นเจ้าของและ AudioManager

  • การโต้ตอบทั้งหมดของแอปกับระบบเสียงจะเกิดขึ้นผ่าน AudioManager หรือออบเจ็กต์ที่แสดงผลจาก AudioManager

  • AudioManager ปลอดภัยต่อเธรด

  • ระบบจะสร้างอินสแตนซ์ AudioManager เพียงครั้งเดียวในแอป HARry และ Moved เพื่อให้ Looper เป็นเจ้าของ

  • AudioManager ใช้โทเค็น tokio_util::CancellationToken เพื่อจัดการ เธรดการเล่นที่เริ่มแล้ว เพื่อให้แน่ใจว่าเธรดจะสิ้นสุดลงและ ทรัพยากรจะได้รับการเผยแพร่หาก AudioManager เป็น Dropped

  • AudioManager ไม่ได้ป้องกันไม่ให้มีการสร้างอินสแตนซ์หลายรายการอย่างชัดเจน หากมีอินสแตนซ์มากกว่า 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
  • เล่นเนื้อหาฟังก์ชันที่กำหนดเองซ้ำ
  • บันทึกเหตุการณ์การเล่น