SlideShare ist ein Scribd-Unternehmen logo
1 von 45
Downloaden Sie, um offline zu lesen
1. Beispieldateinen auf dem
                                      Schreibtisch anordnen.

                                      2. Alle Programme die man für
                                      Demos benötigt starten.
                                      Bpsw: Xcode, IB, Terminal.




                             ⌘
                                      3. Screenrecorder starten.

                                      4. Präsentation starten und auf
                                      Zeichen oder Signal warten.




                          Macoun’11

Dienstag, 4. Oktober 11                                                 1
Core Audio und MIDI auf iOS
                                  Boris Bügling / @NeoNacho




Dienstag, 4. Oktober 11                                       2
Motivation
                          •   Unterwegs musizieren ist toll


                          •   Apple sieht das genau so:

                              •   iOS 2.0 - Core Audio

                              •   iOS 4.2 - Core MIDI

                              •   iOS 5.0 - Neue APIs in Core Audio



Dienstag, 4. Oktober 11                                               3
Überblick

                          •   Grundlagen, Einführung in Audio Units und Tipps

                          •   Abspielen von Samples

                          •   “Kochbuch” und Einlesen von MIDI Input

                          •   Neuerungen in iOS 5

                          •   Endergebnis: ein einfacher Synthesizer



Dienstag, 4. Oktober 11                                                         4
Grundlagen



Dienstag, 4. Oktober 11                5
Digitale Audio Verarbeitung

                          •   Digitales Signal: Messung zu diskreten Zeitpunkten

                          •   PCM (Pulse Code Modulation)

                          •   Sample == Amplitude des Signals zu einem bestimmten
                              Zeitpunkt

                          •   Sample-Rate doppelt so groß wie Frequenzbereich



Dienstag, 4. Oktober 11                                                             6
Digitale Audio Verarbeitung


                          •   Sample: Messwert einer Waveform

                          •   Frame: Menge an Samples für jeden Kanal

                          •   Packet: kleinste zusammenhängende Datenmenge des Formats




Dienstag, 4. Oktober 11                                                                  7
Digitale Audio Verarbeitung


                          •   Interleaved: ein Buffer für beide Kanäle

                          •   Non-Interleaved: ein Buffer pro Kanal




Dienstag, 4. Oktober 11                                                  8
Audio in iOS

                          •   HTML 5 <audio> Tag

                          •   Media Player Framework

                          •   AVFoundation

                          •   OpenAL

                          •   Audio Queues

                          •   Audio Units


Dienstag, 4. Oktober 11                                     9
•   “Easy” and “CoreAudio” can’t be used in the same sentence.
                              CoreAudio is very powerful, very complex and under-documented. --
                              Jens Alfke auf der coreaudio-api Mailling-Liste




Dienstag, 4. Oktober 11                                                                           10
AVAudioSession

                          •   Kategorisiert Apps und regelt den Hardware Zugriff

                          •   Verhalten bzgl. Background Audio

                          •   Verarbeitung von Unterbrechungen

                          •   Reaktion auf Änderungen im Routing

                          •   Für den Vortrag: Kategorie “Playback”



Dienstag, 4. Oktober 11                                                            11
Audio Units

                          •   Echtzeit, Mixing, Audio-Synthese, Streaming

                          •   Größter Sprung in iOS 5

                          •   Reines C

                          •   Callback-lastig, Property-basiert

                          •   Error codes (FourCC oder negative Integers)



Dienstag, 4. Oktober 11                                                     12
Audio Units



                          •   aber auch: niedrigster Level, der Entwicklern auf iOS zur
                              Verfügung steht




Dienstag, 4. Oktober 11                                                                   13
Audio Units




Dienstag, 4. Oktober 11                 14
AudioUnit


                          •   Audio-Processing Plug-Ins

                          •   iOS: Keine eigenen Units (im Gegensatz zum Mac)

                          •   Mehrere Ein- und Ausgabe-Busse sind möglich

                          •   Verbindungen regeln den Datenfluss



Dienstag, 4. Oktober 11                                                         15
AudioUnit


                          •   AudioComponentDescription - Manufacturer, Type, SubType

                          •   AudioStreamBasicDescription (ASBD) regelt das Format

                          •   Konfiguration via AudioUnitSetProperty

                          •   Dadurch ist die API Doku relativ nutzlos



