Slide 1

Slide 1 text

ࠓ೔͔Β෼͔Δ Android Audioͷશͯ 2020.10.26 ߹ಉձࣾφΫα
 ઎෦ ॡฏ

Slide 2

Slide 2 text

ࣗݾ঺հ ઎෦ ॡฏ • ߹ಉձࣾφΫαɹ୅ද • ΤϯλϝͷϥΠϒ഑৴Λࢧ͍͑ͯ ·͢ • झຯ͸࡞ۂͱωοτϫʔΫӡ༻ • Android։ൃͰҰ൪࢖͍ͬͯΔ΋ͷ ͸MediaCodecͱVulkan

Slide 3

Slide 3 text

Pixel 3 ໰୊ w 1JYFMͰ͸ɺ""VEJP͕ݪҼͰ࠶ੜ͞Ε ͳ͍໰୊͕͋ͬͨ

Slide 4

Slide 4 text

ձࣾ঺հ 1.

Slide 5

Slide 5 text

w ೥݄ʹઃཱ w ຊࣾ͸౦ژ౎ઍ୅ా۠ਆాۋொ w ΦϑΟεʹϥοΫ͕͋Δ w ϝϯόʔ਺͸໊ w ࠾༻ืूதʂ ߹ಉձࣾφΫα

Slide 6

Slide 6 text

w &/5&35"*.&/5ʷ5&$)/0-0(: w ΤϯλʔςΠϝϯτͷ෼໺Λٕज़Λ࢖ͬͯ໰୊ղܾΛ͢Δ ձࣾ w ΢Σϒ੍࡞͔Βಈը഑৴·ͰԿͰ΋΍Γ·͢ φΫαͷࣄۀ

Slide 7

Slide 7 text

w ϥΠϒ഑৴αʔϏε w ిࢠॻ੶αʔϏε w ͳͲͳͲ ࣄۀྫ

Slide 8

Slide 8 text

w /-*7&͸ɺφΫα͕ఏڙ͍ͯ͠ΔιϦϡʔγϣϯͷҰͭɻ w /-*7&͸ɺΫϥΠΞϯτ͔ΒΠϯϑϥ·ͰશͯφΫα͕Χ όʔ͢Δ͜ͱ͕ग़དྷ·͢ w ͦͷଞɺ%3.ͷରԠͳͲ΋αϙʔτ͢Δ͜ͱ͕ՄೳͰ͢ ϥΠϒ഑৴ιϦϡʔγϣϯ NLIVE

Slide 9

Slide 9 text

w ڵຯΛ࣋ͬͨਓ͸๻ʹ࿈བྷ͍ͯͩ͘͠͞ w ۀ຿ҕୗɾΞϧόΠτ΋େ׻ܴͰ͢ We're Hiring!

Slide 10

Slide 10 text

AndroidͷAudioͷྺ࢙ 2.

Slide 11

Slide 11 text

w "VEJP'MJOHFS͸"VEJP4FSWFSͷͭͰ͋ΓɺΞϓϦͷԻΛ ؅ཧ͢Δαʔό w "VEJP'MJOHFS͸"35 "OESPJE3VOUJNF ্Ͱಈ࡞͢Δ w "VEJP'MJOHFS͔Β)"- )BSEXBSF"CTUSBDU-BZFS ʹॲ ཧ͞Εͯɺ࿥Ի΍࠶ੜΛߦ͏ AudioFlinger

Slide 12

Slide 12 text

w "VEJP'MJOHFS͕"OESPJEͷ஗Ԇ໰୊ͷ தͰ͸ಛʹӨڹ͕େ͖͍ w ͦͷཧ༝͸"VEJP'MJOHFSͰόοϑΝΛ ࡞Γ௚͔͢ΒͰ͋Δ AudioFlingerͷ10ms໰୊

Slide 13

Slide 13 text

w "VEJP'MJOHFSͷલʹ͸)"-͕͋Γɺ )"-͕"-4"ͱ΍ΓͱΓΛͯ͠σʔλΛ ૹड৴͢Δ w "-4"͸ϦϯάόοϑΝΛ࢖ͬͯɺυϥ Πόʔ͔Β"VEJP'MJOHFSʹૹ͍ͬͯΔ AudioFlingerͷ10ms໰୊

Slide 14

Slide 14 text

w "VEJP'MJOHFSͷޙʹ͸"VEJP3FDPSE ΍"VEJP5SBDL͕͋Δ w ͪ͜Β΋#ZUF#VGGFSΛ࢖ͬͯɺόο ϑΝΛ࡞ͬͯॻ͖ࠐΉॲཧ͕͋Δͷ Ͱɺ஗Ԇ͕͋Δ AudioFlingerͷ10ms໰୊

Slide 15

Slide 15 text

w "VEJP"1*ͷඪ४࣮૷͕0QFO4-&4 w 0QFO4-&4Λ࢖͏͜ͱͰɺ"VEJP'MJOHFSΑΓ΋௿஗Ԇʹ ࿥Ի΍࠶ੜ͕Ͱ͖Δ OpenSL ES

