OpenSL ES สำหรับ Android

หน้านี้มีรายละเอียดเกี่ยวกับวิธี การนำ OpenSL มาใช้ NDK ESTM แตกต่างจากข้อกำหนดอ้างอิงสำหรับ OpenSL ES 1.0.1 เมื่อใช้โค้ดตัวอย่างจาก คุณอาจต้องแก้ไขเพื่อให้ใช้งานได้กับ Android

ฟีเจอร์ทั้งหมดมีให้บริการใน Android 2.3 (API ระดับ 9) ขึ้นไป เว้นแต่จะระบุไว้เป็นอย่างอื่น ฟีเจอร์บางอย่างใช้ได้เฉพาะใน Android 4.0 (API ระดับ 14) ไว้

หมายเหตุ: เอกสารข้อกำหนดความเข้ากันได้ของ Android (CDD) จะแจกแจงฮาร์ดแวร์และซอฟต์แวร์ ข้อกำหนดของอุปกรณ์ Android ที่ใช้งานร่วมกันได้ โปรดดู ความเข้ากันได้กับ Android สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโปรแกรมความเข้ากันได้โดยรวม และ CDD สำหรับเอกสาร CDD จริง

OpenSL ES ต้องมี C อินเทอร์เฟซภาษาที่สามารถเข้าถึงได้โดยใช้ C++ โดยมีฟีเจอร์ที่คล้ายกับเสียง บางส่วนของ Android Java API เหล่านี้ ได้แก่

เช่นเดียวกับ Android Native Development Kit (NDK) ทั้งหมด วัตถุประสงค์หลักของ OpenSL ES เพื่อ Android มีส่วนช่วยในการเรียกไลบรารีที่ใช้ร่วมกันให้เรียกโดยใช้ Java Native อินเทอร์เฟซ (JNI ) NDK ไม่ได้มีไว้เพื่อเขียนแอปพลิเคชัน C/C++ เท่านั้น อย่างไรก็ตาม OpenSL ES เป็น API ที่มีฟีเจอร์ครบถ้วน และเราคาดหวังว่าคุณควรจะสามารถตอบสนองความต้องการด้านเสียงส่วนใหญ่ของคุณได้ โดยใช้เพียง API นี้ โดยไม่มีการเรียกโค้ดที่ทำงานในรันไทม์ของ Android

หมายเหตุ: แม้ว่า OpenSL ES แต่ API เสียง (เสียงประสิทธิภาพสูง) ใน Android นั้นไม่ใช่ การปฏิบัติตามโปรไฟล์ OpenSL ES 1.0.1 (เกม เพลง หรือโทรศัพท์) นั่นเป็นเพราะ Android ไม่ได้ใช้ฟีเจอร์ทั้งหมดที่โปรไฟล์ใดโปรไฟล์หนึ่งจำเป็นต้องใช้ กรณีใดๆ ที่ทราบ เมื่อ Android ทำงานต่างจากข้อมูลจำเพาะที่ได้อธิบายไว้ใน ส่วนขยาย Android

ฟีเจอร์ที่รับช่วงมาจากข้อกำหนดข้อมูลอ้างอิง

การติดตั้งใช้งาน OpenSL ES สำหรับ Android NDK นำเอาชุดฟีเจอร์ส่วนใหญ่มาจาก ข้อกำหนดการอ้างอิง โดยมีข้อจำกัดบางประการ

จุดแรกเข้าทั่วโลก

OpenSL ES สำหรับ Android รองรับจุดแรกเข้าทั่วโลกตามข้อกำหนดของ Android จุดแรกเข้าเหล่านี้ประกอบด้วย

  • slCreateEngine
  • slQueryNumSupportedEngineInterfaces
  • slQuerySupportedEngineInterfaces

ออบเจ็กต์และอินเทอร์เฟซ

ตารางต่อไปนี้แสดงออบเจ็กต์และอินเทอร์เฟซที่การติดตั้งใช้งาน Android NDK รองรับ OpenSL ES ถ้าใช่ปรากฏในเซลล์ แสดงว่าฟีเจอร์นั้นมีอยู่ใน การใช้งานของคุณ

รองรับ Android NDK สำหรับออบเจ็กต์และอินเทอร์เฟซ

