คำเตือน: OpenSL ES เลิกใช้งานแล้ว นักพัฒนาซอฟต์แวร์ควรใช้ไลบรารี Oboe แบบโอเพนซอร์สซึ่งมีอยู่ใน GitHub โอโบเป็น Wrapper ของ C++ ที่มี API คล้ายกับ AAudio โอโบจะเรียก AAudio เมื่อ AAudio สามารถใช้ได้ และจะกลับไปใช้ OpenSL ES ในกรณีที่ AAudio ไม่พร้อมใช้งาน
หน้านี้จะให้รายละเอียดเกี่ยวกับความแตกต่างระหว่างการใช้งาน OpenSL ES™ ใน NDK กับข้อกำหนดอ้างอิงสำหรับ 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++ ด้วย โดยจะแสดงฟีเจอร์ที่คล้ายกับส่วนเสียงของ API Java ของ Android ต่อไปนี้
เช่นเดียวกับ Android Native Development Kit (NDK) ทั้งหมด วัตถุประสงค์หลักของ OpenSL ES สำหรับ Android คือเพื่ออำนวยความสะดวกในการใช้งานไลบรารีที่แชร์ซึ่งจะเรียกใช้โดยใช้ Java Native Interface (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 ซึ่งได้แก่
slCreateEngineslQueryNumSupportedEngineInterfacesslQuerySupportedEngineInterfaces
วัตถุและอินเทอร์เฟซ
ตารางต่อไปนี้แสดงออบเจ็กต์และอินเทอร์เฟซที่การใช้งาน OpenSL ES ของ Android NDK รองรับ หากมีคำว่า Yes ปรากฏในเซลล์ แสดงว่าฟีเจอร์พร้อมใช้งานในการใช้งานนี้
การรองรับออบเจ็กต์และอินเทอร์เฟซของ Android NDK
| ฟีเจอร์ | โปรแกรมเล่นเสียง | โปรแกรมบันทึกเสียง | เครื่องยนต์ | ส่วนผสมของเอาต์พุต |
|---|---|---|---|---|
| เพิ่มเสียงเบส | ใช่ | ไม่ได้ | ไม่ได้ | ใช่ |
| คิวบัฟเฟอร์ | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
| ตัวระบุตำแหน่งข้อมูลคิวบัฟเฟอร์ | ใช่: แหล่งที่มา | ไม่ | ไม่ได้ | ไม่ |
| การจัดการอินเทอร์เฟซแบบไดนามิก | ใช่ | ได้ | ได้ | ใช่ |
| ส่งเอฟเฟกต์ | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
| เครื่องยนต์ | ไม่ | ไม่ได้ | ใช่ | ไม่ |
| Reverb สภาพแวดล้อม | ไม่ | ไม่ได้ | ไม่ได้ | ใช่ |
| อีควอไลเซอร์ | ใช่ | ไม่ได้ | ไม่ได้ | ใช่ |
| ตัวระบุตำแหน่งข้อมูลอุปกรณ์ I/O | ไม่ | ใช่: แหล่งที่มา | ไม่ | ไม่ |
| การดึงข้อมูลเมตา | ใช่: ถอดรหัสเป็น PCM | ไม่ | ไม่ได้ | ไม่ |
| ปิดเสียงโซโล | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
| วัตถุ | ใช่ | ได้ | ได้ | ใช่ |
| ตัวระบุตำแหน่งมิกซ์เอาต์พุต | ใช่: อ่างล้างหน้า | ไม่ | ไม่ได้ | ไม่ |
| เล่น | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
| อัตราการเล่น | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
| สถานะการดึงข้อมูลล่วงหน้า | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
| เสียงก้องที่ตั้งล่วงหน้า | ไม่ | ไม่ได้ | ไม่ได้ | ใช่ |
| บันทึก | ไม่ | ใช่ | ไม่ได้ | ไม่ |
| ค้นหา | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
| ตัวระบุตำแหน่งข้อมูล URI | ใช่: แหล่งที่มา | ไม่ | ไม่ได้ | ไม่ |
| เวอร์ชวลไลเซอร์ | ใช่ | ไม่ได้ | ไม่ได้ | ใช่ |
| ระดับเสียง | ใช่ | ไม่ได้ | ไม่ได้ | ไม่ |
ส่วนถัดไปจะอธิบายข้อจํากัดของฟีเจอร์บางอย่างเหล่านี้
ข้อจำกัด
ฟีเจอร์ในตารางที่ 1 มีข้อจํากัดบางประการ ข้อจำกัดเหล่านี้แสดงถึงความแตกต่างจากข้อกำหนดอ้างอิง ส่วนที่เหลือของส่วนนี้จะให้ข้อมูลเกี่ยวกับความแตกต่างเหล่านี้
การจัดการอินเทอร์เฟซแบบไดนามิก
OpenSL ES สำหรับ Android ไม่รองรับ RemoveInterface หรือ
ResumeInterface
การรวมเอฟเฟกต์: Reverb สภาพแวดล้อมและ Reverb ที่กำหนดล่วงหน้า
คุณไม่สามารถใช้ทั้งเสียงสะท้อนจากสภาพแวดล้อมและเสียงสะท้อนที่กำหนดล่วงหน้าในมิกซ์เอาต์พุตเดียวกัน
แพลตฟอร์มอาจไม่สนใจคำขอเอฟเฟกต์หากคาดว่าการโหลด CPU จะสูงเกินไป
ส่งเอฟเฟกต์
SetSendLevel() รองรับระดับการส่งระดับเดียวต่อโปรแกรมเล่นเสียง
Reverb สภาพแวดล้อม
Reverb สภาพแวดล้อมไม่รองรับฟิลด์ reflectionsDelay,
reflectionsLevel หรือ reverbDelay ของ SLEnvironmentalReverbSettings
รูปแบบข้อมูล MIME
คุณสามารถใช้รูปแบบข้อมูล MIME ได้เฉพาะกับตัวระบุตำแหน่งข้อมูล URI และกับโปรแกรมเล่นเสียงเท่านั้น คุณใช้รูปแบบข้อมูลนี้กับเครื่องบันทึกเสียงไม่ได้
หากต้องการใช้ OpenSL ES สำหรับ Android คุณต้องเริ่มต้น mimeType เป็น NULL หรือสตริง UTF-8 ที่ถูกต้อง นอกจากนี้ คุณยังต้องเริ่มต้นค่า containerType เป็นค่าที่ถูกต้องด้วย
หากไม่มีข้อพิจารณาอื่นๆ เช่น ความสามารถในการย้ายไปยังการใช้งานรูปแบบอื่นๆ หรือรูปแบบเนื้อหาที่แอประบุด้วยส่วนหัวไม่ได้ เราขอแนะนำให้คุณตั้งค่า mimeType เป็น NULL และ containerType เป็น SL_CONTAINERTYPE_UNSPECIFIED
OpenSL ES สำหรับ Android รองรับรูปแบบเสียงต่อไปนี้ ตราบใดที่แพลตฟอร์ม Android รองรับรูปแบบดังกล่าวด้วย
- WAV PCM
- รูปแบบ WAV
- WAV ulaw
- 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,000 Hz โมโน/16 บิตแบบลงนามจะใช้ได้กับทุกอุปกรณ์
ค่าของช่อง samplesPerSec มีหน่วยเป็นมิลลิวินาที แม้จะมีชื่อที่ทำให้เข้าใจผิด เราขอแนะนําให้คุณเริ่มต้นค่านี้โดยใช้ค่าคงที่เชิงสัญลักษณ์ที่กําหนดไว้สําหรับวัตถุประสงค์นี้ เช่น SL_SAMPLINGRATE_44_1 เพื่อหลีกเลี่ยงการใช้ค่าที่ไม่ถูกต้องโดยไม่ตั้งใจ
Android 5.0 (API ระดับ 21) ขึ้นไปรองรับข้อมูลทศนิยม
อัตราการเล่น
อัตราการเล่นของ OpenSL ES บ่งบอกถึงความเร็วที่ออบเจ็กต์แสดงข้อมูล ซึ่งแสดงเป็นพันของความเร็วปกติหรือต่อพัน เช่น อัตราการเล่น 1,000 ต่อ 1,000 คือ 1,000/1,000 หรือความเร็วปกติ ช่วงอัตราคือช่วงเวลาที่ปิดซึ่งแสดงช่วงของอัตราการเล่นที่เป็นไปได้
การรองรับช่วงอัตราการเล่นและความสามารถอื่นๆ อาจแตกต่างกันไปตามเวอร์ชันของแพลตฟอร์มและการใช้งาน แอปสามารถระบุความสามารถเหล่านี้ได้เมื่อรันไทม์โดยใช้ PlaybackRate::GetRateRange() หรือ PlaybackRate::GetCapabilitiesOfRate() เพื่อค้นหาอุปกรณ์
โดยทั่วไป อุปกรณ์จะรองรับช่วงอัตราเดียวกันสำหรับแหล่งข้อมูลในรูปแบบ PCM และช่วงอัตราส่วน 1, 000 ต่อ 1, 000 สำหรับรูปแบบอื่นๆ กล่าวคือ ช่วงอัตราส่วน 1:1 มีค่าเดียว
บันทึก
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_MIMESLDataFormat_PCMSLDataLocator_BufferQueueSLDataLocator_IODeviceSLDataLocator_OutputMixSLDataLocator_URISLDataSinkSLDataSourceSLEngineOptionSLEnvironmentalReverbSettingsSLInterfaceID
การกําหนดค่าแพลตฟอร์ม
OpenSL ES สำหรับ Android ออกแบบมาสำหรับแอปพลิเคชันแบบหลายเธรดและเป็นแบบเธรดเซฟ โดยรองรับเครื่องยนต์ 1 เครื่องต่อแอปพลิเคชันและออบเจ็กต์สูงสุด 32 รายการต่อเครื่องยนต์ หน่วยความจำและ CPU ของอุปกรณ์ที่ใช้ได้อาจจำกัดจำนวนออบเจ็กต์ที่ใช้ได้เพิ่มเติม
slCreateEngine จะจดจำตัวเลือกเครื่องมือค้นหาต่อไปนี้ แต่จะละเว้น
SL_ENGINEOPTION_THREADSAFESL_ENGINEOPTION_LOSSOFCONTROL
คุณใช้ OpenMAX AL และ OpenSL ES ร่วมกันในแอปพลิเคชันเดียวกันได้ ในกรณีนี้ จะมีออบเจ็กต์เครื่องยนต์ที่แชร์เพียงรายการเดียวภายใน และขีดจำกัดออบเจ็กต์ 32 รายการจะแชร์กันระหว่าง OpenMAX AL และ OpenSL ES แอปพลิเคชันควรสร้างทั้ง 2 โปรแกรม ใช้ทั้ง 2 โปรแกรม และสุดท้ายก็ทำลายทั้ง 2 โปรแกรม การใช้งานจะเก็บจํานวนการอ้างอิงในเครื่องมือที่แชร์ไว้เพื่อให้ระบบทำลายเครื่องมือได้อย่างถูกต้องในระหว่างการดำเนินการทำลายครั้งที่ 2
หมายเหตุการเขียนโปรแกรม
หมายเหตุการเขียนโปรแกรม 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 เช่น ภายในการเรียกกลับเมื่อคิวบัฟเฟอร์เสร็จสมบูรณ์ คุณสามารถจัดคิวบัฟเฟอร์อื่นได้ แต่ไม่สร้างโปรแกรมเล่นเสียง
- แฮนเดิลการเรียกกลับควรเตรียมพร้อมที่จะเรียกใช้บ่อยหรือน้อย เพื่อรับประเภทเหตุการณ์เพิ่มเติม และควรละเว้นประเภทเหตุการณ์ที่ไม่รู้จัก แบ็กคอลที่กําหนดค่าด้วยมาสก์เหตุการณ์ที่สร้างขึ้นจากประเภทเหตุการณ์ที่เปิดใช้ควรเตรียมพร้อมที่จะเรียกใช้โดยมีการกําหนดบิตประเภทเหตุการณ์หลายรายการพร้อมกัน ใช้ "&" เพื่อทดสอบแต่ละบิตเหตุการณ์แทนที่จะใช้สวิตช์เคส
- ใช้สถานะการอ่านล่วงหน้าและการเรียกกลับเพื่อบ่งบอกความคืบหน้าโดยทั่วไป แต่อย่าขึ้นอยู่กับระดับการบรรจุหรือลําดับการเรียกกลับที่เขียนมาอย่างเจาะจง ความหมายของระดับการกรอกสถานะการเรียกข้อมูลล่วงหน้าและลักษณะการทํางานของข้อผิดพลาดที่ตรวจพบระหว่างการเรียกข้อมูลล่วงหน้าอาจเปลี่ยนแปลงได้
หมายเหตุ: ดูรายละเอียดเพิ่มเติมได้ที่ส่วนลักษณะการทำงานของคิวบัฟเฟอร์ด้านล่าง
วางแผนสําหรับความเข้ากันได้ของแหล่งที่มา
ดังที่ได้กล่าวไว้ก่อนหน้านี้ คาดว่า OpenSL ES เวอร์ชันถัดไปจากกลุ่ม Khronos จะใช้งานซอร์สโค้ดร่วมกันไม่ได้ สิ่งที่มีแนวโน้มจะเปลี่ยนแปลงมีดังนี้
- อินเทอร์เฟซคิวบัฟเฟอร์คาดว่าจะมีการเปลี่ยนแปลงที่สำคัญ โดยเฉพาะในส่วน
BufferQueue::Enqueue, รายการพารามิเตอร์สําหรับslBufferQueueCallbackและชื่อช่องSLBufferQueueState.playIndexเราขอแนะนำให้โค้ดของแอปพลิเคชันใช้คิวบัฟเฟอร์อย่างง่ายของ Android แทน ในตัวอย่างโค้ดที่มาพร้อมกับ NDK เราใช้คิวบัฟเฟอร์แบบง่ายของ Android สำหรับการเล่นด้วยเหตุผลนี้ (เรายังใช้คิวบัฟเฟอร์แบบง่ายของ Android สำหรับการบันทึกและการถอดรหัสเป็น PCM ด้วย แต่นั่นเป็นเพราะ OpenSL ES 1.0.1 มาตรฐานไม่รองรับการบันทึกหรือถอดรหัสไปยังซิงค์ข้อมูลคิวบัฟเฟอร์) - ระบบจะเพิ่ม
constลงในพารามิเตอร์อินพุตที่ส่งผ่านโดยการอ้างอิง และSLchar *ลงในช่อง Struct ที่ใช้เป็นค่าอินพุต ซึ่งไม่ควรจำเป็นต้องเปลี่ยนแปลงโค้ดใดๆ ทั้งสิ้น - ระบบจะแทนที่ประเภทที่ไม่มีการรับรองสําหรับพารามิเตอร์บางรายการที่ตอนนี้มีการรับรอง
คุณอาจต้องเปลี่ยนประเภทพารามิเตอร์จาก
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 ปัจจุบันจะยังคงใช้งานได้ (แม้จะเลิกใช้งาน) จึงไม่จำเป็นต้องเปลี่ยนแปลงโค้ดโดยทันที