Slide 16

Slide 16 text

w 0QFO4-&4ͷ໰୊఺͸ɺσόΠεʹΑͬͯ͸ඇରԠͳ͜ ͱ͕ଟ͍ʢυϥΠόʔͷඇαϙʔτʣ w ·ͨɺ0QFO4-&4ͷ࣮૷΋͔ͳΓεύήοςΟίʔυʹ ͳ͓ͬͯΓɺ࣌ʑෆ҆ఆʹͳΔ͜ͱ΋Α͋͘Δ OpenSL ES͕࢖͍෺ʹͳΒͳ͍

Slide 17

Slide 17 text

w "OESPJEΑΓɺ0QFO4-&4ͷ୅ସͱͯ͠""VEJP͕ొ ৔ͨ͠ w ""VEJPͰ͸ɺ͜Ε·Ͱ"VEJP'MJOHFSͷϥούʔతͳ໾ׂ Λ͍ͯͨ͠0QFO4-&4ͱ͸ҧ͍ɺ௚઀)"-ʹΞΫηεͰ ͖Δ AAudio

Slide 18

Slide 18 text

w ""VEJP͸0QFO4-&4ಉ༷ʹ$Ͱهड़Λߦ͏ͨΊɺ "35ͷ($֎Ͱ͋ΔʢͦͷͨΊϝϞϦղ์͸ࣗ෼Ͱ΍Δඞ ཁ͕͋Δʣ w ""VEJPͰ͸ɺ֤ϕϯμʔͱڠྗ͠ɺ҆ఆͯ͠ಈ࡞͢Δ͜ ͱΛ໨ࢦͨ͠ AAudio

Slide 19

Slide 19 text

Implementaion 3.

Slide 20

Slide 20 text