ฟีเจอร์ โปรแกรมเล่นเสียง โปรแกรมบันทึกเสียง เครื่องยนต์ มิกซ์เอาต์พุต
เพิ่มเสียงเบส ใช่ ไม่ได้ ไม่ได้ ใช่
คิวบัฟเฟอร์ ใช่ ไม่ได้ ไม่ได้ ไม่
ตัวระบุตำแหน่งข้อมูลคิวบัฟเฟอร์ ใช่: แหล่งที่มา ไม่ ไม่ได้ ไม่
การจัดการอินเทอร์เฟซแบบไดนามิก ใช่ ได้ ได้ ใช่
ส่งเอฟเฟกต์ ใช่ ไม่ได้ ไม่ได้ ไม่
เครื่องยนต์ ไม่ ไม่ได้ ใช่ ไม่
เสียงก้องสภาพแวดล้อม ไม่ ไม่ได้ ไม่ได้ ใช่
อีควอไลเซอร์ ใช่ ไม่ได้ ไม่ได้ ใช่
ตัวระบุตำแหน่งข้อมูลอุปกรณ์ I/O ไม่ ใช่: แหล่งที่มา ไม่ ไม่
การดึงข้อมูลข้อมูลเมตา ใช่: ถอดรหัสเป็น PCM ไม่ ไม่ได้ ไม่
ปิดเสียงคนเดียว ใช่ ไม่ได้ ไม่ได้ ไม่
วัตถุ ใช่ ได้ ได้ ใช่
ตัวระบุตำแหน่งมิกซ์เอาต์พุต ใช่: ซิงก์ ไม่ ไม่ได้ ไม่
เล่น ใช่ ไม่ได้ ไม่ได้ ไม่
อัตราการเล่น ใช่ ไม่ได้ ไม่ได้ ไม่
สถานะการดึงข้อมูลล่วงหน้า ใช่ ไม่ได้ ไม่ได้ ไม่
เสียงก้องที่ตั้งล่วงหน้า ไม่ ไม่ได้ ไม่ได้ ใช่
บันทึก ไม่ ใช่ ไม่ได้ ไม่
ค้นหา ใช่ ไม่ได้ ไม่ได้ ไม่
ตัวระบุตำแหน่งข้อมูล URI ใช่: แหล่งที่มา ไม่ ไม่ได้ ไม่
เวอร์ชวลไลเซอร์ ใช่ ไม่ได้ ไม่ได้ ใช่
ระดับเสียง ใช่ ไม่ได้ ไม่ได้ ไม่

ส่วนถัดไปจะอธิบายข้อจำกัดของฟีเจอร์เหล่านี้

ข้อจำกัด

ฟีเจอร์ในตารางที่ 1 มีข้อจำกัดบางประการ ข้อจำกัดเหล่านี้ แสดงถึงความแตกต่างจากข้อกำหนดอ้างอิง เนื้อหาที่เหลือของส่วนนี้ ข้อมูลเกี่ยวกับความแตกต่างเหล่านี้

การจัดการอินเทอร์เฟซแบบไดนามิก

OpenSL ES สำหรับ Android ไม่รองรับ RemoveInterface หรือ ResumeInterface

การรวมเอฟเฟกต์: Reverb สภาพแวดล้อมและ Reverb ที่กำหนดล่วงหน้า

คุณไม่สามารถมีทั้ง Reverb สภาพแวดล้อมและ Reverb ที่กำหนดล่วงหน้าในมิกซ์เอาต์พุตเดียวกัน

แพลตฟอร์มอาจไม่สนใจคำขอเอฟเฟกต์หากมีการประมาณว่า ภาระงานของ CPU จะสูงเกินไป

ส่งเอฟเฟกต์

SetSendLevel() รองรับระดับการส่งเดียวต่อโปรแกรมเล่นเสียง

เสียงก้องสภาพแวดล้อม

Reverb สภาพแวดล้อมไม่รองรับ reflectionsDelay reflectionsLevel หรือ reverbDelay ฟิลด์ของ โครงสร้าง SLEnvironmentalReverbSettings

รูปแบบข้อมูล MIME

คุณสามารถใช้รูปแบบข้อมูล MIME ได้เฉพาะกับตัวระบุตำแหน่งข้อมูล URI และสำหรับเสียงเท่านั้น โปรแกรมเล่นวิดีโอ คุณไม่สามารถใช้รูปแบบข้อมูลนี้สำหรับโปรแกรมอัดเสียง

