100iOS SensorsWhere Mobile Begins
Roadmap   100RoadmapWhere We’re Going
Teaser: What to Expect!   96TeaserWhat to Expect!
Teaser: What to Expect!   96TeaserWhat to Expect!     Digital Camera
Teaser: What to Expect!                   96TeaserWhat to Expect!                                            Audio Sampler...
Teaser: What to Expect!                   96TeaserWhat to Expect!Navigation System                                        ...
Teaser: What to Expect!                   96TeaserWhat to Expect!                                            Air LevelNavi...
Teaser: What to Expect!                   96TeaserWhat to Expect!            Ball Game                                    ...
Teaser: What to Expect!                   96TeaserWhat to Expect!                                              Compass    ...
Mobile vs. Desktop: What’s the Difference   92Mobile vs. DesktopWhat’s the Difference
Mobile vs. Desktop: What’s the Difference              92Mobile vs. DesktopWhat’s the Difference    Speakers                ...
Mobile vs. Desktop: What’s the Difference                92Mobile vs. DesktopWhat’s the Difference   Speakers               ...
Mobile vs. Desktop: What’s the Difference                92Mobile vs. DesktopWhat’s the Difference   Speakers               ...
Mobile vs. Desktop: What’s the Difference                92Mobile vs. DesktopWhat’s the Difference   Speakers               ...
Mobile vs. Desktop: What’s the Difference                92Mobile vs. DesktopWhat’s the Difference   Speakers               ...
Mobile vs. Desktop: What’s the Difference                92Mobile vs. DesktopWhat’s the Difference   Speakers               ...
Mobile vs. Desktop: What’s the Difference                92Mobile vs. DesktopWhat’s the Difference   Speakers               ...
Mobile vs. Desktop: What’s the Difference                92Mobile vs. DesktopWhat’s the Difference   Speakers               ...
Sensors in 12 Device Generations                  88Sensors in Device GenerationsGreat Common Denominators                ...
Sensors in 12 Device Generations                                       88          Sensors in Device Generations          ...
Sensors in 7 Device Generations                                       84          Sensors in Device Generations          G...
Sensors in 7 Device Generations                                       84          Sensors in Device Generations          G...
Delegate Pattern   80Delegate PatternQuick Look
Delegate Pattern   80Delegate PatternQuick Look  Delegate
Delegate Pattern     80Delegate PatternQuick Look  Delegate             didArriveAtBar:             didDrinkBeerNumber:   ...
Roadmap   76RoadmapWhere We’re Going
Light: Implementing a Camera   72LightImplementing a Camera
Light: Implementing a Camera                     72        Light         Implementing a Camera// setup image picker contro...
Light: Implementing a Camera                     72        Light         Implementing a Camera// setup image picker contro...
Sound: Implementing a Sound Recorder   68SoundImplementing a Sound Recorder
Sound: Implementing a Sound Recorder                     68         Sound          Implementing a Sound Recorder// get aud...
Sound: Implementing a Sound Player   64SoundImplementing a Sound Player
Sound: Implementing a Sound Player               64        Sound         Implementing a Sound Player// get audio sessionAV...
Sound: Implementing a Sound Player               64        Sound         Implementing a Sound Player// get audio sessionAV...
Location: Implementing a Positioning System   60LocationImplementing a Positioning System
Location: Implementing a Positioning System   60        Location         Implementing a Positioning System// create locati...
Location: Implementing a Positioning System   60        Location         Implementing a Positioning System// create locati...
Magnetic Field: Implementing a Compass   56Magnetic FieldImplementing a Compass
Magnetic Field: Implementing a Compass   56      Magnetic Field      Implementing a Compass// setup location managerlocati...
Magnetic Field: Implementing a Compass   56      Magnetic Field      Implementing a Compass// setup location managerlocati...
Roadmap   52RoadmapWhere We’re Going
Accelerometer: May the Force be with you   48AccelerometerMay the Force be with you
Accelerometer: May the Force be with you   48AccelerometerMay the Force be with you      Force      in g-force            ...
Accelerometer: May the Force be with you                       48AccelerometerMay the Force be with you      Force        ...
Accelerometer: May the Force be with you                       48AccelerometerMay the Force be with you      Force        ...
Accelerometer: May the Force be with you   44AccelerometerMay the Force be with you
Accelerometer: May the Force be with you   44        Accelerometer        May the Force be with you// enable accelerometer...
Gyroscope: I’m spinnin’ around   40GyroscopeI’m spinnin’ around
Gyroscope: I’m spinnin’ around   40GyroscopeI’m spinnin’ aroundRotation Ratein radians per second              0.00.0     ...
Gyroscope: I’m spinnin’ around                             40GyroscopeI’m spinnin’ aroundRotation Rate                    ...
Gyroscope: I’m spinnin’ around                             40GyroscopeI’m spinnin’ aroundRotation Rate                    ...
Gyroscope: I’m spinnin’ around   36GyroscopeI’m spinnin’ around
Gyroscope: I’m spinnin’ around   36         Gyroscope         I’m spinnin’ around// create core motion managermotionManage...
CoreMotion: Use this!   32CoreMotionUse this!
CoreMotion: Use this!   32CoreMotionUse this!                          +                 Raw data            Accelerometer...
CoreMotion: Use this!   32CoreMotionUse this!                            +                   Raw data              Acceler...
CoreMotion: Use this!       28CoreMotionUse this!                                     +
CoreMotion: Use this!       28      CoreMotion      Use this!                                                  +// create ...
CoreMotion: Use this!       20CoreMotionUse this!                                     +
CoreMotion: Use this!              20        CoreMotion         Use this!                                                 ...
CoreMotion: Use this!              20        CoreMotion         Use this!                                                 ...
Roadmap   16RoadmapWhere We’re Going
Summary: What we did not cover   10SummaryWhat we did not cover
Summary: What we did not cover   10SummaryWhat we did not cover                        GPS Accuracy
Summary: What we did not cover   10SummaryWhat we did not cover               Shaking-Motion Events                       ...
Summary: What we did not cover   10SummaryWhat we did not cover                  Recording Movies               Shaking-Mo...
Summary: What we did not cover   10SummaryWhat we did not cover                  Sensor Availability                  Reco...
Summary: What we did not cover   10SummaryWhat we did not cover                  Sensor Availability                  Reco...
Summary: What we learned!   5SummaryWhat we learned!
Summary: What we learned!     5SummaryWhat we learned!           Capturing                    Images
Summary: What we learned!     5 Summary What we learned!Recording & Playing                      Sound            Capturin...
Summary: What we learned!     5 Summary What we learned!         Geolocating                     DeviceRecording & Playing...
Summary: What we learned!                   5     Summary     What we learned!Reading Device Position            +        ...
Summary: What we learned!                   5     Summary     What we learned!                    Finding                 ...
Thank you: You learned a lot!   0Thank youYou learned a lot!
Thank you: You learned a lot!                                0                   Download!        https://github.com/south...
Upcoming SlideShare
Loading in...5
×

