Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
AVAudioEngineでリアルタイムレンダリング
Search
Yuki Yasoshima
September 20, 2020
Programming
1
820
AVAudioEngineでリアルタイムレンダリング
iOSDC Japan 2020
Yuki Yasoshima
September 20, 2020
Tweet
Share
More Decks by Yuki Yasoshima
See All by Yuki Yasoshima
Swift Concurrencyとレースコンディション
objectiveaudio
2
660
モーダルの遷移を理解する
objectiveaudio
4
2k
オーディオ波形を表示するために知っておくべきこと
objectiveaudio
0
940
リファクタリング・チャレンジ リバーシ編
objectiveaudio
0
160
UIKitは2度ベルを鳴らす
objectiveaudio
0
300
iOSDC2018.pdf
objectiveaudio
1
2.1k
Objective-C++を使ってMRCで快適に開発する
objectiveaudio
0
22k
Other Decks in Programming
See All in Programming
関数型まつり2025登壇資料「関数プログラミングと再帰」
taisontsukada
2
850
都市をデータで見るってこういうこと PLATEAU属性情報入門
nokonoko1203
1
570
Azure AI Foundryではじめてのマルチエージェントワークフロー
seosoft
0
130
プロダクト志向なエンジニアがもう一歩先の価値を目指すために意識したこと
nealle
0
110
アンドパッドの Go 勉強会「 gopher 会」とその内容の紹介
andpad
0
270
『自分のデータだけ見せたい!』を叶える──Laravel × Casbin で複雑権限をスッキリ解きほぐす 25 分
akitotsukahara
1
550
git worktree × Claude Code × MCP ~生成AI時代の並列開発フロー~
hisuzuya
1
480
FormFlow - Build Stunning Multistep Forms
yceruto
1
190
ReadMoreTextView
fornewid
1
480
Is Xcode slowly dying out in 2025?
uetyo
1
190
CursorはMCPを使った方が良いぞ
taigakono
1
180
Java on Azure で LangGraph!
kohei3110
0
170
Featured
See All Featured
Build The Right Thing And Hit Your Dates
maggiecrowley
36
2.8k
Facilitating Awesome Meetings
lara
54
6.4k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
5.9k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
35
2.3k
GitHub's CSS Performance
jonrohan
1031
460k
The Cult of Friendly URLs
andyhume
79
6.5k
The Invisible Side of Design
smashingmag
299
51k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
930
Stop Working from a Prison Cell
hatefulcrawdad
270
20k
Making Projects Easy
brettharned
116
6.3k
Gamification - CAS2011
davidbonilla
81
5.3k
Unsuck your backbone
ammeep
671
58k
Transcript
: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 ΦʔσΟΦͷεϨου͕ϩοΫͯ͠͠·Θͳ͍Α͏ʹؾΛ͚Δ