คุณต้องเริ่มต้น mimeType ก่อนจึงจะใช้งาน OpenSL ES ได้สำหรับ Android NULL หรือสตริง UTF-8 ที่ถูกต้อง คุณต้องเริ่มต้น containerType เป็นค่าที่ถูกต้อง ในกรณีที่ไม่มีข้อควรพิจารณาอื่นๆ เช่น ความสามารถในการย้ายไปยัง การใช้งานหรือรูปแบบเนื้อหาที่แอประบุด้วยส่วนหัวไม่ได้ เราขอแนะนำให้คุณ ตั้งค่า mimeType เป็น NULL และ containerType ไปยัง SL_CONTAINERTYPE_UNSPECIFIED

OpenSL ES สำหรับ Android สนับสนุนรูปแบบเสียงต่อไปนี้ ตราบใดที่ นอกจากนี้ แพลตฟอร์ม Android ยังรองรับฟีเจอร์เหล่านี้ด้วย

  • WAV PCM
  • มาตรฐาน WAV
  • ว่าไงนะ
  • MP3 Ogg Vorbis
  • AAC LC
  • HE-AACv1 (AAC+)
  • HE-AACv2 (AAC ที่ปรับปรุงใหม่)
  • AMR
  • FLAC

หมายเหตุ: สำหรับรายการรูปแบบเสียงที่ Android สนับสนุน โปรดดู รูปแบบสื่อที่รองรับ

การจัดการวิดีโอเหล่านี้และรูปแบบอื่นๆ ใน การใช้งาน OpenSL ES:

  • AAC รูปแบบต้องอยู่ในคอนเทนเนอร์ MP4 หรือ ADTS
  • OpenSL ES สำหรับ Android ไม่รองรับ MIDI
  • WMA ไม่ได้เป็นส่วนหนึ่งของ AOSP และเรา ยังไม่ได้ยืนยันความเข้ากันได้กับ OpenSL ES สำหรับ Android
  • การใช้ OpenSL ES สำหรับ Android NDK ไม่สนับสนุนการเข้าชมโดยตรง การเล่น DRM หรือเนื้อหาที่เข้ารหัส หากต้องการเล่นเนื้อหาเสียงที่ได้รับการคุ้มครอง คุณต้องทำดังนี้ ถอดรหัสในแอปพลิเคชันของคุณก่อนเล่น โดยแอปของคุณบังคับใช้ DRM ข้อจำกัด

OpenSL ES สำหรับ Android ไม่รองรับวิธีการต่อไปนี้ในการจัดการออบเจ็กต์

  • Resume()
  • RegisterCallback()
  • AbortAsyncOperation()
  • SetPriority()
  • GetPriority()
  • SetLossOfControlInterfaces()

รูปแบบข้อมูล PCM

PCM เป็นรูปแบบข้อมูลเดียวที่คุณใช้กับคิวบัฟเฟอร์ได้ PCM ที่รองรับ การกำหนดค่าการเล่นมีลักษณะดังต่อไปนี้

  • ไม่มีลายเซ็น 8 บิต หรือแบบมีลายเซ็น 16 บิต
  • โมโนหรือสเตอริโอ
  • การจัดลำดับไบต์ของ Little-endian
  • อัตราการสุ่มตัวอย่าง:
    • 8,000 Hz
    • 11,025 Hz
    • 12,000 Hz
    • 16,000 Hz
    • 22,050 Hz
    • 24,000 Hz
    • 32,000 Hz
    • 44,100 Hz
    • 48,000 Hz

การกำหนดค่าที่ OpenSL ES สำหรับ Android รองรับสำหรับการบันทึกมีดังนี้ ขึ้นอยู่กับอุปกรณ์ โดยปกติจะมีสัญญาณโมโน/16 บิตแบบ 16,000 Hz จะมีให้บริการไม่ว่าจะใช้อุปกรณ์ใด

ค่าของช่อง samplesPerSec มีหน่วยเป็นมิลลิวินาที แม้จะมีข้อมูลที่ทำให้เข้าใจผิด ชื่อ เพื่อหลีกเลี่ยงการใช้ค่าที่ไม่ถูกต้องโดยไม่ได้ตั้งใจ เราขอแนะนำให้คุณเริ่มต้นฟิลด์นี้โดยใช้ หนึ่งในค่าคงที่เชิงสัญลักษณ์ที่กำหนดไว้สำหรับวัตถุประสงค์นี้ เช่น SL_SAMPLINGRATE_44_1

การรองรับ Android 5.0 (API ระดับ 21) ขึ้นไป ข้อมูลจุดลอยตัว