iOS Sensors

7,748

Published on

Demonstrates the usage of all available iOS sensors with source code. Example use-cases are a compass, air level, navigation, acceleration and audio recording and playback.

Published in: Technology
0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
7,748
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
128
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide

iOS Sensors

  1. 1. 100iOS SensorsWhere Mobile Begins
  2. 2. Roadmap 100RoadmapWhere We’re Going
  3. 3. Teaser: What to Expect! 96TeaserWhat to Expect!
  4. 4. Teaser: What to Expect! 96TeaserWhat to Expect! Digital Camera
  5. 5. Teaser: What to Expect! 96TeaserWhat to Expect! Audio Sampler Digital Camera
  6. 6. Teaser: What to Expect! 96TeaserWhat to Expect!Navigation System Audio Sampler Digital Camera
  7. 7. Teaser: What to Expect! 96TeaserWhat to Expect! Air LevelNavigation System Audio Sampler Digital Camera
  8. 8. Teaser: What to Expect! 96TeaserWhat to Expect! Ball Game Air LevelNavigation System Audio Sampler Digital Camera
  9. 9. Teaser: What to Expect! 96TeaserWhat to Expect! Compass Ball Game Air LevelNavigation System Audio Sampler Digital Camera
  10. 10. Mobile vs. Desktop: What’s the Difference 92Mobile vs. DesktopWhat’s the Difference
  11. 11. Mobile vs. Desktop: What’s the Difference 92Mobile vs. DesktopWhat’s the Difference Speakers Speakers
  12. 12. Mobile vs. Desktop: What’s the Difference 92Mobile vs. DesktopWhat’s the Difference Speakers Speakers Microphone Microphone
  13. 13. Mobile vs. Desktop: What’s the Difference 92Mobile vs. DesktopWhat’s the Difference Speakers Speakers Microphone Microphone Camera Camera
  14. 14. Mobile vs. Desktop: What’s the Difference 92Mobile vs. DesktopWhat’s the Difference Speakers Speakers Microphone Microphone Camera Camera GPS
  15. 15. Mobile vs. Desktop: What’s the Difference 92Mobile vs. DesktopWhat’s the Difference Speakers Speakers Microphone Microphone Camera Camera GPSAccelerometer
  16. 16. Mobile vs. Desktop: What’s the Difference 92Mobile vs. DesktopWhat’s the Difference Speakers Speakers Microphone Microphone Camera Camera GPSAccelerometer Gyroscope
  17. 17. Mobile vs. Desktop: What’s the Difference 92Mobile vs. DesktopWhat’s the Difference Speakers Speakers Microphone Microphone Camera Camera GPSAccelerometer GyroscopeMagnetometer
  18. 18. Mobile vs. Desktop: What’s the Difference 92Mobile vs. DesktopWhat’s the Difference Speakers Speakers Microphone Microphone Camera Camera GPSAccelerometer Mobile Sensors GyroscopeMagnetometer
  19. 19. Sensors in 12 Device Generations 88Sensors in Device GenerationsGreat Common Denominators With iPodAll 12 Generations - 2007+ Without iPod
  20. 20. Sensors in 12 Device Generations 88 Sensors in Device Generations Great Common Denominators With iPod All 12 Generations - 2007+ Without iPod100.00% 75.00% 50.00% 25.00% 0% Speaker Microphone Accelerometer GPS Camera Gyroscope Magnetometer
  21. 21. Sensors in 7 Device Generations 84 Sensors in Device Generations Great Common Denominators With iPod Latest 7 Generations - 2010+ Without iPod100.00% 75.00% 50.00% 25.00% 0% Speaker Microphone Accelerometer GPS Camera Gyroscope Magnetometer
  22. 22. Sensors in 7 Device Generations 84 Sensors in Device Generations Great Common Denominators With iPod Latest 7 Generations - 2010+ Without iPod100.00% 75.00% 50.00% Majority 25.00% 0% Speaker Microphone Accelerometer GPS Camera Gyroscope Magnetometer
  23. 23. Delegate Pattern 80Delegate PatternQuick Look
  24. 24. Delegate Pattern 80Delegate PatternQuick Look Delegate
  25. 25. Delegate Pattern 80Delegate PatternQuick Look Delegate didArriveAtBar: didDrinkBeerNumber: didUpdateAlcoholLevel: wantsMeToComeHome: didCallCab: didEnterCab: didExitCab:
  26. 26. Roadmap 76RoadmapWhere We’re Going
  27. 27. Light: Implementing a Camera 72LightImplementing a Camera
  28. 28. Light: Implementing a Camera 72 Light Implementing a Camera// setup image picker controllerimagePickerController = [[UIImagePickerController alloc] init];imagePickerController.allowsEditing = NO;imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;imagePickerController.delegate = self;// display[viewController presentModalViewController:imagePickerController animated:YES];// grab photo as soon as it was taken-(void) imagePickerController:(UIImagePickerController *)picker /didFinishPickingMediaWithInfo:(NSDictionary *)info{    // captured image    UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];        // dismiss image picker    [viewController dismissModalViewControllerAnimated:YES];}
  29. 29. Light: Implementing a Camera 72 Light Implementing a Camera// setup image picker controllerimagePickerController = [[UIImagePickerController alloc] init];imagePickerController.allowsEditing = NO;imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;imagePickerController.delegate = self;// display Camera Demo[viewController presentModalViewController:imagePickerController animated:YES];// grab photo as soon as it was taken-(void) imagePickerController:(UIImagePickerController *)picker /didFinishPickingMediaWithInfo:(NSDictionary *)info{    // captured image    UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];        // dismiss image picker    [viewController dismissModalViewControllerAnimated:YES];}
  30. 30. Sound: Implementing a Sound Recorder 68SoundImplementing a Sound Recorder
  31. 31. Sound: Implementing a Sound Recorder 68 Sound Implementing a Sound Recorder// get audio sessionAVAudioSession *audioSession = [AVAudioSession sharedInstance];[audioSession setCategory:AVAudioSessionCategoryRecord error:nil];[audioSession setActive:YES error:nil];// some settings NSMutableDictionary *settings = [[NSMutableDictionary alloc] init];[settings setValue:[NSNumber numberWithInt:kAudioFormatAppleIMA4] forKey:AVFormatIDKey];[settings setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];[settings setValue:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey];    tmpRecording = [NSURL fileURLWithPath:[NSTemporaryDirectory() /stringByAppendingPathComponent:@"recording.caf"]];// start recording  audioRecorder = [[AVAudioRecorder alloc] initWithURL:tmpRecording settings:settingserror:nil];[audioRecorder setDelegate:self];[audioRecorder prepareToRecord];[audioRecorder recordForDuration:2.0];    // do when recording is finished- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag{    isRecording = NO;    }
  32. 32. Sound: Implementing a Sound Player 64SoundImplementing a Sound Player
  33. 33. Sound: Implementing a Sound Player 64 Sound Implementing a Sound Player// get audio sessionAVAudioSession *audioSession = [AVAudioSession sharedInstance];[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];[audioSession setActive:YES error:nil];    tmpRecording = [NSURL fileURLWithPath:[NSTemporaryDirectory() /stringByAppendingPathComponent:@"recording.caf"]];// start playing  AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:tmpRecordingerror:nil];[player setDelegate:self];[player prepareToPlay];[player play];    // do when recording is finished- (void)audioRecorderDidFinishPlaying:(AVAudioRecorder *)recorder successfully:(BOOL)flag{    isPlaying = NO;  }
  34. 34. Sound: Implementing a Sound Player 64 Sound Implementing a Sound Player// get audio sessionAVAudioSession *audioSession = [AVAudioSession sharedInstance];[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];[audioSession setActive:YES error:nil];     Sound DemotmpRecording = [NSURL fileURLWithPath:[NSTemporaryDirectory() /stringByAppendingPathComponent:@"recording.caf"]];// start playing  AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:tmpRecordingerror:nil];[player setDelegate:self];[player prepareToPlay];[player play];    // do when recording is finished- (void)audioRecorderDidFinishPlaying:(AVAudioRecorder *)recorder successfully:(BOOL)flag{    isPlaying = NO;  }
  35. 35. Location: Implementing a Positioning System 60LocationImplementing a Positioning System
  36. 36. Location: Implementing a Positioning System 60 Location Implementing a Positioning System// create location managerlocationManager = [[CLLocationManager alloc] init];locationManager.delegate = self;locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;    // start location update[locationManager startUpdatingLocation];// process position-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{ // access position float latitude = newLocation.coordinate.latitude; float longitude = newLocation.coordinate.longitude;    // one position is enough    [locationManager stopUpdatingLocation];}
  37. 37. Location: Implementing a Positioning System 60 Location Implementing a Positioning System// create location managerlocationManager = [[CLLocationManager alloc] init];locationManager.delegate = self;locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;     Positioning Demo// start location update[locationManager startUpdatingLocation];// process position-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{ // access position float latitude = newLocation.coordinate.latitude; float longitude = newLocation.coordinate.longitude;    // one position is enough    [locationManager stopUpdatingLocation];}
  38. 38. Magnetic Field: Implementing a Compass 56Magnetic FieldImplementing a Compass
  39. 39. Magnetic Field: Implementing a Compass 56 Magnetic Field Implementing a Compass// setup location managerlocationManager = [[CLLocationManager alloc] init];locationManager.delegate = self;[locationManager startUpdatingHeading];// receive update of heading-(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{ // device is pointing ‘heading’ away from north float heading = manager.heading.magneticHeading;    }
  40. 40. Magnetic Field: Implementing a Compass 56 Magnetic Field Implementing a Compass// setup location managerlocationManager = [[CLLocationManager alloc] init];locationManager.delegate = self; Compass Demo[locationManager startUpdatingHeading];// receive update of heading-(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{ // device is pointing ‘heading’ away from north float heading = manager.heading.magneticHeading;    }
  41. 41. Roadmap 52RoadmapWhere We’re Going
  42. 42. Accelerometer: May the Force be with you 48AccelerometerMay the Force be with you
  43. 43. Accelerometer: May the Force be with you 48AccelerometerMay the Force be with you Force in g-force -1.00.0 0.0
  44. 44. Accelerometer: May the Force be with you 48AccelerometerMay the Force be with you Force Rotation in g-force in degrees -1.0 0.00.0 -0.5 0.0 0.5
  45. 45. Accelerometer: May the Force be with you 48AccelerometerMay the Force be with you Force Rotation in g-force in degrees Accelerometer Demo -1.0 0.00.0 -0.5 0.0 0.5
  46. 46. Accelerometer: May the Force be with you 44AccelerometerMay the Force be with you
  47. 47. Accelerometer: May the Force be with you 44 Accelerometer May the Force be with you// enable accelerometer[[UIAccelerometer sharedAccelerometer] setDelegate:self];// receive the acceleration values- (void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { // move ball ball.x += acceleration.x * kBallSpeed; ball.y += acceleration.y * kBallSpeed; // rotate air level level.rotation = acceleration.y * 90;}
  48. 48. Gyroscope: I’m spinnin’ around 40GyroscopeI’m spinnin’ around
  49. 49. Gyroscope: I’m spinnin’ around 40GyroscopeI’m spinnin’ aroundRotation Ratein radians per second 0.00.0 0.0
  50. 50. Gyroscope: I’m spinnin’ around 40GyroscopeI’m spinnin’ aroundRotation Rate Absolute Rotationin radians per second in radians by adding all rates to reference frame 0.0 0.780.0 0.0 0.0 0.0
  51. 51. Gyroscope: I’m spinnin’ around 40GyroscopeI’m spinnin’ aroundRotation Rate Absolute Rotationin radians per second in radians by adding all rates to reference frame Gyroscope Demo 0.0 0.780.0 0.0 0.0 0.0
  52. 52. Gyroscope: I’m spinnin’ around 36GyroscopeI’m spinnin’ around
  53. 53. Gyroscope: I’m spinnin’ around 36 Gyroscope I’m spinnin’ around// create core motion managermotionManager = [[CMMotionManager alloc] init];motionManager.gyroUpdateInterval = 1.0/60.0;[motionManager startGyroUpdates];// frequently call the update method[self schedule:@selector(update:)];// frequently read the gyro data-(void)update:(ccTime)dt { // absolute rotation rotationX += motionManager.gyroData.rotationRate.x; rotationY += motionManager.gyroData.rotationRate.y; // move ball ball.x += rotationX + kBallSpeed; ball.y += rotationY + kBallSpeed; // rotate air level level.rotation = rotationY * 180/PI;}
  54. 54. CoreMotion: Use this! 32CoreMotionUse this!
  55. 55. CoreMotion: Use this! 32CoreMotionUse this! + Raw data Accelerometer + Gyroscope
  56. 56. CoreMotion: Use this! 32CoreMotionUse this! + Raw data Accelerometer + Gyroscope CoreMotion Framework 6 Degrees of Freedom Inertial System Dead Reckoning
  57. 57. CoreMotion: Use this! 28CoreMotionUse this! +
  58. 58. CoreMotion: Use this! 28 CoreMotion Use this! +// create core motion managermotionManager = [[CMMotionManager alloc] init];motionManager.motionUpdateInterval = 1.0/60.0;[motionManager startMotionUpdates];// frequently call the update method[self schedule:@selector(update:)];
  59. 59. CoreMotion: Use this! 20CoreMotionUse this! +
  60. 60. CoreMotion: Use this! 20 CoreMotion Use this! +// frequently read the gyro data-(void)update:(ccTime)dt { // absolute rotation rotationX = motionManager.deviceMotion.attitude.pitch; rotationY = motionManager.deviceMotion.attitude.yaw; rotationZ = motionManager.deviceMotion.attitude.roll; // absolute gravity gravityX = motionManager.deviceMotion.gravity.x; gravityY = motionManager.deviceMotion.gravity.y; gravityZ = motionManager.deviceMotion.gravity.z; // user acceleration accelerationX = motionManager.deviceMotion.userAcceleration.x; accelerationY = motionManager.deviceMotion.userAcceleration.y; accelerationZ = motionManager.deviceMotion.userAcceleration.z;}
  61. 61. CoreMotion: Use this! 20 CoreMotion Use this! +// frequently read the gyro data-(void)update:(ccTime)dt { // absolute rotation rotationX = motionManager.deviceMotion.attitude.pitch; rotationY = rotationZ = CoreMotion Demo motionManager.deviceMotion.attitude.yaw; motionManager.deviceMotion.attitude.roll; // absolute gravity gravityX = motionManager.deviceMotion.gravity.x; gravityY = motionManager.deviceMotion.gravity.y; gravityZ = motionManager.deviceMotion.gravity.z; // user acceleration accelerationX = motionManager.deviceMotion.userAcceleration.x; accelerationY = motionManager.deviceMotion.userAcceleration.y; accelerationZ = motionManager.deviceMotion.userAcceleration.z;}
  62. 62. Roadmap 16RoadmapWhere We’re Going
  63. 63. Summary: What we did not cover 10SummaryWhat we did not cover
  64. 64. Summary: What we did not cover 10SummaryWhat we did not cover GPS Accuracy
  65. 65. Summary: What we did not cover 10SummaryWhat we did not cover Shaking-Motion Events GPS Accuracy
  66. 66. Summary: What we did not cover 10SummaryWhat we did not cover Recording Movies Shaking-Motion Events GPS Accuracy
  67. 67. Summary: What we did not cover 10SummaryWhat we did not cover Sensor Availability Recording Movies Shaking-Motion Events GPS Accuracy
  68. 68. Summary: What we did not cover 10SummaryWhat we did not cover Sensor Availability Recording Movies Shaking-Motion Events GPS Accuracy http://developer.apple.com/library/ios
  69. 69. Summary: What we learned! 5SummaryWhat we learned!
  70. 70. Summary: What we learned! 5SummaryWhat we learned! Capturing Images
  71. 71. Summary: What we learned! 5 Summary What we learned!Recording & Playing Sound Capturing Images
  72. 72. Summary: What we learned! 5 Summary What we learned! Geolocating DeviceRecording & Playing Sound Capturing Images
  73. 73. Summary: What we learned! 5 Summary What we learned!Reading Device Position + 6 Degrees of Freedom Geolocating Device Recording & Playing Sound Capturing Images
  74. 74. Summary: What we learned! 5 Summary What we learned! Finding Magnetic NorthReading Device Position + 6 Degrees of Freedom Geolocating Device Recording & Playing Sound Capturing Images
  75. 75. Thank you: You learned a lot! 0Thank youYou learned a lot!
  76. 76. Thank you: You learned a lot! 0 Download! https://github.com/southdesign/SuperBall Me!Read! Thomas Fankhauser tommylefunk@googlemail.com Thank you Hire! You learned a lot! southdesign.de Buy! Beatfreak PianoTabs QuestionPad
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×