рд╣реИрд▓реЛ, рдкреНрд░рд┐рдп harazhiteli!
рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдПрдХ рд╣рдм рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рджреМрд░рд╛рди, рдореИрдВрдиреЗ Android NDK рдФрд░ OpenAL рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдПрдХ рд▓реЗрдЦ рджреЗрдЦрд╛ред рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, OpenSL ES рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рд╡рд╛рд▓ рдкреВрдЫрд╛ рдЧрдпрд╛ рдерд╛ред рддрдм рдореБрдЭреЗ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ред рдЬрдм рдореИрдВ NDK рдХреЗ рддрд╣рдд C ++ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП Android рдЧреЗрдо рдореЗрдВ рдзреНрд╡рдирд┐рдпреЛрдВ рдФрд░ рд╕рдВрдЧреАрдд рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рддреЛ рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рд╖рдп рд╕реЗ рдирд┐рдкрдЯрд╛ рджрд┐рдпрд╛ред рд▓реЗрдЦ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдореВрд▓ рдмрд╛рддреЗрдВ рд╣реЛрдВрдЧреАред
рд╕рд╛рдордЧреНрд░реА:- OpenSL ES рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг
- рдкреБрд╕реНрддрдХрд╛рд▓рдп рддрдВрддреНрд░ рдХреА рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛ рдФрд░ рд╡рдХреНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдирд╛
- рдкреАрд╕реАрдПрдо рдкреНрд▓реЗ (wav)
- рдПрдордкреА 3 рдкреНрд▓реЗ, рдУрдЬреАрдЬреА
- рдирд┐рд╖реНрдХрд░реНрд╖
1. рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг
рдУрдкрдирдПрд╕рдПрд▓ рдИрдПрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рд╕реА рднрд╛рд╖рд╛ рдХреЗ рдЫрджреНрдо-рд╡рд╕реНрддреБ-рдЙрдиреНрдореБрдЦ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реА рдореЗрдВ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рд╡рд╕реНрддреБ-рдЙрдиреНрдореБрдЦ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЫрджреНрдо-рд╡рд╕реНрддреБ-рдЙрдиреНрдореБрдЦ рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╕рд╛рдорд╛рдиреНрдп рд╕реА рднрд╛рд╖рд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ C ++ рдореЗрдВ, рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗред
OpenSL ES рдореЗрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рджреЛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВ:
- рдСрдмреНрдЬреЗрдХреНрдЯ (SLObjectItf) рдЗрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╢реНрд░реЗрдгреА рдХреЛ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИред рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп, рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдХреА рдорджрдж рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╡рд╕реНрддреБ рдЬрд╛рд╡рд╛ рднрд╛рд╖рд╛ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЗрд╕реЗ C ++ рдореЗрдВ рдПрдХ рдХрдХреНрд╖рд╛ рдХреА рддрд░рд╣ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
- рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (SLEngineItf, SLPlayItf, SLSeekItf, рдЖрджрд┐) рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд╕реНрддреБ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдЕрдВрддрд░реНрд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпрд╛рддреНрдордХрддрд╛рдУрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХрд╛ рдПрдХ рдЕрдореВрд░реНрддрди рд╣реИред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рддрд░реАрдХреЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╕рдЯреАрдХ рд╕реВрдЪреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИред рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЙрд╕рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЛрдб рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рддреЛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╕реНрддреБрдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рд╡рд╕реНрддреБрдУрдВ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдХрд┐рд╕реА рдПрдХрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдХреБрдЫ рдЗрдВрдЯрд░рдлреЗрд╕ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдЗрд╕ рдкрд╛рд░ рдирд╣реАрдВ рдЖрдпрд╛ рд╣реВрдБред
2. рдкреБрд╕реНрддрдХрд╛рд▓рдп рддрдВрддреНрд░ рдХреА рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛ рдФрд░ рд╡рдХреНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдирд╛
OpenSL ES рдХреЛ рдПрдВрдбреНрд░реЙрдЗрдб NDK рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, LOpenSLES рдзреНрд╡рдЬ рдХреЛ Android.mk рдлрд╝рд╛рдЗрд▓ рдХреЗ LOCAL_LDLIBS рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
LOCAL_LDLIBS := /*...*/ -lOpenSLES
рд╣реИрдбрд░ рдлрд╝рд╛рдЗрд▓реЗрдВ рдкреНрд░рдпреБрдХреНрдд:
#include <SLES/OpenSLES.h> #include <SLES/OpenSLES_Android.h>
OpenSL ES рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ OpenSL ES рдЗрдВрдЬрди рдСрдмреНрдЬреЗрдХреНрдЯ (SLObjectItf) рдХреЛ slCreateEngine рдкрд░ рдХреЙрд▓ рдХрд░рдХреЗ рдЖрд░рдВрдн рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ SL_IID_ENGINE рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдПрдХ рд╡рд╕реНрддреБ рдУрдкрдирдПрд╕рдПрд▓ рдИрдПрд╕ рдПрдкреАрдЖрдИ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрдВрджреНрд░реАрдп рд╡рд╕реНрддреБ рдмрди рдЬрд╛рддреА рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ Realize pseudo-method рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ C ++ рдореЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИред Realize рдХрд╛ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╣реЛрдиреЗ (рдЗрд╕ рдХрд╛ рдПрдирд╛рд▓реЙрдЧ) рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ async рдлреНрд▓реИрдЧ рд╣реИ, рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реЛрдЧрд╛ рдпрд╛ рдирд╣реАрдВред
рд╡рд░реНрддрдорд╛рди рдПрдВрдбреНрд░реЙрдЗрдб NDK рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗрд╡рд▓ рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрдВрдЬрди рдФрд░ 32 рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдСрдкрд░реЗрд╢рди рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг)ред
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрдВрдЬрди рдХреА рд╢реБрд░реБрдЖрдд SLObjectItf engineObj; const SLInterfaceID pIDs[1] = {SL_IID_ENGINE}; const SLboolean pIDsRequired[1] = {SL_TRUE}; SLresult result = slCreateEngine( &engineObj, 0, NULL, 1, pIDs, pIDsRequired ); if(result != SL_RESULT_SUCCESS){ LOGE("Error after slCreateEngine"); return; } result = (*engineObj)->Realize(engineObj, SL_BOOLEAN_FALSE);
рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ SL_IID_ENGINE рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рд╡рдХреНрддрд╛рдУрдВ, рд╕рдВрдЧреАрдд, рдзреНрд╡рдирд┐рдпреЛрдВ рдЖрджрд┐ рддрдХ рдкрд╣реБрдВрдЪ рдкрд╛рдПрдВрдЧреЗред
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ SL_IID_ENGINE рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ SLEngineItf engine; result = (*engineObj)->GetInterface( engineObj, SL_IID_ENGINE, &engine );
рдЖрдЗрдП рд╣рдо рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЬрдирд╛ рдкрд░ рдереЛрдбрд╝рд╛ рдзреНрдпрд╛рди рджреЗрдВ:
- рдЗрдЪреНрдЫрд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдПрдХ рд╡рд╕реНрддреБ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
- рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ
(*obj)->Realize(obj, async);
- рдХреЙрд▓ рдХрд░рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
(*obj)-> GetInterface (obj, ID, &itf);
- рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
- рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рд╣рдЯрд╛рдПрдВ
(*obj)->Destroy(obj);
рд╡рдХреНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрдВрдЬрдирдСрдмрдЬ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЗрдВрдЬрди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ CreateOutputMix рдЫрджреНрдо рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЖрдЙрдЯрдкреБрдЯрдорд┐рдХреНрд╕рдСрдмреНрдЬ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ (рдпрд╣ рдХреЗрд╡рд▓ рдбрд░рд╛рд╡рдирд╛ рд▓рдЧрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкрд╛рдардХ рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдирд╛ рд╕реАрдЦ рд╕рдХреЗ)ред рдзреНрд╡рдирд┐ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рд╡рдХреНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдирд╛ SLObjectItf outputMixObj; const SLInterfaceID pOutputMixIDs[] = {}; const SLboolean pOutputMixRequired[] = {}; result = (*engine)->CreateOutputMix(engine, &outputMixObj, 0, pOutputMixIDs, pOutputMixRequired); result = (*outputMixObj)->Realize(outputMixObj, SL_BOOLEAN_FALSE);
SLOutputMixItf рдПрдХ рдзреНрд╡рдирд┐ рдЖрдЙрдЯрдкреБрдЯ рдбрд┐рд╡рд╛рдЗрд╕ (рд╕реНрдкреАрдХрд░, рд╣реЗрдбрдлрд╝реЛрди) рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХ рд╡рд╕реНрддреБ рд╣реИред рдУрдкрдирдПрд╕рдПрд▓ рдИрдПрд╕ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдЙрдкрд▓рдмреНрдз рдЖрдИ / рдУ рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдВрдбреНрд░реЙрдЗрдб рдПрдирдбреАрдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдпрд╛ рддреЛ рдбрд┐рд╡рд╛рдЗрд╕реЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдЬрд┐рд╕реЗ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдЪреБрдиреЗрдВ (рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ SLAudioIODeviceCapetItf рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрд░рд╛рджрд╛ рд╣реИ)ред
3. PCM рдЦреЗрд▓рдирд╛ (wav)
рдореБрдЭреЗ рддреБрд░рдВрдд рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рдореИрдВ WAV рд╣реЗрдбрд░ рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВред рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реАрд░реНрд╖рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдкреАрд╕реАрдПрдо рдмрдлрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ struct WAVHeader{ char RIFF[4]; unsigned long ChunkSize; char WAVE[4]; char fmt[4]; unsigned long Subchunk1Size; unsigned short AudioFormat; unsigned short NumOfChan; unsigned long SamplesPerSec; unsigned long bytesPerSec; unsigned short blockAlign; unsigned short bitsPerSample; char Subchunk2ID[4]; unsigned long Subchunk2Size; }; struct SoundBuffer{ WAVHeader* header; char* buffer; int length; }; SoundBuffer* loadSoundFile(const char* filename){ SoundBuffer* result = new SoundBuffer(); AAsset* asset = AAssetManager_open(assetManager, filename, AASSET_MODE_UNKNOWN); off_t length = AAsset_getLength(asset); result->length = length - sizeof(WAVHeader); result->header = new WAVHeader(); result->buffer = new char[result->length]; AAsset_read(asset, result->header, sizeof(WAVHeader)); AAsset_read(asset, result->buffer, result->length); AAsset_close(asset); return result; }
рдЕрдм рдПрдХ рдХреНрд╡рд┐рдХ рдмрдлрд░ рдСрдбрд┐рдпреЛ рдЖрдЙрдЯрдкреБрдЯ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд╡рд┐рд╢реЗрд╖ рдПрдХреНрд╕рдЯреЗрдВрд╢рди SLDataLocator_AndroidSimpleBufferQueue рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдВрдЧреАрдд рдмрдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рджреЛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рднрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: SLDataSource рдФрд░ SLDataSink, рдЬреЛ рдХреНрд░рдорд╢рдГ рдСрдбрд┐рдпреЛ рдЪреИрдирд▓ рдХреЗ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред
рдмрдлрд░ рдСрдбрд┐рдпреЛ рдЖрдЙрдЯрдкреБрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ SLDataLocator_AndroidSimpleBufferQueue locatorBufferQueue = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 1}; SLDataFormat_PCM formatPCM = { SL_DATAFORMAT_PCM, 1, SL_SAMPLINGRATE_44_1, SL_PCMSAMPLEFORMAT_FIXED_16, SL_PCMSAMPLEFORMAT_FIXED_16, SL_SPEAKER_FRONT_CENTER, SL_BYTEORDER_LITTLEENDIAN }; SLDataSource audioSrc = {&locatorBufferQueue, &formatPCM}; SLDataLocator_OutputMix locatorOutMix = {SL_DATALOCATOR_OUTPUTMIX, outputMixObj}; SLDataSink audioSnk = {&locatorOutMix, NULL}; const SLInterfaceID pIDs[1] = {SL_IID_BUFFERQUEUE}; const SLboolean pIDsRequired[1] = {SL_BOOLEAN_TRUE }; result = (*engine)->CreateAudioPlayer(engine, &playerObj, &audioSrc, &audioSnk, 1, pIDs, pIDsRequired); result = (*playerObj)->Realize(playerObj, SL_BOOLEAN_FALSE);
Android NDK рдореЗрдВ OpenSL ES рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдЦреНрдд рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдХреБрдЫ рдЗрдВрдЯрд░рдлреЗрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдРрд╕рд╛ рди рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ ред рдЕрдкрдиреЗ рдКрдкрд░ SL_IID_PLAY рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВред
SLPlayItf player; result = (*playerObj)->GetInterface(playerObj, SL_IID_PLAY, &player); SLBufferQueueItf bufferQueue; result = (*playerObj)->GetInterface(playerObj, SL_IID_BUFFERQUEUE, &bufferQueue); result = (*player)->SetPlayState(player, SL_PLAYSTATE_PLAYING);
SL_IID_PLAY рдФрд░ SL_IID_BUFFERQUEUE рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЕрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
- рд╡реЙрд▓реНрдпреВрдо рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП SL_IID_VOLUME
- рдЪреИрдирд▓ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП SL_IID_MUTESOLO (рдХреЗрд╡рд▓ рдорд▓реНрдЯреА-рдЪреИрдирд▓ рдСрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП, рдпрд╣ SLDataFormat_PCM рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЕрдВрдХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
- рд╕реБрдкрд░рдЗрдореНрдкреЛрдЬрд╝рд┐рдВрдЧ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП SL_IID_EFFECTSEND (рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░ - рдХреЗрд╡рд▓ reverb рдкреНрд░рднрд╛рд╡)
рдЖрджрд┐
(*player)->SetPlayState(player, SL_PLAYSTATE_PLAYING);
рд╣рдо рдирдП рдмрдирд╛рдП рдЧрдП рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВред рдЬрдмрдХрд┐ рдХрддрд╛рд░ рдЦрд╛рд▓реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ рдореМрди рд╣реА рд╕реБрдирд╛рдИ рджреЗрддрд╛ рд╣реИред рдЪрд▓реЛ рдХрддрд╛рд░ рдореЗрдВ рдХреБрдЫ рдЖрд╡рд╛рдЬ рд▓рдЧрд╛рддреЗ рд╣реИрдВред
рдХрддрд╛рд░ рдореЗрдВ рдзреНрд╡рдирд┐ рдЬреЛрдбрд╝реЗрдВ SoundBuffer* sound = loadSoundFile("mySound.wav"); (*soundsBufferQueue)->Clear(bufferQueue); (*soundsBufferQueue)->Enqueue(bufferQueue, sound->buffer, sound->length);
рдпрд╣реА рд╣реИ, рд╕рдмрд╕реЗ рд╕рд░рд▓ wav рдЦрд┐рд▓рд╛рдбрд╝реА рддреИрдпрд╛рд░ рд╣реИред
рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдПрдВрдбреНрд░реЙрдЗрдб рдПрдирдбреАрдХреЗ рдкреАрд╕реАрдПрдо рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдкреНрд░рд╛рд░реВрдкреЛрдВ рдореЗрдВ рд╕рдВрдЧреАрдд рдХреЗ рдмрдлрд░ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
4. рдПрдордкреА рдкреНрд▓реЗ, рдУрдЬреАрдЬреА
рдЙрдкрд░реЛрдХреНрдд рдпреЛрдЬрдирд╛ рд▓рдВрдмреА рд╕рдВрдЧреАрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдПрдХ рд▓рдВрдмреА wav рдлрд╝рд╛рдЗрд▓ рдмрд╣реБрдд, рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рдЬрди рдХрд░реЗрдЧреАред рдПрдордкреА 3 рдпрд╛ рдУрдЬреАрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред OpenSL ES рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдмрдлрд╝рд░реНрдб рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рдЕрдВрддрд░ рдпрд╣ рднреА рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдЧреАрдд рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреНрд▓реЗрдпрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд▓рд┐рдП рдкреНрд▓реЗрдмреИрдХ рдХреЗ рджреМрд░рд╛рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
рд╕рдВрдЧреАрдд рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░:
рдлрд╝рд╛рдЗрд▓ рдбрд┐рдХреНрд░рд┐рдкреНрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ struct ResourseDescriptor{ int32_t decriptor; off_t start; off_t length; }; ResourseDescriptor loadResourceDescriptor(const char* path){ AAsset* asset = AAssetManager_open(assetManager, path, AASSET_MODE_UNKNOWN); ResourseDescriptor resourceDescriptor; resourceDescriptor.decriptor = AAsset_openFileDescriptor(asset, &resourceDescriptor.start, &resourceDescriptor.length); AAsset_close(asset); return resourceDescriptor; }
рдЕрдЧрд▓рд╛, рдлрд┐рд░ рд╕реЗ SLDataSource рдФрд░ SLDataSink рднрд░реЗрдВред рдФрд░ рдПрдХ рдСрдбрд┐рдпреЛ рдкреНрд▓реЗрдпрд░ рдмрдирд╛рдПрдВред
рдЦрд┐рд▓рд╛рдбрд╝реА рдирд┐рд░реНрдорд╛рдг ResourseDescriptor resourceDescriptor = loadResourceDescriptor("myMusic.mp3"); SLDataLocator_AndroidFD locatorIn = { SL_DATALOCATOR_ANDROIDFD, resourseDescriptor.decriptor, resourseDescriptor.start, resourseDescriptor.length } SLDataFormat_MIME dataFormat = { SL_DATAFORMAT_MIME, NULL, SL_CONTAINERTYPE_UNSPECIFIED }; SLDataSource audioSrc = {&locatorIn, &dataFormat}; SLDataLocator_OutputMix dataLocatorOut = { SL_DATALOCATOR_OUTPUTMIX, outputMixObj }; SLDataSink audioSnk = {&dataLocatorOut, NULL}; const SLInterfaceID pIDs[2] = {SL_IID_PLAY, SL_IID_SEEK}; const SLboolean pIDsRequired[2] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE}; SLObjectItf playerObj; SLresult result = (*engine)->CreateAudioPlayer(engine, &playerObj, &audioSrc, &audioSnk, 2, pIDs, pIDsRequired); result = (*playerObj)->Realize(playerObj, SL_BOOLEAN_FALSE);
рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо MIME рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реНрд╡рдд: рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИред
рдЖрдЧреЗ рд╣рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ SL_IID_PLAY рдФрд░ SL_IID_SEEK рдорд┐рд▓рддреЗ рд╣реИрдВред рдлрд╝рд╛рдЗрд▓ рдФрд░ рд▓реВрдк рдореЗрдВ рдкреНрд▓реЗрдмреИрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд▓реЗрдмреИрдХ рд╕реНрдерд┐рддрд┐ рдФрд░ рдЧрддрд┐ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрдВрдЯрд░рдлреЗрд╕реЗрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ SLPlayItf player; result = (*playerObj)->GetInterface(playerObj, SL_IID_PLAY, &player); SLSeekItf seek; result = (*playerObj)->GetInterface(playerObj, SL_IID_SEEK, &seek); (*seek)->SetLoop( seek, SL_BOOLEAN_TRUE, 0, SL_TIME_UNKNOWN ); (*player)->SetPlayState(player, SL_PLAYSTATE_PLAYING);
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдПрдХ рдЦреЗрд▓ рдореЗрдВ рдкреГрд╖реНрдарднреВрдорд┐ рд╕рдВрдЧреАрдд рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реВрдкрд┐рдВрдЧ рддрдВрддреНрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рд░рдЪрдирд╛ рдХреЗ рдЕрдВрдд рдФрд░ рдЗрд╕рдХреА рд╢реБрд░реБрдЖрдд (рд╕реБрдирдиреЗ рдХрд╛ рд╕рдордп, рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рддреИрд░рдиреЗ рдХреЗ рдмреАрдЪ) рдХреЗ рдмреАрдЪ 0.5-1.0 рд╕реЗрдХрдВрдб рдХрд╛ рдЕрдВрддрд░рд╛рд▓ред рдореИрдВрдиреЗ рдкрд╛рд░реНрд╢реНрд╡ рд╕рдВрдЧреАрдд рдореЗрдВ рдордзреНрдп рдФрд░ рдЕрдВрдд рдореЗрдВ рдХреБрдЫ рдЪрд┐рдХрдиреА рд▓реБрдкреНрдд рд╣реЛрддреА рдмрдирд╛рдХрд░ рдЗрд╕реЗ рдкрдЫрд╛рдбрд╝ рджрд┐рдпрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЕрдВрддрд░ рдЕрджреГрд╢реНрдп рд╣реИред
рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╡рд┐рднрд┐рдиреНрди рдХреЙрд▓рдмреИрдХ SLPlayItf рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рд▓рдЯрдХрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред Android рдореЗрдВ, NDK рд╕реБрд╡рд┐рдзрд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ (рд╡рд┐рдзрд┐ SL_RESULT_SUCCESS рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЙрд▓рдмреИрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред
рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рд░реЛрдХрдиреЗ рдпрд╛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреНрд░рдорд╢рдГ SL_PLAYSTATE_STOPPED рдпрд╛ SL_PLAYSTATE_PAUSED рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде SLPlayItf рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА SetPlayState рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред GetPlayState рд╡рд┐рдзрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдорд╛рди рд▓реМрдЯрд╛рддреА рд╣реИред
5. рдирд┐рд╖реНрдХрд░реНрд╖
рдУрдкрдирдПрд╕рдПрд▓ рдИрдПрд╕ рдПрдкреАрдЖрдИ рдХрд╛рдлреА рд╕рдореГрджреНрдз рд╣реИ, рдФрд░ рдзреНрд╡рдирд┐ рдмрдЬрд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЖрдкрдХреЛ рдЗрд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдореИрдВ рд╕рд╛рдЙрдВрдб рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдкрд░ рдЯрдЪ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрдлрд░ рдХрддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдкреАрд╕реАрдПрдо рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ Android рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВред рдлрд┐рд░ рднреА, рдпрд╣ рдореБрдЭреЗ рдХрд╛рдлреА рд╕рд╣рдЬ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред
рд╡рд┐рдкрдХреНрд╖ рдореЗрдВ, рдПрдХ рдореБрдлреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдХрдИ рдЪреАрдЬреЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдПрдкреАрдЖрдИ рдПрдВрдбреНрд░реЙрдЗрдб рдПрд╕рдбреАрдХреЗ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдПрдкреАрдЖрдИ рд╕реЗ рддреЗрдЬ рдирд╣реАрдВ рд╣реИред
рд╕рд╛рд╣рд┐рддреНрдп
- рд╕рд┐рд▓реНрд╡реЗрди рд░реЗрдЯрд╛рдмреЙрдЗрд▓ред Android NDKред Android рдХреЗ рд▓рд┐рдП C / C ++ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрд╡рд▓рдкрдореЗрдВрдЯред
- рдж рдХреНрд░реЛрдиреЛрд╕ рдЧреНрд░реБрдк рдЗрдВрдХред OpenSL ES рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ ред
рдорд╛рдирдХ Android NDK (NativeAudio рдкреНрд░реЛрдЬреЗрдХреНрдЯ) рдореЗрдВ рдЕрдЪреНрдЫреЗ рдФрд░ рдЕрдзрд┐рдХ рдкреВрд░реНрдг рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдирдбреАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдУрдкрдирдПрд╕рдПрд▓ рдИрдПрд╕, рдореИрдВ рддреБрд░рдВрдд рдЬрд╡рд╛рдм рджреВрдВрдЧрд╛ред рдПрдВрдбреНрд░реЙрдЗрдб рдПрдирдбреАрдХреЗ рдХреЛ рдкреНрд░рд╕рд┐рджреНрдз рдЧреЗрдо рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХрдВрдкрдиреА (рд╣рдм рдкрд░ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдереЗ) рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдмрд╛рдж рдореЗрдВ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЪреБрдиреМрддреА рдмрди рдЧрдпрд╛: рдХреНрдпрд╛ рдореИрдВ рдХрд╛рдо рдХреЛ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдзреБрдВрдзред рдУрдкрдирдПрд╕рдПрд▓ рдИрдПрд╕ рдиреЗ рдХрдм рд╕реЗ рдЪреБрдирд╛ рдореБрдЭреЗ рдЙрд╕рдХреЗ рд╕рд╛рде рдпрд╛ рдУрдкрдирд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рдерд╛, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЬрд╛рд╡рд╛ рдореЗрдВ рдПрдХ рдмрджрд╕реВрд░рдд рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЙрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ред