อัตราการเล่น

อัตราการเล่น OpenSL ES แสดงถึงความเร็วที่ นำเสนอข้อมูลซึ่งแสดงด้วยความเร็วปกตินับพันหรือต่อการแสดงผล 1,000 ครั้ง ตัวอย่างเช่น อัตราการเล่น 1,000 ครั้งต่อการแสดงผล 1,000 ครั้งคือ 1,000/1, 000 หรือความเร็วปกติ ช่วงอัตรา คือช่วงเวลาปิดซึ่งแสดงช่วงอัตราการเล่นที่เป็นไปได้

การรองรับช่วงอัตราการเล่นและความสามารถอื่นๆ อาจแตกต่างกันออกไป เกี่ยวกับเวอร์ชันแพลตฟอร์มและการใช้งาน แอปของคุณจะกำหนดความสามารถเหล่านี้ขณะรันไทม์ได้โดย โดยใช้ PlaybackRate::GetRateRange() หรือ PlaybackRate::GetCapabilitiesOfRate() เพื่อค้นหาอุปกรณ์

โดยทั่วไปอุปกรณ์รองรับช่วงอัตราเดียวกันสำหรับแหล่งข้อมูลในรูปแบบ PCM และอัตราความเป็นหนึ่งเดียวกัน 1,000 ต่อ 1,000 ถึง 1,000 ต่อ 1,000 สำหรับรูปแบบอื่นๆ นั่นคือช่วงอัตราความสามัคคีคือ เพียงค่าเดียวที่มีประสิทธิภาพ

บันทึก

OpenSL ES สำหรับ Android ไม่รองรับ SL_RECORDEVENT_HEADATLIMIT หรือ SL_RECORDEVENT_HEADMOVING กิจกรรม

ค้นหา

เมธอด SetLoop() เปิดใช้การวนซ้ำทั้งไฟล์ หากต้องการเปิดใช้การวนซ้ำ ตั้งค่าพารามิเตอร์ startPos เป็น 0 และพารามิเตอร์ endPos ไปยัง SL_TIME_UNKNOWN

ตัวระบุตำแหน่งข้อมูลคิวบัฟเฟอร์

โปรแกรมเล่นหรือเครื่องบันทึกเสียงที่มีตัวระบุตำแหน่งข้อมูลสำหรับคิวบัฟเฟอร์รองรับรูปแบบข้อมูล PCM เท่านั้น

ตัวระบุตำแหน่งข้อมูลอุปกรณ์ I/O

OpenSL ES สำหรับ Android รองรับการใช้ตัวระบุตำแหน่งข้อมูลอุปกรณ์ I/O เฉพาะเมื่อคุณมี ระบุตัวระบุตำแหน่งเป็นแหล่งข้อมูลสำหรับ Engine::CreateAudioRecorder() เริ่มต้นตัวระบุตำแหน่งข้อมูลอุปกรณ์โดยใช้ค่าที่มีอยู่ในข้อมูลโค้ดต่อไปนี้

SLDataLocator_IODevice loc_dev =
  {SL_DATALOCATOR_IODEVICE, SL_IODEVICE_AUDIOINPUT,
  SL_DEFAULTDEVICEID_AUDIOINPUT, NULL};

ตัวระบุตำแหน่งข้อมูล URI

OpenSL ES สำหรับ Android สามารถใช้เครื่องระบุตำแหน่งข้อมูล URI ที่มีรูปแบบข้อมูล MIME เท่านั้น และสำหรับโปรแกรมเล่นเสียงเท่านั้น คุณใช้ตัวระบุข้อมูล URI สำหรับโปรแกรมอัดเสียงไม่ได้ URI ใช้ได้เฉพาะ ใช้รูปแบบ http: และ file: รูปแบบอื่นๆ เช่น https: ftp: หรือ ไม่อนุญาตให้ใช้ content:

เรายังไม่ยืนยันการรองรับ rtsp: ที่มีเสียงบนแพลตฟอร์ม Android

โครงสร้างข้อมูล

Android รองรับโครงสร้างข้อมูล OpenSL ES 1.0.1 ดังต่อไปนี้

  • SLDataFormat_MIME
  • SLDataFormat_PCM
  • SLDataLocator_BufferQueue
  • SLDataLocator_IODevice
  • SLDataLocator_OutputMix
  • SLDataLocator_URI
  • SLDataSink
  • SLDataSource
  • SLEngineOption
  • SLEnvironmentalReverbSettings
  • SLInterfaceID

