Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
AVAudioEngineでリアルタイムレンダリング
Search
Yuki Yasoshima
September 20, 2020
Programming
980
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
AVAudioEngineでリアルタイムレンダリング
iOSDC Japan 2020
Yuki Yasoshima
September 20, 2020
Transcript
31 slides
:VLJ:BTPTIJNB!ZBTP@TBO "7"VEJP&OHJOFͰ ϦΞϧλΠϜϨϯμϦϯά J04%$+BQBO
༰ ΦʔσΟΦೖग़ྗͷΈ J04ͷΦʔσΟΦ"1* ҆ఆͯ͠ϦΞϧλΠϜʹϨϯμϦϯάΛ͢Δʹ IUUQTHJUIVCDPNPCKFDUJWFBVEJP"VEJP6OJU3FOEFSJOH&YBNQMF αϯϓϧίʔυ
ΦʔσΟΦೖग़ྗͷΈ
ίʔϧόοΫ ΦʔσΟΦೖग़ྗͷΈ ΦʔσΟΦॲཧΛ։࢝͢Δͱઐ༻ͷεϨουͰ܁Γฦ͠ίʔϧόοΫ͕ݺΕΔ ʢඵʹ͖ͭेճҎ্ʣ
ίʔϧόοΫ ग़ྗ ΦʔσΟΦೖग़ྗͷΈ ίʔϧόοΫͰσʔλΛ͢ͱԻ͕ग़ྗ͞ΕΔ
ίʔϧόοΫ ग़ྗ ೖྗ ΦʔσΟΦೖग़ྗͷΈ ίʔϧόοΫʹೖྗ͞ΕͨԻͷσʔλ͕ͬͯ͘Δ
ίʔϧόοΫ ग़ྗ ೖྗ ΦʔσΟΦೖग़ྗͷΈ ❌ ίʔϧόοΫͷॲཧʹ͕͔͔࣌ؒΔͱɺԻ్͕ΕͨΓऔΓ͜΅ͨ͠Γ͢Δ͜ ͱʹͳΔ
"7"VEJP1MBZFSɾ"7"VEJP3FDPSEFSͳͲͷߴϨϕϧͳ"1*ɺ͜ͷΑ͏ͳϨ ϕϧॲཧΛؾʹ͠ͳͯ͘؆୯ʹ͑ΔΑ͏ʹͳ͍ͬͯΔ ϦΞϧλΠϜʹࣗ༝ʹԻΛѻ͍͍ͨ߹ɺϨϕϧͳॲཧΛ͢Δඞཁ͕͋Δ ΦʔσΟΦೖग़ྗͷΈ
J04ͷΦʔσΟΦ"1*
J04ॳظͷࠒ͔Β͋Δ$ݴޠͷ"1* $BSCPODPNQPOFOUCBTFE"VEJP6OJUT "6(SBQI "VEJP2VFVF4FSWJDFT
ඇਪʹͳͬͨ"1* J043FMFBTF/PUFTΑΓ "6(SBQIʢʙJ04ʣ *OUFS"QQBVEJPʢʙJ04ʣ $BSCPODPNQPOFOUCBTFE"VEJP6OJUTʢ͍ۙ͏ͪʹ͑ͳ͘ͳΔʣ
Ճ͞Εͨ"1* "7"VEJP&OHJOFʢJ04ʙʣ "VEJP6OJU7"VEJP6OJU&YUFOTJPOTʢJ04ʙʣ "7"VEJP4PVSDF/PEF"7"VEJP4JOL/PEFʢJ04ʙʣ
J04ҎલͷϦΞϧλΠϜϨϯμϦϯά $ݴޠͷ"VEJP6OJU "6"VEJP6OJUΛܧঝ͢Δ͜ͱͰ"7"VEJP&OHJOFͰՄೳʹͳΔʢϓϥάΠϯ ͷΈͰ࡞ΔͷͰɺηοτΞοϓ͕໘Ͱෳࡶʣ
"7"VEJP4PVSDF/PEF"7"VEJP4JOL/PEF͕ొ ϓϥάΠϯͱൺͯηοτΞοϓ͕༰қʹͳͬͨ J04Ҏ߱ͷϦΞϧλΠϜϨϯμϦϯά
"7"VEJP4PVSDF/PEF ΦʔσΟΦΛग़ྗ͢ΔσʔλΛ͢ 4PVSDF/PEF 0VUQVU/PEF "7"VEJP&OHJOF 3FOEFS #MPDL @interface AVAudioSourceNode :
AVAudioNode <AVAudioMixing> - (instancetype)initWithRenderBlock:(AVAudioSourceNodeRenderBlock)block; - (instancetype)initWithFormat:(AVAudioFormat *)format renderBlock:(AVAudioSourceNodeRenderBlock)block; @end
"7"VEJP4JOL/PEF ΦʔσΟΦͷೖྗ͞ΕͨσʔλΛड͚औΔ *OQVU/PEF 4JOL/PEF "7"VEJP&OHJOF 3FDFJWFS #MPDL @interface AVAudioSinkNode :
AVAudioNode - (instancetype)initWithReceiverBlock:(AVAudioSinkNodeReceiverBlock)block; @end
҆ఆͨ͠ϨϯμϦϯάΛߦ͏
ΦʔσΟΦ*0ͷεϨουʹ͓͍ͯ ϝϞϦͷ֬อΛ͠ͳ͍ MJCEJTQBUDIΘͳ͍ $$ ͰॲཧΛॻ͘ "DDFMFSBUF'SBNFXPSLΛ׆༻͢Δ ଞͷεϨουͱͷϩοΫΛආ͚Δʢ4XJGU0CKFDUJWF$ͷݺͼग़͠ɺϑΝΠϧ ೖग़ྗͷதʹ͋Δʣ IUUQTQPTUEDDGPVSDPNNPONJTUBLFTJOBVEJPEFWFMPQNFOU
αϯϓϧίʔυ "7"VEJP4PVSDF/PEFαΠϯͷ࠶ੜ ʲ%JSFDUʳपͷૢ࡞Λ͙͢ʹө ʲ%FGFSSFEʳཷΊ͍ͯΔόοϑΝʹରͯ͠पͷૢ࡞Λө "7"VEJP4JOL/PEFೖྗԻͷϝʔλʔදࣔ IUUQTHJUIVCDPNPCKFDUJWFBVEJP"VEJP6OJU3FOEFSJOH&YBNQMF
αϯϓϧίʔυͷݴޠߏ 3FOEFS#MPDL3FDFJWFS#MPDLͷத$ Ͱهड़ 0CKFDUJWF$Ͱϥοϓͯ͠/PEFΛฦ͢ "7"VEJP&OHJOFͷߏங6*4XJGUͰهड़
εϨουؒͷΓͱΓ
TUEBUPNJD ಛ ܕɾුಈখܕɾϙΠϯλܕΛεϨουηʔϑʹѻ͑ΔΫϥε JT@MPDL@GSFF ؔͰϩοΫ͞ΕΔ͔औಘͰ͖Δʢࠓ࣌ͷσόΠεͳΒ·ͣ USVFʣ
ෳͷΛΞτϛοΫʹ͢Δ ڞ༻ମͰTUEBUPNJDͷܕͱTUSVDUΛม union Value { void *v; struct { float
const level; float const peak; }; }; static_assert(sizeof(Value) == sizeof(void *), "");
ෳͷΛΞτϛοΫʹ͢Δ ڞ༻ମͰTUEBUPNJDͷܕͱTUSVDUΛม std::atomic<void *> atomicValue; // atomicͷʹηοτ͢Δ Value setValue{.level =
0.0f, .peak = 0.0f}; atomicValue = setValue.v; // atomicͷ͔Βήοτ͢Δ Value getValue{.v = atomicValue};
TUETIBSFE@QUS ಛ $ ͷΫϥεΛࢀরΧϯτํࣜͰอ࣋͢Δ ࢀরΧϯλεϨουηʔϑ ϨϯμϦϯάதʹίϐʔ͠ͳ͍Α͏ʹؾΛ͚ͭΔ
TUETIBSFE@QUS ίϐʔͯ͠͠·͏ॻ͖ํ void sample(std::shared_ptr<SineData> data) { auto localData = data;
} ίϐʔ͞ΕΔ ͭղ์͞ΕΔ ίϐʔ͞ΕΔ
TUETIBSFE@QUS ίϐʔ͞Εͳ͍ॻ͖ํ void sample(std::shared_ptr<SineData> const &data) { auto const &localData
= data; } ίϐʔ͞Εͳ͍ ίϐʔ͞Εͳ͍ Կى͖ͳ͍
ͭͷεϨου͔Βಉ͡σʔλʹॻ͖ࠐΉ %FGFSSFEͷαϯϓϧ
ͭͷεϨου͔Βಉ͡σʔλΛѻ͏ %FGFSSFEͷαϯϓϧ αΠϯੜεϨου αΠϯΛ ॻ͖ࠐΈ ग़ྗόοϑΝʹ ಡΈࠐΈ ڞ༗͢Δσʔλ ͭ ࠷ޙ·ͰಡΈࠐΜͩΒ
ಡΈࠐΈݩΛΓସ͑ αΠϯͷ ॻ͖ࠐΈΛࢦࣔ ඵؒͷ ΦʔσΟΦσʔλ ग़ྗεϨου
ͭͷεϨου͔Βಉ͡σʔλΛѻ͏ %FGFSSFEͷαϯϓϧ αΠϯੜεϨου 8SJUJOH 3FBEJOH ΞτϛοΫͳϑϥά 8SJUJOHͳΒ αΠϯΛॻ͖ࠐΜͰ 3FBEJOHʹ͢Δ 3FBEJOHͳΒ
ग़ྗόοϑΝʹ σʔλΛಡΈࠐΜͰ ࠷ޙ·ͰߦͬͨΒ 8SJUJOHʹ͢Δ ڞ༗͢Δσʔλ ͭ ඵؒͷ ΦʔσΟΦσʔλ ग़ྗεϨου
·ͱΊ $ݴޠͷ"1*ඇਪɻ࣌"7"VEJP&OHJOF ΦʔσΟΦͷεϨου͕ϩοΫͯ͠͠·Θͳ͍Α͏ʹؾΛ͚Δ
More Decks by Yuki Yasoshima
See All by Yuki Yasoshima
空間オーディオの活用
objectiveaudio
0
250
Swift Concurrency - 状態監視の罠
objectiveaudio
2
920
Swift Concurrencyとレースコンディション
objectiveaudio
2
830
モーダルの遷移を理解する
objectiveaudio
4
2.9k
オーディオ波形を表示するために知っておくべきこと
objectiveaudio
0
1.2k
リファクタリング・チャレンジ リバーシ編
objectiveaudio
0
230
UIKitは2度ベルを鳴らす
objectiveaudio
0
380
iOSDC2018.pdf
objectiveaudio
1
2.5k
Objective-C++を使ってMRCで快適に開発する
objectiveaudio
0
24k
Other Decks in Programming
See All in Programming
React Native経験者が Flutterを30⽇間触って驚いたこと
3saito
0
170
Getting Started with Vibe Coding
miccheng
0
200
Vapor Mode でアクセシビリティは 壊れないか検証した話
fuqda
1
340
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
1
2k
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
430
AI Augmentation Techniques with Liberty
ivargrimstad
1
440
Distance field of Julia set
kinakomoti321
0
310
[DroidKnights 2026] Workflow AX: From Auto-Documented Policies to E2E Testing
raeminkang
0
560
Growing PicoRuby's Ecosystem on ESP32
yuuu
2
100
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
4
1.5k
protojson における文字化けの扱い
kazuki1023
0
320
プロジェクトコードをキレイキレイしよう!暗黙的な参照を読み解く静的解析
ostk0069
0
210
Featured
See All Featured
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
820
Rails Girls Zürich Keynote
gr2m
96
14k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Between Models and Reality
mayunak
4
570
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
590
For a Future-Friendly Web
brad_frost
184
11k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
600
Crafting Experiences
bethany
1
430
We Are The Robots
honzajavorek
0
440
4 Signs Your Business is Dying
shpigford
187
23k
Fireside Chat
paigeccino
43
4.1k