Dienstag, 4. Oktober 11                                                                 16
Verfügbare Audio Units in iOS 4
                          •   RemoteIO, GenericOutput

                          •   VoiceProcessingIO

                          •   MultiChannelMixer

                          •   3DMixer

                          •   AUiPodEQ

                          •   Format Conversion



Dienstag, 4. Oktober 11                                     17
AUGraph

                          •   Organisiert die Verbindungen zwischen den Units (AUNode)

                          •   Hat genau einen Output Knoten

                          •   Arbeitet nach dem Pull-Prinzip

                          •   Mittels GenericOutput und Render Callbacks sind Subgraphen
                              möglich



Dienstag, 4. Oktober 11                                                                    18
AUGraph


                          •   Drei Phasen: Open, Init, Running

                          •   Änderungen der Sample-Rate nur mittels Neuaufbau und -start

                          •   Bei Änderungen Neustart, sonst kommt es zu Crashes




Dienstag, 4. Oktober 11                                                                     19
AURenderCallback
                                  OSStatus   callback (void* inRefCon,
                                  ! ! !      AudioUnitRenderActionFlags* ioActionFlags,
                                  ! ! !      const AudioTimeStamp* inTimeStamp,
                                  ! ! !      UInt32 inBusNumber,
                                  ! ! !      UInt32 inNumberFrames,
                                  ! ! !      AudioBufferList* ioData);




                          •   Hier findet die interessante Arbeit statt!




Dienstag, 4. Oktober 11                                                                   20
Erstes Beispiel



Dienstag, 4. Oktober 11                     21
Samples abspielen


                          •   ExtAudioFileOpenUrl() - unterstützt WAV, AAC, MP3, etc.

                          •   AudioUnits: MultiChannelMixer und RemoteIO

                          •   Ein Render Callback liefert die Samples




Dienstag, 4. Oktober 11                                                                 22
Demo




Dienstag, 4. Oktober 11          23
Tipps



Dienstag, 4. Oktober 11           24
Vom AudioTimeStamp zu
                                     Nanosekunden
                          •   AudioTimeStamp ist in “Host Time”

                          •   Umrechung:       mach_timebase_info_data_t tinfo;
                                               mach_timebase_info(&tinfo);
                                               double hTime2nsFactor =
                                               (double)tinfo.numer / tinfo.denom;
                                               double nanoseconds = inTimeStamp->mHostTime
                                               * hTime2nsFactor;




Dienstag, 4. Oktober 11                                                                      25
Behandlung von OSStatus

                          •   Jede Funktion gibt einen OSStatus zurück

                          •   Dieser muss jedes Mal gecheckt werden!

                          •   Kann FourCC oder Integer Fehlercode sein

                          •   Makro oder Helper-Funktion einsetzen

                          •   Übersichtlicherer Code



Dienstag, 4. Oktober 11                                                  26
Connections vs.
                                        AURenderCallback

                          •   Pull-Prinzip aus _einer_ Quelle

                          •   Daher entweder Connections _oder_ Callbacks

                          •   Sonst Error -50 oder Callbacks werden nicht aufgerufen

                          •   CAShow() hilft beim Debuggen



Dienstag, 4. Oktober 11                                                                27
Level-Meter


                          • AVAudioPlayer hat peekPowerForChannel:
                          • Wir nutzen einen Render Notifier!
                          • Demo


Dienstag, 4. Oktober 11                                              28
Tipps

                          •   Kein malloc() oder NSLog() im Render Callback (~85 Aufrufe pro
                              Sekunde!)

                          •   Aber: Zugriff auf Objective-C Objekte via Properties meist OK

                          •   Bei der Arbeit mit ASBD:   memset(&asbd, 0, sizeof(asbd));


                          •   Umrechnung von Float nach 32bit Signed Int: Multiplikation mit
                              16777216L


Dienstag, 4. Oktober 11                                                                        29
“Kochbuch”



Dienstag, 4. Oktober 11                30
Ton-Erzeugung


                          • Elementare Signale
                          • Erzeugung eines einfachen Sinus-Signals
                          • Demo