การกำหนดค่าแพลตฟอร์ม

OpenSL ES for Android ได้รับการออกแบบมาสำหรับแอปพลิเคชันแบบหลายชุดข้อความและเหมาะสำหรับเทรด รองรับ เครื่องมือเดี่ยวต่อแอปพลิเคชัน และมีออบเจ็กต์ได้สูงสุด 32 ออบเจ็กต์ต่อเครื่องมือ หน่วยความจำและ CPU ของอุปกรณ์ที่ใช้งานได้อาจ จำกัดจำนวนออบเจ็กต์ที่ใช้ได้

ระบบจะรู้จักตัวเลือกเครื่องมือค้นหาเหล่านี้ แต่ slCreateEngine จะไม่สนใจตัวเลือกดังกล่าว:

  • SL_ENGINEOPTION_THREADSAFE
  • SL_ENGINEOPTION_LOSSOFCONTROL

OpenMAX AL และ OpenSL ES สามารถใช้ร่วมกันในแอปพลิเคชันเดียวกันได้ ในกรณีนี้ มี ออบเจ็กต์เครื่องมือที่ใช้ร่วมกันรายการเดียวภายใน และมีการแชร์ขีดจำกัดออบเจ็กต์ที่ 32 ระหว่าง OpenMAX AL และ OpenSL ES แอปพลิเคชันควรสร้างเครื่องมือทั้งสอง ใช้เครื่องมือทั้งสอง และสุดท้าย ทำลายเครื่องมือทั้งสอง การใช้งานจะรักษาจำนวนการอ้างอิงในเครื่องมือที่แชร์ไว้เพื่อให้ แท็กจะถูกทำลายอย่างถูกต้องในระหว่างการดำเนินการทำลายครั้งที่สอง

หมายเหตุการจัดโปรแกรม

หมายเหตุเกี่ยวกับการเขียนโปรแกรม OpenSL ES ให้ข้อมูลเสริมเพื่อให้แน่ใจว่ามีการใช้งาน OpenSL ES อย่างเหมาะสม

หมายเหตุ: เพื่อความสะดวกของคุณ เราได้รวมสำเนาของข้อกำหนด OpenSL ES 1.0.1 พร้อม NDK ไว้ใน docs/opensles/OpenSL_ES_Specification_1.0.1.pdf

ปัญหาเกี่ยวกับแพลตฟอร์ม

ส่วนนี้จะอธิบายปัญหาที่ทราบของแพลตฟอร์มรุ่นแรกที่รองรับ API เหล่านี้

การจัดการอินเทอร์เฟซแบบไดนามิก

DynamicInterfaceManagement::AddInterface ไม่ทำงาน แต่ให้ระบุอินเทอร์เฟซใน อาร์เรย์ที่ส่งไปยัง Create() ดังที่แสดงในโค้ดตัวอย่าง Reverb สภาพแวดล้อม

วางแผนสำหรับ OpenSL ES เวอร์ชันในอนาคต

API เสียงประสิทธิภาพสูงของ Android นั้นอิงตาม Khronos Group OpenSL ES 1.0.1 Khronos ได้เผยแพร่มาตรฐานเวอร์ชัน 1.1 ที่แก้ไขแล้ว ฉบับแก้ไขประกอบด้วยฟีเจอร์ใหม่ การชี้แจง การแก้ไขข้อผิดพลาดในการพิมพ์ และ บางอย่างเข้ากันไม่ได้ ความไม่เข้ากันที่คาดไว้ส่วนใหญ่จะอยู่ในระดับที่น้อยมากหรืออยู่ใน พื้นที่ของ OpenSL ES ที่ไม่รองรับโดย Android

แอปพลิเคชัน ที่พัฒนาด้วยเวอร์ชันนี้ควรใช้งานได้บนแพลตฟอร์ม Android เวอร์ชันต่อๆ ไป หาก คุณต้องปฏิบัติตามหลักเกณฑ์ที่ระบุไว้ในแผนสำหรับไบนารี ความเข้ากันได้ที่ด้านล่าง