w (PPHMF͕։ൃͨ͠ϥΠϒϥϦ w 0QFO4-&4ͱ""VEJPͷ૬ޓར༻Λ ߦ͏ͨΊͷϥούʔ w ࣗ෼Ͱॻ͘ͷ͕ͭΒ͍ਓ͸0CPFΛ ࢖͏ͱ؆୯ʹهड़Ͱ͖Δ Oboe

Slide 21

Slide 21 text

w 0QFO4-&4͸ࠓߋ࢖͏ඞཁ΋ͳ͍ͷͰࠓճ͸""VEJPΛ࣮ ૷ͯ͠Έ·͠ΐ͏ ࣗ෼Ͱ࣮૷ͯ͠ΈΔ

Slide 22

Slide 22 text

dlsymͰAAudioΛಡΈࠐΉ w MJCBBVEJPTP͸ NJO4EL7FSTJPO͔Βೖ ͍ͬͯΔ

Slide 23

Slide 23 text

InputStreamΛ४උ͢Δ void AAudio_IO::setupInputStream( AAudioStreamBuilder* builder ) { AAudioStreamBuilder_setDeviceId ( builder, _inputDeviceId ); AAudioStreamBuilder_setSampleRate ( builder, _sampleRate ); AAudioStreamBuilder_setChannelCount( builder, _inputChannelCount ); AAudioStreamBuilder_setFormat ( builder, _sampleFormat ); AAudioStreamBuilder_setSharingMode ( builder, AAUDIO_SHARING_MODE_EXCLUSIVE ); AAudioStreamBuilder_setPerformanceMode( builder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY ); AAudioStreamBuilder_setDirection ( builder, AAUDIO_DIRECTION_INPUT ); AAudioStreamBuilder_setErrorCallback ( builder, ::errorCallback, this ); }

Slide 24

Slide 24 text

outputStreamΛ४උ͢Δ void AAudio_IO::setupOutputStream( AAudioStreamBuilder* builder ) { AAudioStreamBuilder_setDeviceId ( builder, _outputDeviceId ); AAudioStreamBuilder_setFormat ( builder, _sampleFormat ); AAudioStreamBuilder_setChannelCount( builder, _outputChannelCount ); AAudioStreamBuilder_setSharingMode ( builder, AAUDIO_SHARING_MODE_EXCLUSIVE ); AAudioStreamBuilder_setPerformanceMode( builder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY ); AAudioStreamBuilder_setDirection ( builder, AAUDIO_DIRECTION_OUTPUT ); AAudioStreamBuilder_setDataCallback ( builder, ::dataCallback, this ); AAudioStreamBuilder_setErrorCallback ( builder, ::errorCallback, this ); }

Slide 25

Slide 25 text

inputStreamΛ࡞Δ void AAudio_IO::createInputStream() { AAudioStreamBuilder* builder = createStreamBuilder(); setupInputStream( builder ); aaudio_result_t result = static_cast(AAudioStreamBuilder_openStream( builder, &_inputStream )); AAudioStreamBuilder_delete( builder ); }

Slide 26

Slide 26 text

outputStreamΛ࡞Δ void AAudio_IO::createOutputStream() { AAudioStreamBuilder* builder = createStreamBuilder(); setupOutputStream( builder ); aaudio_result_t result = static_cast(AAudioStreamBuilder_openStream( builder, &_outputStream )); if ( result == AAUDIO_OK && _outputStream != nullptr ) { _sampleRate = AAudioStream_getSampleRate( _outputStream ); _framesPerBurst = AAudioStream_getFramesPerBurst( _outputStream ); AudioEngineProps::SAMPLE_RATE = _sampleRate; updateBufferSizeInFrames( AAudioStream_setBufferSizeInFrames( _outputStream, _framesPerBurst )); _underrunCountOutputStream = AAudioStream_getXRunCount( _outputStream ); } else { return; } AAudioStreamBuilder_delete( builder ); }

Slide 27

Slide 27 text

streamΛ։࢝ɾఀࢭ͢Δ void AAudio_IO::startStream( AAudioStream* stream ) { aaudio_result_t result = static_cast(AAudioStream_requestStart( stream )); if ( result != AAUDIO_OK ) { return; } } void AAudio_IO::stopStream( AAudioStream* stream ) { if ( stream == nullptr ) { return; } aaudio_result_t result = static_cast(AAudioStream_requestStop( stream )); }

Slide 28

Slide 28 text

w ""VEJP4USFBN#VJMEFS@TFU1FSGPSNBODF.PEFͰɺ-08@-"5&/$:ʹઃఆ͢Δͱ௒௿஗ԆʹͳΔ͕ όοςϦʔ͕ݮΔɻ͔͠΋ɺ͜Ε͚ͩͩͱ͋·Γҙຯ͕ͳ͍ʢޙड़ʣ w ""VEJP͸5ISFBE4BGFͰ͸ͳ͍ɻͦͷͨΊɺผεϨου͔Βಉ࣌ʹ""VEJPΛݺͼग़͢͜ͱ͸Ͱ͖ͳ ͍ɻ w ίʔϧόοΫؔ਺Λ࢖͍ɺඇಉظͰॲཧΛ͢Δ͜ͱΛਪ঑ɻ४උ͕Ͱ͖ͨΒίʔϧόοΫͰಡΈࠐΈɾ ॻ͖ࠐΈ͕Ͱ͖Δɻ w όοϑΝαΠζΛௐ੔͢Δ΂͖ɻ࠷ॳ͸5$1ͷ8JOEPX4J[F0QUJNJ[FͷΑ͏ʹঃʑʹόοϑΝαΠ ζΛେ͖͍ͯ͘͘͠ํ͕Α͍ɻ AAudioͷͭ·͖ͮϙΠϯτ

Slide 29

Slide 29 text

w ""VEJPͷ-PX-BUFODZ.PEF͚ͩͩͱ௒௿஗Ԇʹ͸ͳΒͳ͍ w "DUJWJUZͷ8JOEPX.BOBHFSʹ8JOEPX.BOBHFS-BZPVU1BSBNT'-"(@,&&1@4$3&&/@0/Λ ηοτ͢Δඞཁ͕͋Δ w BDUJWJUZHFU8JOEPX TFU4VTUBJOFE1FSGPSNBODF.PEF USVF ͰɺύϑΥʔϚϯεϞʔυΛ༗ޮʹ ͢Δ WindowManagerΛϋοΫ͢Δ

Slide 30

Slide 30 text

inline void optimizeThreadPerformance( const std::vector& cpuIds ) { cpu_set_t mask; pid_t current_thread_id = gettid(); cpu_set_t cpu_set; CPU_ZERO( &cpu_set ); if ( cpuIds.empty() ) { int current_cpu_id = sched_getcpu(); CPU_SET( current_cpu_id, &cpu_set ); } else { for ( size_t i = 0; i < cpuIds.size(); i++ ) { int cpu_id = cpuIds.at( i ); CPU_SET( cpu_id, &cpu_set ); } } } CPUΞϑΟχςΟΛεϨουʹઃఆ͢Δ w ΞϑΟχςΟΛઃఆ͢Δ͜ͱͰɺ$16ύϑΥʔ ϚϯεΛۃݶ·Ͱ޲্ͤ͞Δ͜ͱ͕Ͱ͖Δ w ϓϩηεɾεϨου͸04ʹΑͬͯͲΕ͔ͷ $16ίΞ্Ͱ࣮ߦ͞ΕΔɻ$16ΞϑΟχςΟΛ ઃఆ͢Δ͜ͱͰɺͦͷ࣮ߦ͞ΕΔ$16ίΞΛ೚ ҙʹ੍ݶɾࢦఆ͢Δ͜ͱ͕Ͱ͖Δɻ

Slide 31

Slide 31 text

·ͱΊ 4.

Slide 32

Slide 32 text

w "OESPJEͷΦʔσΟΦͷྺ࢙͸௕͘ɺෳࡶͰ͋Δ w 0CPFΛͱΓ͋͑ͣ࢖͓͚ͬͯ͹Α͍ w ۃݶ·ͰΧελϚΠζ͍ͨ͠ਓ͸ຊηογϣϯͷ಺༰Λࢀ ߟʹɺ࣮૷ͯ͠Έ͍ͯͩ͘͞ ·ͱΊ