Dienstag, 4. Oktober 11                                               31
Effekt-Filter


                          • Wir können keine eigenen Audio-Units erzeugen :(
                          • Lösung: ausgeschalteter iPodEQ mit Render Callback
                          • Demo


Dienstag, 4. Oktober 11                                                          32
Recording in eine Datei

                          • AudioUnitRenderNotify() auf dem Mixer
                          • ExtAudioFileWriteAsync()
                          • Format beachten!
                          • AAC Konvertierung läuft in Hardware
                          • Demo

Dienstag, 4. Oktober 11                                             33
Exkurs: SoundFonts

                          • Samples und Einstellungen für Instrumente in MIDI-Software
                          • Freie SoundFonts im Netz, aber kein nativer Support auf iOS
                          • Die freie Fluidsynth Library steht unter LGPL
                          • Daher: SoundFonts auf dem Mac zu CAF-Dateien verarbeiten
                          • Demo

Dienstag, 4. Oktober 11                                                                   34
Neuerungen in iOS 5



Dienstag, 4. Oktober 11                         35
Neue Audio Units


                          •   Effekte: Filter, Reverb, etc.

                          •   Generatoren: AudioFilePlayer, ScheduledSlicePlayer

                          •   Instrumente: AUSampler




Dienstag, 4. Oktober 11                                                            36
AUSampler


                          •   Neu in iOS 5 und Mac OS X Lion

                          •   Vereinfacht unser Beispiel deutlich

                          •   Native Unterstützung für SoundFonts




Dienstag, 4. Oktober 11                                             37
Music Sequencing API


                          •   Lesen und Schreiben von MIDI Files

                          •   Takt

                          •   MusicTracks




Dienstag, 4. Oktober 11                                            38
Der Synthesizer



Dienstag, 4. Oktober 11                     39
Core MIDI

                          •   Verfügbar seit iOS 4.2

                          •   MIDI zu USB zu Camera Connection Kit zu iPad

                          •   C-basiert, wir können unser Wissen von den Audio Units
                              mitnehmen

                          • Demo

Dienstag, 4. Oktober 11                                                                40
Und alle: der Synthesizer



                          • Demo



Dienstag, 4. Oktober 11                                   41
Exkurs: NNAudio

                          • Objective-C Wrapper um einen Teil der Audio Units
                          • Abstrahiert ewig gleiche Setup Blöcke
                          • Bündelt AudioUnit und AUNode in einer Klasse
                          • Work-In-Progress
                          • Demo
                          • Auf GitHub: https://github.com/neonichu/Core-Audio-Samples
Dienstag, 4. Oktober 11                                                                  42
Fragen?



Dienstag, 4. Oktober 11             43
Literatur
                          •   Folien und Beispielcode: http://vu0.org/audio

                          •   Audio Unit Hosting Guide von Apple

                          •   Core Audio von Chris Adamson und Kevin Avila (Anfang 2012)

                          •   Fundamentals of Digital Audio, WWDC 2010

                          •   Audio Development for iPhone OS, WWDC 2010

                          •   Music in iOS and Lion, WWDC 2011



Dienstag, 4. Oktober 11                                                                    44
⌘
                          Macoun’11

Dienstag, 4. Oktober 11               45

Weitere ähnliche Inhalte

Andere mochten auch

Normas apa sexta edición
Normas apa sexta ediciónNormas apa sexta edición
Normas apa sexta edición04021119
 
Política nacional del ambiente
Política nacional del ambiente Política nacional del ambiente
Política nacional del ambiente conejitaa
 
Bed Job
Bed JobBed Job
Bed Jobwebtel
 
Schutz des freien Austausches von Diensten durch das GATS
Schutz des freien Austausches von Diensten durch das GATSSchutz des freien Austausches von Diensten durch das GATS
Schutz des freien Austausches von Diensten durch das GATSAlmut
 
Colegio nacional nicolas esguerra
Colegio nacional nicolas esguerraColegio nacional nicolas esguerra
Colegio nacional nicolas esguerraMiguel Alejo Alayon
 
Electiva en educacion matematica
Electiva en educacion matematicaElectiva en educacion matematica
Electiva en educacion matematicaelectivaedu
 
Presentación del metodo gonqas evaluación quality
Presentación del metodo gonqas  evaluación qualityPresentación del metodo gonqas  evaluación quality
Presentación del metodo gonqas evaluación qualitygonQas
 
Sistemas de control 3
Sistemas de control 3Sistemas de control 3
Sistemas de control 3Jesus Juarez
 
Ejercicios calculo
Ejercicios calculoEjercicios calculo
Ejercicios calculopaolanaro
 
Erinnerungsbuch klasse4a-frau tiefenbacher
Erinnerungsbuch klasse4a-frau tiefenbacherErinnerungsbuch klasse4a-frau tiefenbacher
Erinnerungsbuch klasse4a-frau tiefenbacherFatima Dargam
 
CatalogoSolGlobal.cl
CatalogoSolGlobal.clCatalogoSolGlobal.cl
CatalogoSolGlobal.clerumsfeld
 
Rotary Distrito 4271 Nuevas Generaciones en Rotary
Rotary Distrito 4271 Nuevas Generaciones en RotaryRotary Distrito 4271 Nuevas Generaciones en Rotary
Rotary Distrito 4271 Nuevas Generaciones en RotaryRotary Distrito 4271
 

Andere mochten auch (17)

PeriodicoCC
PeriodicoCCPeriodicoCC
PeriodicoCC
 
Presentación
PresentaciónPresentación
Presentación
 
Normas apa sexta edición
Normas apa sexta ediciónNormas apa sexta edición
Normas apa sexta edición
 
Política nacional del ambiente
Política nacional del ambiente Política nacional del ambiente
Política nacional del ambiente
 
Bed Job
Bed JobBed Job
Bed Job
 
Ok Spain Vallede Aran
Ok Spain Vallede AranOk Spain Vallede Aran
Ok Spain Vallede Aran
 
Schutz des freien Austausches von Diensten durch das GATS
Schutz des freien Austausches von Diensten durch das GATSSchutz des freien Austausches von Diensten durch das GATS
Schutz des freien Austausches von Diensten durch das GATS
 
Colegio nacional nicolas esguerra
Colegio nacional nicolas esguerraColegio nacional nicolas esguerra
Colegio nacional nicolas esguerra
 
Electiva en educacion matematica
Electiva en educacion matematicaElectiva en educacion matematica
Electiva en educacion matematica
 
Gerencia de riesgos
Gerencia de riesgosGerencia de riesgos
Gerencia de riesgos
 
Presentación del metodo gonqas evaluación quality
Presentación del metodo gonqas  evaluación qualityPresentación del metodo gonqas  evaluación quality
Presentación del metodo gonqas evaluación quality
 
Sistemas de control 3
Sistemas de control 3Sistemas de control 3
Sistemas de control 3
 
Ejercicios calculo
Ejercicios calculoEjercicios calculo
Ejercicios calculo
 
Erinnerungsbuch klasse4a-frau tiefenbacher
Erinnerungsbuch klasse4a-frau tiefenbacherErinnerungsbuch klasse4a-frau tiefenbacher
Erinnerungsbuch klasse4a-frau tiefenbacher
 
CatalogoSolGlobal.cl
CatalogoSolGlobal.clCatalogoSolGlobal.cl
CatalogoSolGlobal.cl
 
Rotary Distrito 4271 Nuevas Generaciones en Rotary
Rotary Distrito 4271 Nuevas Generaciones en RotaryRotary Distrito 4271 Nuevas Generaciones en Rotary
Rotary Distrito 4271 Nuevas Generaciones en Rotary
 
Logica
LogicaLogica
Logica
 

Core Audio und MIDI auf iOS

  • 1. 1. Beispieldateinen auf dem Schreibtisch anordnen. 2. Alle Programme die man für Demos benötigt starten. Bpsw: Xcode, IB, Terminal. ⌘ 3. Screenrecorder starten. 4. Präsentation starten und auf Zeichen oder Signal warten. Macoun’11 Dienstag, 4. Oktober 11 1
  • 2. Core Audio und MIDI auf iOS Boris Bügling / @NeoNacho Dienstag, 4. Oktober 11 2
  • 3. Motivation • Unterwegs musizieren ist toll • Apple sieht das genau so: • iOS 2.0 - Core Audio • iOS 4.2 - Core MIDI • iOS 5.0 - Neue APIs in Core Audio Dienstag, 4. Oktober 11 3
  • 4. Überblick • Grundlagen, Einführung in Audio Units und Tipps • Abspielen von Samples • “Kochbuch” und Einlesen von MIDI Input • Neuerungen in iOS 5 • Endergebnis: ein einfacher Synthesizer Dienstag, 4. Oktober 11 4
  • 6. Digitale Audio Verarbeitung • Digitales Signal: Messung zu diskreten Zeitpunkten • PCM (Pulse Code Modulation) • Sample == Amplitude des Signals zu einem bestimmten Zeitpunkt • Sample-Rate doppelt so groß wie Frequenzbereich Dienstag, 4. Oktober 11 6
  • 7. Digitale Audio Verarbeitung • Sample: Messwert einer Waveform • Frame: Menge an Samples für jeden Kanal • Packet: kleinste zusammenhängende Datenmenge des Formats Dienstag, 4. Oktober 11 7
  • 8. Digitale Audio Verarbeitung • Interleaved: ein Buffer für beide Kanäle • Non-Interleaved: ein Buffer pro Kanal Dienstag, 4. Oktober 11 8
  • 9. Audio in iOS • HTML 5 <audio> Tag • Media Player Framework • AVFoundation • OpenAL • Audio Queues • Audio Units Dienstag, 4. Oktober 11 9
  • 10. “Easy” and “CoreAudio” can’t be used in the same sentence. CoreAudio is very powerful, very complex and under-documented. -- Jens Alfke auf der coreaudio-api Mailling-Liste Dienstag, 4. Oktober 11 10
  • 11. AVAudioSession • Kategorisiert Apps und regelt den Hardware Zugriff • Verhalten bzgl. Background Audio • Verarbeitung von Unterbrechungen • Reaktion auf Änderungen im Routing • Für den Vortrag: Kategorie “Playback” Dienstag, 4. Oktober 11 11
  • 12. Audio Units • Echtzeit, Mixing, Audio-Synthese, Streaming • Größter Sprung in iOS 5 • Reines C • Callback-lastig, Property-basiert • Error codes (FourCC oder negative Integers) Dienstag, 4. Oktober 11 12
  • 13. Audio Units • aber auch: niedrigster Level, der Entwicklern auf iOS zur Verfügung steht Dienstag, 4. Oktober 11 13
  • 14. Audio Units Dienstag, 4. Oktober 11 14
  • 15. AudioUnit • Audio-Processing Plug-Ins • iOS: Keine eigenen Units (im Gegensatz zum Mac) • Mehrere Ein- und Ausgabe-Busse sind möglich • Verbindungen regeln den Datenfluss Dienstag, 4. Oktober 11 15
  • 16. AudioUnit • AudioComponentDescription - Manufacturer, Type, SubType • AudioStreamBasicDescription (ASBD) regelt das Format • Konfiguration via AudioUnitSetProperty • Dadurch ist die API Doku relativ nutzlos Dienstag, 4. Oktober 11 16
  • 17. Verfügbare Audio Units in iOS 4 • RemoteIO, GenericOutput • VoiceProcessingIO • MultiChannelMixer • 3DMixer • AUiPodEQ • Format Conversion Dienstag, 4. Oktober 11 17
  • 18. AUGraph • Organisiert die Verbindungen zwischen den Units (AUNode) • Hat genau einen Output Knoten • Arbeitet nach dem Pull-Prinzip • Mittels GenericOutput und Render Callbacks sind Subgraphen möglich Dienstag, 4. Oktober 11 18
  • 19. AUGraph • Drei Phasen: Open, Init, Running • Änderungen der Sample-Rate nur mittels Neuaufbau und -start • Bei Änderungen Neustart, sonst kommt es zu Crashes Dienstag, 4. Oktober 11 19
  • 20. AURenderCallback OSStatus callback (void* inRefCon, ! ! ! AudioUnitRenderActionFlags* ioActionFlags, ! ! ! const AudioTimeStamp* inTimeStamp, ! ! ! UInt32 inBusNumber, ! ! ! UInt32 inNumberFrames, ! ! ! AudioBufferList* ioData); • Hier findet die interessante Arbeit statt! Dienstag, 4. Oktober 11 20
  • 22. Samples abspielen • ExtAudioFileOpenUrl() - unterstützt WAV, AAC, MP3, etc. • AudioUnits: MultiChannelMixer und RemoteIO • Ein Render Callback liefert die Samples Dienstag, 4. Oktober 11 22
  • 25. Vom AudioTimeStamp zu Nanosekunden • AudioTimeStamp ist in “Host Time” • Umrechung: mach_timebase_info_data_t tinfo; mach_timebase_info(&tinfo); double hTime2nsFactor = (double)tinfo.numer / tinfo.denom; double nanoseconds = inTimeStamp->mHostTime * hTime2nsFactor; Dienstag, 4. Oktober 11 25
  • 26. Behandlung von OSStatus • Jede Funktion gibt einen OSStatus zurück • Dieser muss jedes Mal gecheckt werden! • Kann FourCC oder Integer Fehlercode sein • Makro oder Helper-Funktion einsetzen • Übersichtlicherer Code Dienstag, 4. Oktober 11 26
  • 27. Connections vs. AURenderCallback • Pull-Prinzip aus _einer_ Quelle • Daher entweder Connections _oder_ Callbacks • Sonst Error -50 oder Callbacks werden nicht aufgerufen • CAShow() hilft beim Debuggen Dienstag, 4. Oktober 11 27
  • 28. Level-Meter • AVAudioPlayer hat peekPowerForChannel: • Wir nutzen einen Render Notifier! • Demo Dienstag, 4. Oktober 11 28
  • 29. Tipps • Kein malloc() oder NSLog() im Render Callback (~85 Aufrufe pro Sekunde!) • Aber: Zugriff auf Objective-C Objekte via Properties meist OK • Bei der Arbeit mit ASBD: memset(&asbd, 0, sizeof(asbd)); • Umrechnung von Float nach 32bit Signed Int: Multiplikation mit 16777216L Dienstag, 4. Oktober 11 29
  • 31. Ton-Erzeugung • Elementare Signale • Erzeugung eines einfachen Sinus-Signals • Demo Dienstag, 4. Oktober 11 31
  • 32. Effekt-Filter • Wir können keine eigenen Audio-Units erzeugen :( • Lösung: ausgeschalteter iPodEQ mit Render Callback • Demo Dienstag, 4. Oktober 11 32
  • 33. Recording in eine Datei • AudioUnitRenderNotify() auf dem Mixer • ExtAudioFileWriteAsync() • Format beachten! • AAC Konvertierung läuft in Hardware • Demo Dienstag, 4. Oktober 11 33
  • 34. Exkurs: SoundFonts • Samples und Einstellungen für Instrumente in MIDI-Software • Freie SoundFonts im Netz, aber kein nativer Support auf iOS • Die freie Fluidsynth Library steht unter LGPL • Daher: SoundFonts auf dem Mac zu CAF-Dateien verarbeiten • Demo Dienstag, 4. Oktober 11 34
  • 35. Neuerungen in iOS 5 Dienstag, 4. Oktober 11 35
  • 36. Neue Audio Units • Effekte: Filter, Reverb, etc. • Generatoren: AudioFilePlayer, ScheduledSlicePlayer • Instrumente: AUSampler Dienstag, 4. Oktober 11 36
  • 37. AUSampler • Neu in iOS 5 und Mac OS X Lion • Vereinfacht unser Beispiel deutlich • Native Unterstützung für SoundFonts Dienstag, 4. Oktober 11 37
  • 38. Music Sequencing API • Lesen und Schreiben von MIDI Files • Takt • MusicTracks Dienstag, 4. Oktober 11 38
  • 40. Core MIDI • Verfügbar seit iOS 4.2 • MIDI zu USB zu Camera Connection Kit zu iPad • C-basiert, wir können unser Wissen von den Audio Units mitnehmen • Demo Dienstag, 4. Oktober 11 40
  • 41. Und alle: der Synthesizer • Demo Dienstag, 4. Oktober 11 41
  • 42. Exkurs: NNAudio • Objective-C Wrapper um einen Teil der Audio Units • Abstrahiert ewig gleiche Setup Blöcke • Bündelt AudioUnit und AUNode in einer Klasse • Work-In-Progress • Demo • Auf GitHub: https://github.com/neonichu/Core-Audio-Samples Dienstag, 4. Oktober 11 42
  • 44. Literatur • Folien und Beispielcode: http://vu0.org/audio • Audio Unit Hosting Guide von Apple • Core Audio von Chris Adamson und Kevin Avila (Anfang 2012) • Fundamentals of Digital Audio, WWDC 2010 • Audio Development for iPhone OS, WWDC 2010 • Music in iOS and Lion, WWDC 2011 Dienstag, 4. Oktober 11 44
  • 45. Macoun’11 Dienstag, 4. Oktober 11 45