หมายเหตุ: ความเข้ากันได้กับแหล่งที่มาในอนาคตไม่ใช่เป้าหมาย กล่าวคือ หากคุณอัปเกรดเป็น NDK เวอร์ชันที่ใหม่กว่า คุณอาจต้องแก้ไขซอร์สโค้ดของแอปพลิเคชันของคุณให้สอดคล้องกับ API ใหม่ เราคาดว่า การเปลี่ยนแปลงดังกล่าวจะมีเพียงเล็กน้อย โปรดดูรายละเอียดด้านล่าง

วางแผนความเข้ากันได้กับไบนารี

เราขอแนะนำให้แอปพลิเคชันของคุณปฏิบัติตามหลักเกณฑ์เหล่านี้เพื่อปรับปรุงความเข้ากันได้ของไบนารีในอนาคต

  • ใช้เฉพาะชุดย่อยของฟีเจอร์ที่รองรับ Android จาก OpenSL ES 1.0.1
  • อย่าอ้างอิงรหัสผลลัพธ์บางรายการสำหรับการดำเนินการที่ไม่สำเร็จ เตรียมตัวรับมือกับ ด้วยรหัสผลลัพธ์อื่น
  • โดยทั่วไปตัวแฮนเดิล Callback ของแอปพลิเคชันจะทำงานในบริบทที่มีการจำกัด ควรเขียน ทำงานให้เสร็จอย่างรวดเร็ว แล้วกลับมาใหม่โดยเร็วที่สุด อย่าเรียกใช้การดำเนินการที่ซับซ้อน ภายในเครื่องจัดการ Callback ตัวอย่างเช่น ภายในการเรียกกลับการเสร็จสิ้นคิวบัฟเฟอร์ คุณสามารถ จัดคิวบัฟเฟอร์อื่น แต่อย่าสร้างโปรแกรมเล่นเสียง
  • ตัวแฮนเดิล Callback ควรเตรียมให้มีการเรียกบ่อยขึ้นหรือน้อยลงเพื่อรับ ประเภทเหตุการณ์เพิ่มเติม และควรละเว้นประเภทเหตุการณ์ที่ไม่รู้จัก Callback ที่ มีการกำหนดค่าด้วยมาสก์เหตุการณ์ที่สร้างขึ้นจากประเภทเหตุการณ์ที่เปิดใช้ ซึ่งควรเตรียมพร้อมที่จะเรียกใช้ ที่มีการตั้งค่าบิตเหตุการณ์หลายประเภทพร้อมกัน ใช้ "&" เพื่อทดสอบแต่ละบิตของเหตุการณ์ เคสสวิตช์
  • ใช้สถานะการดึงข้อมูลล่วงหน้าและการเรียกกลับเป็นสัญญาณทั่วไปเกี่ยวกับความคืบหน้า แต่ต้องไม่ขึ้นอยู่กับ ระดับการเติมเต็มหรือลำดับการเรียกกลับที่เฉพาะเจาะจง ความหมายของการเติมสถานะการดึงข้อมูลล่วงหน้า และลักษณะการทำงานสำหรับข้อผิดพลาดที่ตรวจพบระหว่างการดึงข้อมูลล่วงหน้าอาจเปลี่ยนแปลงได้

หมายเหตุ: ดู ลักษณะการทำงานของคิวบัฟเฟอร์ ด้านล่างเพื่อดูรายละเอียดเพิ่มเติม

แผนสำหรับความเข้ากันได้ของแหล่งที่มา

ดังที่กล่าวไปแล้ว ความไม่เข้ากันของซอร์สโค้ดเป็นสิ่งที่คาดว่าจะเกิดขึ้นใน OpenSL ES เวอร์ชันถัดไป Khronos Group สิ่งที่น่าจะทำให้เกิดการเปลี่ยนแปลงมีดังนี้

  • อินเทอร์เฟซคิวบัฟเฟอร์น่าจะมีการเปลี่ยนแปลงที่สำคัญ โดยเฉพาะในพื้นที่ ของ BufferQueue::Enqueue รายการพารามิเตอร์สำหรับ slBufferQueueCallback และ ชื่อฟิลด์ SLBufferQueueState.playIndex เราขอแนะนำให้ใช้โค้ดของแอปพลิเคชัน คิวบัฟเฟอร์อย่างง่ายของ Android แทน ในตัวอย่าง โค้ดที่มาพร้อมกับ NDK เราได้ใช้คิวบัฟเฟอร์อย่างง่ายของ Android สำหรับการเล่น ด้วยเหตุผลนี้ (เรายังใช้คิวบัฟเฟอร์อย่างง่ายของ Android สำหรับบันทึกและถอดรหัสไปยัง PCM ด้วย แต่ เนื่องจาก OpenSL ES 1.0.1 มาตรฐานไม่รองรับการบันทึกหรือถอดรหัสไปยังข้อมูลคิวบัฟเฟอร์ ซิงก์)
  • จะมีการเพิ่ม const ลงในพารามิเตอร์อินพุตที่ส่งผ่านโดยการอ้างอิง และ ฟิลด์โครงสร้าง SLchar * ที่ใช้เป็นค่าอินพุต ไม่จำเป็นต้องทำการเปลี่ยนแปลงใดๆ โค้ดของคุณ
  • จะมีการแทนที่ประเภทที่ไม่ได้ลงนามสำหรับพารามิเตอร์บางรายการที่มีการรับรองอยู่ในขณะนี้ คุณอาจต้องเปลี่ยนประเภทพารามิเตอร์จาก SLint32 เป็น SLuint32 หรือที่คล้ายกัน หรือ เพิ่มนักแสดง
  • Equalizer::GetPresetName จะคัดลอกสตริงไปยังหน่วยความจำของแอปพลิเคชันแทนที่จะส่งคืน ตัวชี้ไปยังหน่วยความจำการใช้งาน นี่เป็นการเปลี่ยนแปลงที่สำคัญ เราจึงขอแนะนำให้คุณ หลีกเลี่ยงการเรียกใช้วิธีนี้ หรือแยกการใช้งานของคุณ
  • จะมีช่องอื่นๆ อีกในประเภทโครงสร้าง สำหรับพารามิเตอร์เอาต์พุต ช่องใหม่เหล่านี้ แต่สำหรับพารามิเตอร์อินพุต ฟิลด์ใหม่จะต้องเริ่มต้น โชคดี ช่องทั้งหมดนี้อยู่ในพื้นที่ที่ Android ไม่รองรับ
  • อินเทอร์เฟซ GUID จะเปลี่ยนแปลง โปรดดูอินเทอร์เฟซตามชื่อสัญลักษณ์ แทน GUID เพื่อหลีกเลี่ยง การพึ่งพา
  • SLchar จะเปลี่ยนจาก unsigned char เป็น char ซึ่งหลักๆ แล้ว ตัวระบุตำแหน่งข้อมูล URI และรูปแบบข้อมูล MIME
  • SLDataFormat_MIME.mimeType จะเปลี่ยนชื่อเป็น pMimeType และ SLDataLocator_URI.URI จะเปลี่ยนชื่อเป็น pURI เราขอแนะนำให้คุณเริ่มต้น โครงสร้างข้อมูล SLDataFormat_MIME และ SLDataLocator_URI โดยใช้ รายการที่คั่นด้วยเครื่องหมายคอมมาและคั่นค่าด้วยเครื่องหมายจุลภาค แทนที่จะเป็นชื่อช่อง เพื่อแยกโค้ดของคุณ ออกจากการเปลี่ยนแปลงนี้ เราใช้เทคนิคนี้ในโค้ดตัวอย่าง
  • SL_DATAFORMAT_PCM ไม่อนุญาตให้แอปพลิเคชันระบุตัวแทนของ ข้อมูลเป็นจำนวนเต็มแบบมีเครื่องหมาย จำนวนเต็มที่ไม่มีเครื่องหมาย หรือจุดทศนิยม การใช้งาน Android จะถือว่าข้อมูล 8 บิตเป็นจํานวนเต็มที่ไม่มีเครื่องหมาย และ 16 บิตคือจํานวนเต็มที่มีเครื่องหมาย นอกจากนี้ ฟิลด์ samplesPerSec เป็นชื่อที่ผิดเพี้ยนไปเนื่องจากหน่วยจริงเป็นมิลลิวินาที ปัญหาเหล่านี้เป็นเรื่องปกติ ใน OpenSL ES เวอร์ชันถัดไป ซึ่งจะเริ่มใช้ข้อมูล PCM แบบขยายใหม่ ที่อนุญาตให้แอปพลิเคชันระบุการเป็นตัวแทนอย่างชัดเจนและแก้ไข ชื่อช่อง เนื่องจากนี่เป็นรูปแบบข้อมูลใหม่ และข้อมูล PCM ในปัจจุบันจะยังคง ใช้งานได้ (แม้จะเลิกใช้งานแล้ว) คุณจึงไม่จำเป็นต้องเปลี่ยนแปลงโค้ดโดยทันที