├── ScreenShots
├── ScreenShot1.png
├── ScreenShot2.png
├── ScreenShot3.png
└── ScreenShot4.png
├── Pitch Perfect
├── Assets.xcassets
│ ├── Contents.json
│ ├── AppIcon.appiconset
│ │ ├── Icon-40.png
│ │ ├── Icon-76.png
│ │ ├── Icon-40@2x.png
│ │ ├── Icon-40@3x.png
│ │ ├── Icon-60@2x.png
│ │ ├── Icon-60@3x.png
│ │ ├── Icon-76@2x.png
│ │ ├── Icon-Small.png
│ │ ├── Icon-40@2x-1.png
│ │ ├── Icon-Small@2x-1.png
│ │ ├── Icon-Small@2x.png
│ │ ├── Icon-Small@3x.png
│ │ └── Contents.json
│ ├── echoButton.imageset
│ │ ├── echo_100.png
│ │ ├── echo_200.png
│ │ ├── echo_300.png
│ │ └── Contents.json
│ ├── snailButton.imageset
│ │ ├── slow_100.png
│ │ ├── slow_200.png
│ │ ├── slow_300.png
│ │ └── Contents.json
│ ├── stopButton.imageset
│ │ ├── stop_100.png
│ │ ├── stop_150.png
│ │ ├── stop_50.png
│ │ └── Contents.json
│ ├── rabbitButton.imageset
│ │ ├── fast_100.png
│ │ ├── fast_200.png
│ │ ├── fast_300.png
│ │ └── Contents.json
│ ├── recordButton.imageset
│ │ ├── record_100.png
│ │ ├── record_200.png
│ │ ├── record_300.png
│ │ └── Contents.json
│ ├── reverbButton.imageset
│ │ ├── reverb_100.png
│ │ ├── reverb_200.png
│ │ ├── reverb_300.png
│ │ └── Contents.json
│ ├── chipmunkButton.imageset
│ │ ├── chipmunk_100.png
│ │ ├── chipmunk_200.png
│ │ ├── chipmunk_300.png
│ │ └── Contents.json
│ └── darthVaderButton.imageset
│ │ ├── darthvader_100.png
│ │ ├── darthvader_200.png
│ │ ├── darthvader_300.png
│ │ └── Contents.json
├── RecordedAudio.swift
├── AppConstants.swift
├── Info.plist
├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
├── AppDelegate.swift
├── RecordSoundsViewController.swift
├── PlaySoundsViewController+Audio.swift
└── PlaySoundsViewController.swift
├── Pitch Perfect.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcuserdata
│ │ └── iamsimranjot.xcuserdatad
│ │ └── UserInterfaceState.xcuserstate
├── xcuserdata
│ └── iamsimranjot.xcuserdatad
│ │ ├── xcschemes
│ │ ├── xcschememanagement.plist
│ │ └── Pitch Perfect.xcscheme
│ │ └── xcdebugger
│ │ └── Breakpoints_v2.xcbkptlist
└── project.pbxproj
├── Pitch PerfectTests
├── Info.plist
└── Pitch_PerfectTests.swift
├── Pitch PerfectUITests
├── Info.plist
└── Pitch_PerfectUITests.swift
└── README.md
/ScreenShots/ScreenShot1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/ScreenShots/ScreenShot1.png
--------------------------------------------------------------------------------
/ScreenShots/ScreenShot2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/ScreenShots/ScreenShot2.png
--------------------------------------------------------------------------------
/ScreenShots/ScreenShot3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/ScreenShots/ScreenShot3.png
--------------------------------------------------------------------------------
/ScreenShots/ScreenShot4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/ScreenShots/ScreenShot4.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-40.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-76.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-Small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-Small.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/echoButton.imageset/echo_100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/echoButton.imageset/echo_100.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/echoButton.imageset/echo_200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/echoButton.imageset/echo_200.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/echoButton.imageset/echo_300.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/echoButton.imageset/echo_300.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/snailButton.imageset/slow_100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/snailButton.imageset/slow_100.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/snailButton.imageset/slow_200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/snailButton.imageset/slow_200.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/snailButton.imageset/slow_300.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/snailButton.imageset/slow_300.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/stopButton.imageset/stop_100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/stopButton.imageset/stop_100.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/stopButton.imageset/stop_150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/stopButton.imageset/stop_150.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/stopButton.imageset/stop_50.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/stopButton.imageset/stop_50.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-40@2x-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-40@2x-1.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/rabbitButton.imageset/fast_100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/rabbitButton.imageset/fast_100.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/rabbitButton.imageset/fast_200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/rabbitButton.imageset/fast_200.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/rabbitButton.imageset/fast_300.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/rabbitButton.imageset/fast_300.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/recordButton.imageset/record_100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/recordButton.imageset/record_100.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/recordButton.imageset/record_200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/recordButton.imageset/record_200.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/recordButton.imageset/record_300.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/recordButton.imageset/record_300.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/reverbButton.imageset/reverb_100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/reverbButton.imageset/reverb_100.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/reverbButton.imageset/reverb_200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/reverbButton.imageset/reverb_200.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/reverbButton.imageset/reverb_300.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/reverbButton.imageset/reverb_300.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/chipmunkButton.imageset/chipmunk_100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/chipmunkButton.imageset/chipmunk_100.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/chipmunkButton.imageset/chipmunk_200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/chipmunkButton.imageset/chipmunk_200.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/chipmunkButton.imageset/chipmunk_300.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/chipmunkButton.imageset/chipmunk_300.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/darthVaderButton.imageset/darthvader_100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/darthVaderButton.imageset/darthvader_100.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/darthVaderButton.imageset/darthvader_200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/darthVaderButton.imageset/darthvader_200.png
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/darthVaderButton.imageset/darthvader_300.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/darthVaderButton.imageset/darthvader_300.png
--------------------------------------------------------------------------------
/Pitch Perfect.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Pitch Perfect.xcodeproj/project.xcworkspace/xcuserdata/iamsimranjot.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect.xcodeproj/project.xcworkspace/xcuserdata/iamsimranjot.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/stopButton.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "stop_50.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "stop_100.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "stop_150.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/echoButton.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "echo_100.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "echo_200.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "echo_300.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/rabbitButton.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "fast_100.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "fast_200.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "fast_300.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/snailButton.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "slow_100.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "slow_200.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "slow_300.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/recordButton.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "record_100.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "record_200.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "record_300.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/reverbButton.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "reverb_100.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "reverb_200.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "reverb_300.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/chipmunkButton.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "chipmunk_100.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "chipmunk_200.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "chipmunk_300.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/darthVaderButton.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "darthvader_100.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "darthvader_200.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "darthvader_300.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/Pitch Perfect/RecordedAudio.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RecordedAudio.swift
3 | // Pitch Perfect
4 | //
5 | // Created by SimranJot Singh on 14/10/16.
6 | // Copyright © 2016 SimranJot Singh. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | //We can think of this class acting as a Model
12 |
13 | class RecordedAudio: NSObject {
14 |
15 | //Properties
16 |
17 | var filePathUrl: NSURL!
18 | var title: String! {
19 |
20 | get{
21 |
22 | return filePathUrl.lastPathComponent
23 | }
24 | }
25 |
26 | //Initializer
27 |
28 | init(filePathUrl: NSURL) {
29 | self.filePathUrl = filePathUrl
30 | }
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/Pitch PerfectTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/Pitch PerfectUITests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/Pitch Perfect.xcodeproj/xcuserdata/iamsimranjot.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | Pitch Perfect.xcscheme
8 |
9 | orderHint
10 | 0
11 |
12 |
13 | SuppressBuildableAutocreation
14 |
15 | 701C3A351D9693E2006F14A7
16 |
17 | primary
18 |
19 |
20 | 701C3A491D9693E2006F14A7
21 |
22 | primary
23 |
24 |
25 | 701C3A541D9693E2006F14A7
26 |
27 | primary
28 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/Pitch PerfectTests/Pitch_PerfectTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Pitch_PerfectTests.swift
3 | // Pitch PerfectTests
4 | //
5 | // Created by SimranJot Singh on 13/10/16.
6 | // Copyright © 2016 SimranJot Singh. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | @testable import Pitch_Perfect
11 |
12 | class Pitch_PerfectTests: XCTestCase {
13 |
14 | override func setUp() {
15 | super.setUp()
16 | // Put setup code here. This method is called before the invocation of each test method in the class.
17 | }
18 |
19 | override func tearDown() {
20 | // Put teardown code here. This method is called after the invocation of each test method in the class.
21 | super.tearDown()
22 | }
23 |
24 | func testExample() {
25 | // This is an example of a functional test case.
26 | // Use XCTAssert and related functions to verify your tests produce the correct results.
27 | }
28 |
29 | func testPerformanceExample() {
30 | // This is an example of a performance test case.
31 | self.measure {
32 | // Put the code you want to measure the time of here.
33 | }
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/Pitch Perfect/AppConstants.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppConstants.swift
3 | // Pitch Perfect
4 | //
5 | // Created by SimranJot Singh on 14/10/16.
6 | // Copyright © 2016 SimranJot Singh. All rights reserved.
7 | //
8 |
9 | struct AppConstants {
10 |
11 | static let audioFileName = "recordedVoice.wav"
12 | static let stopRecordingSegueIdentifier = "stopRecording"
13 |
14 | struct labels {
15 |
16 | static let Recording = "Recording in Progress"
17 | static let ReadyToRecord = "Tap to Record"
18 | }
19 |
20 | struct alerts {
21 |
22 | static let dismiss = "Dismiss"
23 | static let recordingAudioError = "Audio Recording Error"
24 | static let recordingUnsuccessful = "Recording Un-Successful"
25 | static let recordingUnsuccessfulMessage = "Something went wrong with your recording."
26 | static let audioSessionError = "Audio Session Error"
27 | static let audioRecorderError = "Audio Recorder Error"
28 | static let recordingDisabledTitle = "Recording Disabled"
29 | static let recordingDisabledMessage = "You've disabled Pitch Perfect from recording your microphone. Check Settings."
30 | static let audioFileError = "Audio File Error"
31 | static let audioEngineError = "Audio Engine Error"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/Pitch PerfectUITests/Pitch_PerfectUITests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Pitch_PerfectUITests.swift
3 | // Pitch PerfectUITests
4 | //
5 | // Created by SimranJot Singh on 13/10/16.
6 | // Copyright © 2016 SimranJot Singh. All rights reserved.
7 | //
8 |
9 | import XCTest
10 |
11 | class Pitch_PerfectUITests: XCTestCase {
12 |
13 | override func setUp() {
14 | super.setUp()
15 |
16 | // Put setup code here. This method is called before the invocation of each test method in the class.
17 |
18 | // In UI tests it is usually best to stop immediately when a failure occurs.
19 | continueAfterFailure = false
20 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
21 | if #available(iOS 9.0, *) {
22 | XCUIApplication().launch()
23 | } else {
24 | // Fallback on earlier versions
25 | }
26 |
27 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
28 | }
29 |
30 | override func tearDown() {
31 | // Put teardown code here. This method is called after the invocation of each test method in the class.
32 | super.tearDown()
33 | }
34 |
35 | func testExample() {
36 | // Use recording to get started writing UI tests.
37 | // Use XCTAssert and related functions to verify your tests produce the correct results.
38 | }
39 |
40 | }
41 |
--------------------------------------------------------------------------------
/Pitch Perfect/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UILaunchStoryboardName
24 | LaunchScreen
25 | UIMainStoryboardFile
26 | Main
27 | UIRequiredDeviceCapabilities
28 |
29 | armv7
30 |
31 | UISupportedInterfaceOrientations
32 |
33 | UIInterfaceOrientationPortrait
34 | UIInterfaceOrientationLandscapeLeft
35 | UIInterfaceOrientationLandscapeRight
36 |
37 | UISupportedInterfaceOrientations~ipad
38 |
39 | UIInterfaceOrientationPortrait
40 | UIInterfaceOrientationPortraitUpsideDown
41 | UIInterfaceOrientationLandscapeLeft
42 | UIInterfaceOrientationLandscapeRight
43 |
44 | NSMicrophoneUsageDescription
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Pitch-Perfect
2 | ### iOS Developer Nano Degree Project
3 |
4 | The Pitch Perfect app is result of Intro to iOS App Development with Swift lesson of Udacity's iOS Developer Nanodegree course.
5 |
6 | The App allows users to Record a sound using the Device’s Microphone. It then Allows Users to Play the Recorded Sound back with six different Sound Modulations: _Chipmunk_, _Darth Vader_, _Slow_, Fast with _Reverb_ and _Echo_ effect.
7 |
8 | Basic features Based on the criteria found in here:
9 | - https://docs.google.com/document/d/1LlcUT90j-ItbRQpB3ivLHwjP-KgKOUdoOLpz0WirpSo/pub?embedded=true
10 |
11 |   
12 |
13 | ## Implementation
14 |
15 | Pitch Perfect has two Scenes:
16 |
17 | - **RecordSoundsViewController** : consists a record button with a microphone image. Tapping this microphone button starts an audio recording session and present a stop button. When the stop button is clicked, the app completes recording and then show the PlaySound controller.
18 | - **PlaySoundsViewController** : contains six buttons to play the recorded sound file with different effects related to the button image and a stop button at the bottom
19 |
20 | *The App supports both orientations. I have varied traits for the landscape orientation of PlaySoundsViewController to make it look good with the use of stack views. App also gives a nice Pop Animation when ever we change the orientation.*
21 |
22 | The application uses code from `AVFoundation` to record sounds from the microphone `(AVAudioRecorder)` and play recorded audio with effects `(AVAudioPlayer, AVAudioEngine)`.
23 |
24 | ## Requirements
25 |
26 | - Xcode 8 Above
27 | - Swift 3.0
28 |
--------------------------------------------------------------------------------
/Pitch Perfect/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/Pitch Perfect/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // Pitch Perfect
4 | //
5 | // Created by SimranJot Singh on 13/10/16.
6 | // Copyright © 2016 SimranJot Singh. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 | var window: UIWindow?
15 |
16 |
17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
18 | // Override point for customization after application launch.
19 | return true
20 | }
21 |
22 | func applicationWillResignActive(_ application: UIApplication) {
23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
24 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
25 | }
26 |
27 | func applicationDidEnterBackground(_ application: UIApplication) {
28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
30 | }
31 |
32 | func applicationWillEnterForeground(_ application: UIApplication) {
33 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
34 | }
35 |
36 | func applicationDidBecomeActive(_ application: UIApplication) {
37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
38 | }
39 |
40 | func applicationWillTerminate(_ application: UIApplication) {
41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
42 | }
43 |
44 |
45 | }
46 |
47 |
--------------------------------------------------------------------------------
/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "size" : "29x29",
15 | "idiom" : "iphone",
16 | "filename" : "Icon-Small@2x.png",
17 | "scale" : "2x"
18 | },
19 | {
20 | "size" : "29x29",
21 | "idiom" : "iphone",
22 | "filename" : "Icon-Small@3x.png",
23 | "scale" : "3x"
24 | },
25 | {
26 | "size" : "40x40",
27 | "idiom" : "iphone",
28 | "filename" : "Icon-40@2x.png",
29 | "scale" : "2x"
30 | },
31 | {
32 | "size" : "40x40",
33 | "idiom" : "iphone",
34 | "filename" : "Icon-40@3x.png",
35 | "scale" : "3x"
36 | },
37 | {
38 | "size" : "60x60",
39 | "idiom" : "iphone",
40 | "filename" : "Icon-60@2x.png",
41 | "scale" : "2x"
42 | },
43 | {
44 | "size" : "60x60",
45 | "idiom" : "iphone",
46 | "filename" : "Icon-60@3x.png",
47 | "scale" : "3x"
48 | },
49 | {
50 | "idiom" : "ipad",
51 | "size" : "20x20",
52 | "scale" : "1x"
53 | },
54 | {
55 | "idiom" : "ipad",
56 | "size" : "20x20",
57 | "scale" : "2x"
58 | },
59 | {
60 | "size" : "29x29",
61 | "idiom" : "ipad",
62 | "filename" : "Icon-Small.png",
63 | "scale" : "1x"
64 | },
65 | {
66 | "size" : "29x29",
67 | "idiom" : "ipad",
68 | "filename" : "Icon-Small@2x-1.png",
69 | "scale" : "2x"
70 | },
71 | {
72 | "size" : "40x40",
73 | "idiom" : "ipad",
74 | "filename" : "Icon-40.png",
75 | "scale" : "1x"
76 | },
77 | {
78 | "size" : "40x40",
79 | "idiom" : "ipad",
80 | "filename" : "Icon-40@2x-1.png",
81 | "scale" : "2x"
82 | },
83 | {
84 | "size" : "76x76",
85 | "idiom" : "ipad",
86 | "filename" : "Icon-76.png",
87 | "scale" : "1x"
88 | },
89 | {
90 | "size" : "76x76",
91 | "idiom" : "ipad",
92 | "filename" : "Icon-76@2x.png",
93 | "scale" : "2x"
94 | },
95 | {
96 | "idiom" : "ipad",
97 | "size" : "83.5x83.5",
98 | "scale" : "2x"
99 | }
100 | ],
101 | "info" : {
102 | "version" : 1,
103 | "author" : "xcode"
104 | }
105 | }
--------------------------------------------------------------------------------
/Pitch Perfect.xcodeproj/xcuserdata/iamsimranjot.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
8 |
14 |
15 |
16 |
18 |
30 |
31 |
32 |
34 |
46 |
47 |
48 |
50 |
62 |
63 |
64 |
65 |
66 |
--------------------------------------------------------------------------------
/Pitch Perfect.xcodeproj/xcuserdata/iamsimranjot.xcuserdatad/xcschemes/Pitch Perfect.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
33 |
39 |
40 |
41 |
43 |
49 |
50 |
51 |
52 |
53 |
59 |
60 |
61 |
62 |
63 |
64 |
74 |
76 |
82 |
83 |
84 |
85 |
86 |
87 |
93 |
95 |
101 |
102 |
103 |
104 |
106 |
107 |
110 |
111 |
112 |
--------------------------------------------------------------------------------
/Pitch Perfect/RecordSoundsViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RecordSoundsViewController.swift
3 | // Pitch Perfect
4 | //
5 | // Created by SimranJot Singh on 13/10/16.
6 | // Copyright © 2016 SimranJot Singh. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import AVFoundation
11 |
12 | class RecordSoundsViewController: UIViewController {
13 |
14 | //MARK: Outlets
15 |
16 | @IBOutlet weak var recordingLabel: UILabel!
17 | @IBOutlet weak var recordButton: UIButton!
18 | @IBOutlet weak var stopRecordingButton: UIButton!
19 |
20 | //MARK: Properties
21 |
22 | var audioRecorder: AVAudioRecorder!
23 | var recordedAudio: RecordedAudio!
24 | private var recordingEnabled: Bool! = false
25 |
26 | //MARK:: Enum
27 |
28 | enum RecordingState { case WaitingToRecord, Recording }
29 |
30 | //MARK: LifeCycle Methods
31 |
32 | override func viewDidLoad() {
33 | super.viewDidLoad()
34 |
35 | //Congigure Audio Session
36 | configureAudioSession()
37 | }
38 |
39 | override func viewWillAppear(_ animated: Bool) {
40 | super.viewWillAppear(animated)
41 |
42 | configureUI(recordingState: .WaitingToRecord)
43 | }
44 |
45 | //MARK: IBActions
46 |
47 | @IBAction func recordAudio(_ sender: AnyObject) {
48 |
49 | guard recordingEnabled == true else {
50 |
51 | showAlert(title: AppConstants.alerts.recordingDisabledTitle, errorMessage: AppConstants.alerts.recordingDisabledMessage)
52 | return
53 | }
54 |
55 | configureUI(recordingState: .Recording)
56 |
57 | do {
58 | recordedAudio = RecordedAudio(filePathUrl: createAudioFilePath())
59 | audioRecorder = try AVAudioRecorder(url: recordedAudio.filePathUrl as URL, settings: [:])
60 | audioRecorder.delegate = self
61 | } catch {
62 |
63 | showAlert(title: AppConstants.alerts.audioRecorderError, errorMessage: String(describing: error))
64 | }
65 |
66 | audioRecorder.isMeteringEnabled = true
67 | audioRecorder.prepareToRecord()
68 | audioRecorder.record()
69 | }
70 |
71 | @IBAction func stopRecording(_ sender: AnyObject) {
72 |
73 | audioRecorder.stop()
74 |
75 | let audioSession = AVAudioSession.sharedInstance()
76 | try! audioSession.setActive(false)
77 |
78 | }
79 |
80 | //MARK: Helper Methods
81 |
82 | private func createAudioFilePath() -> NSURL {
83 |
84 | let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) as [String]
85 | let documentsDirectory = paths[0]
86 | let audioURL = NSURL(fileURLWithPath: documentsDirectory).appendingPathComponent(AppConstants.audioFileName)!
87 | return audioURL as NSURL
88 | }
89 |
90 | private func configureAudioSession(){
91 |
92 | let session = AVAudioSession.sharedInstance()
93 | do {
94 |
95 | try session.setCategory(AVAudioSessionCategoryPlayAndRecord, with: AVAudioSessionCategoryOptions.defaultToSpeaker)
96 | try session.setActive(true)
97 | session.requestRecordPermission{ (granted) in
98 | self.recordingEnabled = granted
99 | }
100 | } catch {
101 |
102 | showAlert(title: AppConstants.alerts.audioSessionError, errorMessage: String(describing: error))
103 | }
104 | }
105 |
106 | private func configureUI(recordingState: RecordingState) {
107 |
108 | switch recordingState {
109 |
110 | case .WaitingToRecord:
111 | recordingLabel.text = AppConstants.labels.ReadyToRecord
112 | recordButton.isEnabled = true
113 | stopRecordingButton.isEnabled = false
114 |
115 | case .Recording:
116 | recordingLabel.text = AppConstants.labels.Recording
117 | recordButton.isEnabled = false
118 | stopRecordingButton.isEnabled = true
119 | }
120 | }
121 |
122 | func showAlert(title: String, errorMessage: String) {
123 |
124 | let alert = UIAlertController(title: title, message: errorMessage, preferredStyle: .alert)
125 | alert.addAction(UIAlertAction(title: AppConstants.alerts.dismiss, style: .default, handler: { (UIAlertAction) in
126 | self.configureUI(recordingState: .WaitingToRecord)
127 | }))
128 |
129 | present(alert, animated: true, completion: nil)
130 | }
131 |
132 | //MARK: prepareForSegue
133 |
134 | override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
135 |
136 | if (segue.identifier == AppConstants.stopRecordingSegueIdentifier) {
137 | let playSoundsVC = segue.destination as! PlaySoundsViewController
138 | let recordedAudioURL = sender as! RecordedAudio
139 | playSoundsVC.receivedAudioURL = recordedAudioURL
140 | playSoundsVC.view.layoutIfNeeded()
141 | }
142 | }
143 | }
144 |
145 | //MARK: AVAudioRecorderDelegate Extension
146 |
147 | extension RecordSoundsViewController: AVAudioRecorderDelegate {
148 |
149 | func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
150 |
151 | if(flag){
152 |
153 | self.performSegue(withIdentifier: AppConstants.stopRecordingSegueIdentifier, sender: recordedAudio)
154 |
155 | }else{
156 |
157 | showAlert(title: AppConstants.alerts.recordingUnsuccessful, errorMessage: AppConstants.alerts.recordingUnsuccessfulMessage)
158 | }
159 | }
160 |
161 | func audioRecorderEncodeErrorDidOccur(_ recorder: AVAudioRecorder, error: Error?) {
162 |
163 | if let error = error {
164 |
165 | showAlert(title: AppConstants.alerts.recordingAudioError, errorMessage: error.localizedDescription)
166 | }
167 |
168 | }
169 | }
170 |
171 |
--------------------------------------------------------------------------------
/Pitch Perfect/PlaySoundsViewController+Audio.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PlaySoundsViewController+Audio.swift
3 | // PitchPerfect
4 | //
5 | // Copyright © 2016 Udacity. All rights reserved.
6 | //
7 | import UIKit
8 | import AVFoundation
9 |
10 | extension PlaySoundsViewController: AVAudioPlayerDelegate {
11 |
12 | // raw values correspond to sender tags
13 | enum PlayingState { case Playing, NotPlaying }
14 |
15 |
16 | // MARK: Audio Functions
17 |
18 | func setupAudio() {
19 | // initialize (recording) audio file
20 | do {
21 | audioFile = try AVAudioFile(forReading: receivedAudioURL.filePathUrl as URL)
22 | } catch {
23 |
24 | showAlert(title: AppConstants.alerts.audioFileError, message: String(describing: error))
25 | }
26 | print("Audio has been setup")
27 | }
28 |
29 | func playSound(rate: Float? = nil, pitch: Float? = nil, echo: Bool = false, reverb: Bool = false) {
30 |
31 | // initialize audio engine components
32 | audioEngine = AVAudioEngine()
33 |
34 | // node for playing audio
35 | audioPlayerNode = AVAudioPlayerNode()
36 | audioEngine.attach(audioPlayerNode)
37 |
38 | // node for adjusting rate/pitch
39 | let changeRatePitchNode = AVAudioUnitTimePitch()
40 | if let pitch = pitch {
41 | changeRatePitchNode.pitch = pitch
42 | }
43 | if let rate = rate {
44 | changeRatePitchNode.rate = rate
45 | }
46 | audioEngine.attach(changeRatePitchNode)
47 |
48 | // node for echo
49 | let echoNode = AVAudioUnitDistortion()
50 | echoNode.loadFactoryPreset(.multiEcho1)
51 | audioEngine.attach(echoNode)
52 |
53 | // node for reverb
54 | let reverbNode = AVAudioUnitReverb()
55 | reverbNode.loadFactoryPreset(.cathedral)
56 | reverbNode.wetDryMix = 50
57 | audioEngine.attach(reverbNode)
58 |
59 | // connect nodes
60 | if echo == true && reverb == true {
61 | connectAudioNodes(nodes: audioPlayerNode, changeRatePitchNode, echoNode, reverbNode, audioEngine.outputNode)
62 | } else if echo == true {
63 | connectAudioNodes(nodes: audioPlayerNode, changeRatePitchNode, echoNode, audioEngine.outputNode)
64 | } else if reverb == true {
65 | connectAudioNodes(nodes: audioPlayerNode, changeRatePitchNode, reverbNode, audioEngine.outputNode)
66 | } else {
67 | connectAudioNodes(nodes: audioPlayerNode, changeRatePitchNode, audioEngine.outputNode)
68 | }
69 |
70 | // schedule to play and start the engine!
71 | audioPlayerNode.stop()
72 | audioPlayerNode.scheduleFile(audioFile, at: nil) {
73 |
74 | var delayInSeconds: Double = 0
75 |
76 | if let lastRenderTime = self.audioPlayerNode.lastRenderTime, let playerTime = self.audioPlayerNode.playerTime(forNodeTime: lastRenderTime) {
77 |
78 | if let rate = rate {
79 | delayInSeconds = Double(self.audioFile.length - playerTime.sampleTime) / Double(self.audioFile.processingFormat.sampleRate) / Double(rate)
80 | } else {
81 | delayInSeconds = Double(self.audioFile.length - playerTime.sampleTime) / Double(self.audioFile.processingFormat.sampleRate)
82 | }
83 | }
84 |
85 | // schedule a stop timer for when audio finishes playing
86 | self.stopTimer = Timer(timeInterval: delayInSeconds, target: self, selector: #selector(PlaySoundsViewController.stopAudio), userInfo: nil, repeats: false)
87 | RunLoop.main.add(self.stopTimer!, forMode: RunLoopMode.defaultRunLoopMode)
88 | }
89 |
90 | do {
91 | try audioEngine.start()
92 | } catch {
93 | showAlert(title: AppConstants.alerts.audioEngineError, message: String(describing: error))
94 | return
95 | }
96 |
97 | // play the recording!
98 | audioPlayerNode.play()
99 | }
100 |
101 |
102 | // MARK: Connect List of Audio Nodes
103 |
104 | func connectAudioNodes(nodes: AVAudioNode...) {
105 | for x in 0..
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
30 |
35 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
86 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
104 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
122 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
--------------------------------------------------------------------------------
/Pitch Perfect.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 701C3A3A1D9693E2006F14A7 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 701C3A391D9693E2006F14A7 /* AppDelegate.swift */; };
11 | 701C3A3C1D9693E2006F14A7 /* RecordSoundsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 701C3A3B1D9693E2006F14A7 /* RecordSoundsViewController.swift */; };
12 | 701C3A3F1D9693E2006F14A7 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 701C3A3D1D9693E2006F14A7 /* Main.storyboard */; };
13 | 701C3A411D9693E2006F14A7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 701C3A401D9693E2006F14A7 /* Assets.xcassets */; };
14 | 701C3A441D9693E2006F14A7 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 701C3A421D9693E2006F14A7 /* LaunchScreen.storyboard */; };
15 | 701C3A4F1D9693E2006F14A7 /* Pitch_PerfectTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 701C3A4E1D9693E2006F14A7 /* Pitch_PerfectTests.swift */; };
16 | 701C3A5A1D9693E2006F14A7 /* Pitch_PerfectUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 701C3A591D9693E2006F14A7 /* Pitch_PerfectUITests.swift */; };
17 | 704EB53E1D96FCC8007B36B5 /* PlaySoundsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 704EB53D1D96FCC8007B36B5 /* PlaySoundsViewController.swift */; };
18 | 704EB5401D97143F007B36B5 /* PlaySoundsViewController+Audio.swift in Sources */ = {isa = PBXBuildFile; fileRef = 704EB53F1D97143F007B36B5 /* PlaySoundsViewController+Audio.swift */; };
19 | 70D884281DB01F56004B69A7 /* AppConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70D884271DB01F55004B69A7 /* AppConstants.swift */; };
20 | 70D8842A1DB0AC22004B69A7 /* RecordedAudio.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70D884291DB0AC22004B69A7 /* RecordedAudio.swift */; };
21 | /* End PBXBuildFile section */
22 |
23 | /* Begin PBXContainerItemProxy section */
24 | 701C3A4B1D9693E2006F14A7 /* PBXContainerItemProxy */ = {
25 | isa = PBXContainerItemProxy;
26 | containerPortal = 701C3A2E1D9693E2006F14A7 /* Project object */;
27 | proxyType = 1;
28 | remoteGlobalIDString = 701C3A351D9693E2006F14A7;
29 | remoteInfo = "Pitch Perfect";
30 | };
31 | 701C3A561D9693E2006F14A7 /* PBXContainerItemProxy */ = {
32 | isa = PBXContainerItemProxy;
33 | containerPortal = 701C3A2E1D9693E2006F14A7 /* Project object */;
34 | proxyType = 1;
35 | remoteGlobalIDString = 701C3A351D9693E2006F14A7;
36 | remoteInfo = "Pitch Perfect";
37 | };
38 | /* End PBXContainerItemProxy section */
39 |
40 | /* Begin PBXFileReference section */
41 | 701C3A361D9693E2006F14A7 /* Pitch Perfect.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Pitch Perfect.app"; sourceTree = BUILT_PRODUCTS_DIR; };
42 | 701C3A391D9693E2006F14A7 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
43 | 701C3A3B1D9693E2006F14A7 /* RecordSoundsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordSoundsViewController.swift; sourceTree = ""; };
44 | 701C3A3E1D9693E2006F14A7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
45 | 701C3A401D9693E2006F14A7 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
46 | 701C3A431D9693E2006F14A7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
47 | 701C3A451D9693E2006F14A7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
48 | 701C3A4A1D9693E2006F14A7 /* Pitch PerfectTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Pitch PerfectTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
49 | 701C3A4E1D9693E2006F14A7 /* Pitch_PerfectTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Pitch_PerfectTests.swift; sourceTree = ""; };
50 | 701C3A501D9693E2006F14A7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
51 | 701C3A551D9693E2006F14A7 /* Pitch PerfectUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Pitch PerfectUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
52 | 701C3A591D9693E2006F14A7 /* Pitch_PerfectUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Pitch_PerfectUITests.swift; sourceTree = ""; };
53 | 701C3A5B1D9693E2006F14A7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
54 | 704EB53D1D96FCC8007B36B5 /* PlaySoundsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlaySoundsViewController.swift; sourceTree = ""; };
55 | 704EB53F1D97143F007B36B5 /* PlaySoundsViewController+Audio.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "PlaySoundsViewController+Audio.swift"; sourceTree = ""; };
56 | 70D884271DB01F55004B69A7 /* AppConstants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppConstants.swift; sourceTree = ""; };
57 | 70D884291DB0AC22004B69A7 /* RecordedAudio.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecordedAudio.swift; sourceTree = ""; };
58 | /* End PBXFileReference section */
59 |
60 | /* Begin PBXFrameworksBuildPhase section */
61 | 701C3A331D9693E2006F14A7 /* Frameworks */ = {
62 | isa = PBXFrameworksBuildPhase;
63 | buildActionMask = 2147483647;
64 | files = (
65 | );
66 | runOnlyForDeploymentPostprocessing = 0;
67 | };
68 | 701C3A471D9693E2006F14A7 /* Frameworks */ = {
69 | isa = PBXFrameworksBuildPhase;
70 | buildActionMask = 2147483647;
71 | files = (
72 | );
73 | runOnlyForDeploymentPostprocessing = 0;
74 | };
75 | 701C3A521D9693E2006F14A7 /* Frameworks */ = {
76 | isa = PBXFrameworksBuildPhase;
77 | buildActionMask = 2147483647;
78 | files = (
79 | );
80 | runOnlyForDeploymentPostprocessing = 0;
81 | };
82 | /* End PBXFrameworksBuildPhase section */
83 |
84 | /* Begin PBXGroup section */
85 | 701C3A2D1D9693E2006F14A7 = {
86 | isa = PBXGroup;
87 | children = (
88 | 701C3A381D9693E2006F14A7 /* Pitch Perfect */,
89 | 701C3A4D1D9693E2006F14A7 /* Pitch PerfectTests */,
90 | 701C3A581D9693E2006F14A7 /* Pitch PerfectUITests */,
91 | 701C3A371D9693E2006F14A7 /* Products */,
92 | );
93 | sourceTree = "";
94 | };
95 | 701C3A371D9693E2006F14A7 /* Products */ = {
96 | isa = PBXGroup;
97 | children = (
98 | 701C3A361D9693E2006F14A7 /* Pitch Perfect.app */,
99 | 701C3A4A1D9693E2006F14A7 /* Pitch PerfectTests.xctest */,
100 | 701C3A551D9693E2006F14A7 /* Pitch PerfectUITests.xctest */,
101 | );
102 | name = Products;
103 | sourceTree = "";
104 | };
105 | 701C3A381D9693E2006F14A7 /* Pitch Perfect */ = {
106 | isa = PBXGroup;
107 | children = (
108 | 701C3A391D9693E2006F14A7 /* AppDelegate.swift */,
109 | 701C3A3B1D9693E2006F14A7 /* RecordSoundsViewController.swift */,
110 | 70D884291DB0AC22004B69A7 /* RecordedAudio.swift */,
111 | 70D884271DB01F55004B69A7 /* AppConstants.swift */,
112 | 704EB53D1D96FCC8007B36B5 /* PlaySoundsViewController.swift */,
113 | 704EB53F1D97143F007B36B5 /* PlaySoundsViewController+Audio.swift */,
114 | 701C3A3D1D9693E2006F14A7 /* Main.storyboard */,
115 | 701C3A401D9693E2006F14A7 /* Assets.xcassets */,
116 | 701C3A421D9693E2006F14A7 /* LaunchScreen.storyboard */,
117 | 701C3A451D9693E2006F14A7 /* Info.plist */,
118 | );
119 | path = "Pitch Perfect";
120 | sourceTree = "";
121 | };
122 | 701C3A4D1D9693E2006F14A7 /* Pitch PerfectTests */ = {
123 | isa = PBXGroup;
124 | children = (
125 | 701C3A4E1D9693E2006F14A7 /* Pitch_PerfectTests.swift */,
126 | 701C3A501D9693E2006F14A7 /* Info.plist */,
127 | );
128 | path = "Pitch PerfectTests";
129 | sourceTree = "";
130 | };
131 | 701C3A581D9693E2006F14A7 /* Pitch PerfectUITests */ = {
132 | isa = PBXGroup;
133 | children = (
134 | 701C3A591D9693E2006F14A7 /* Pitch_PerfectUITests.swift */,
135 | 701C3A5B1D9693E2006F14A7 /* Info.plist */,
136 | );
137 | path = "Pitch PerfectUITests";
138 | sourceTree = "";
139 | };
140 | /* End PBXGroup section */
141 |
142 | /* Begin PBXNativeTarget section */
143 | 701C3A351D9693E2006F14A7 /* Pitch Perfect */ = {
144 | isa = PBXNativeTarget;
145 | buildConfigurationList = 701C3A5E1D9693E3006F14A7 /* Build configuration list for PBXNativeTarget "Pitch Perfect" */;
146 | buildPhases = (
147 | 701C3A321D9693E2006F14A7 /* Sources */,
148 | 701C3A331D9693E2006F14A7 /* Frameworks */,
149 | 701C3A341D9693E2006F14A7 /* Resources */,
150 | );
151 | buildRules = (
152 | );
153 | dependencies = (
154 | );
155 | name = "Pitch Perfect";
156 | productName = "Pitch Perfect";
157 | productReference = 701C3A361D9693E2006F14A7 /* Pitch Perfect.app */;
158 | productType = "com.apple.product-type.application";
159 | };
160 | 701C3A491D9693E2006F14A7 /* Pitch PerfectTests */ = {
161 | isa = PBXNativeTarget;
162 | buildConfigurationList = 701C3A611D9693E3006F14A7 /* Build configuration list for PBXNativeTarget "Pitch PerfectTests" */;
163 | buildPhases = (
164 | 701C3A461D9693E2006F14A7 /* Sources */,
165 | 701C3A471D9693E2006F14A7 /* Frameworks */,
166 | 701C3A481D9693E2006F14A7 /* Resources */,
167 | );
168 | buildRules = (
169 | );
170 | dependencies = (
171 | 701C3A4C1D9693E2006F14A7 /* PBXTargetDependency */,
172 | );
173 | name = "Pitch PerfectTests";
174 | productName = "Pitch PerfectTests";
175 | productReference = 701C3A4A1D9693E2006F14A7 /* Pitch PerfectTests.xctest */;
176 | productType = "com.apple.product-type.bundle.unit-test";
177 | };
178 | 701C3A541D9693E2006F14A7 /* Pitch PerfectUITests */ = {
179 | isa = PBXNativeTarget;
180 | buildConfigurationList = 701C3A641D9693E3006F14A7 /* Build configuration list for PBXNativeTarget "Pitch PerfectUITests" */;
181 | buildPhases = (
182 | 701C3A511D9693E2006F14A7 /* Sources */,
183 | 701C3A521D9693E2006F14A7 /* Frameworks */,
184 | 701C3A531D9693E2006F14A7 /* Resources */,
185 | );
186 | buildRules = (
187 | );
188 | dependencies = (
189 | 701C3A571D9693E2006F14A7 /* PBXTargetDependency */,
190 | );
191 | name = "Pitch PerfectUITests";
192 | productName = "Pitch PerfectUITests";
193 | productReference = 701C3A551D9693E2006F14A7 /* Pitch PerfectUITests.xctest */;
194 | productType = "com.apple.product-type.bundle.ui-testing";
195 | };
196 | /* End PBXNativeTarget section */
197 |
198 | /* Begin PBXProject section */
199 | 701C3A2E1D9693E2006F14A7 /* Project object */ = {
200 | isa = PBXProject;
201 | attributes = {
202 | LastSwiftUpdateCheck = 0800;
203 | LastUpgradeCheck = 0800;
204 | ORGANIZATIONNAME = "SimranJot Singh";
205 | TargetAttributes = {
206 | 701C3A351D9693E2006F14A7 = {
207 | CreatedOnToolsVersion = 8.0;
208 | ProvisioningStyle = Automatic;
209 | };
210 | 701C3A491D9693E2006F14A7 = {
211 | CreatedOnToolsVersion = 8.0;
212 | ProvisioningStyle = Automatic;
213 | };
214 | 701C3A541D9693E2006F14A7 = {
215 | CreatedOnToolsVersion = 8.0;
216 | ProvisioningStyle = Automatic;
217 | };
218 | };
219 | };
220 | buildConfigurationList = 701C3A311D9693E2006F14A7 /* Build configuration list for PBXProject "Pitch Perfect" */;
221 | compatibilityVersion = "Xcode 3.2";
222 | developmentRegion = English;
223 | hasScannedForEncodings = 0;
224 | knownRegions = (
225 | en,
226 | Base,
227 | );
228 | mainGroup = 701C3A2D1D9693E2006F14A7;
229 | productRefGroup = 701C3A371D9693E2006F14A7 /* Products */;
230 | projectDirPath = "";
231 | projectRoot = "";
232 | targets = (
233 | 701C3A351D9693E2006F14A7 /* Pitch Perfect */,
234 | 701C3A491D9693E2006F14A7 /* Pitch PerfectTests */,
235 | 701C3A541D9693E2006F14A7 /* Pitch PerfectUITests */,
236 | );
237 | };
238 | /* End PBXProject section */
239 |
240 | /* Begin PBXResourcesBuildPhase section */
241 | 701C3A341D9693E2006F14A7 /* Resources */ = {
242 | isa = PBXResourcesBuildPhase;
243 | buildActionMask = 2147483647;
244 | files = (
245 | 701C3A441D9693E2006F14A7 /* LaunchScreen.storyboard in Resources */,
246 | 701C3A411D9693E2006F14A7 /* Assets.xcassets in Resources */,
247 | 701C3A3F1D9693E2006F14A7 /* Main.storyboard in Resources */,
248 | );
249 | runOnlyForDeploymentPostprocessing = 0;
250 | };
251 | 701C3A481D9693E2006F14A7 /* Resources */ = {
252 | isa = PBXResourcesBuildPhase;
253 | buildActionMask = 2147483647;
254 | files = (
255 | );
256 | runOnlyForDeploymentPostprocessing = 0;
257 | };
258 | 701C3A531D9693E2006F14A7 /* Resources */ = {
259 | isa = PBXResourcesBuildPhase;
260 | buildActionMask = 2147483647;
261 | files = (
262 | );
263 | runOnlyForDeploymentPostprocessing = 0;
264 | };
265 | /* End PBXResourcesBuildPhase section */
266 |
267 | /* Begin PBXSourcesBuildPhase section */
268 | 701C3A321D9693E2006F14A7 /* Sources */ = {
269 | isa = PBXSourcesBuildPhase;
270 | buildActionMask = 2147483647;
271 | files = (
272 | 70D8842A1DB0AC22004B69A7 /* RecordedAudio.swift in Sources */,
273 | 701C3A3C1D9693E2006F14A7 /* RecordSoundsViewController.swift in Sources */,
274 | 704EB5401D97143F007B36B5 /* PlaySoundsViewController+Audio.swift in Sources */,
275 | 704EB53E1D96FCC8007B36B5 /* PlaySoundsViewController.swift in Sources */,
276 | 701C3A3A1D9693E2006F14A7 /* AppDelegate.swift in Sources */,
277 | 70D884281DB01F56004B69A7 /* AppConstants.swift in Sources */,
278 | );
279 | runOnlyForDeploymentPostprocessing = 0;
280 | };
281 | 701C3A461D9693E2006F14A7 /* Sources */ = {
282 | isa = PBXSourcesBuildPhase;
283 | buildActionMask = 2147483647;
284 | files = (
285 | 701C3A4F1D9693E2006F14A7 /* Pitch_PerfectTests.swift in Sources */,
286 | );
287 | runOnlyForDeploymentPostprocessing = 0;
288 | };
289 | 701C3A511D9693E2006F14A7 /* Sources */ = {
290 | isa = PBXSourcesBuildPhase;
291 | buildActionMask = 2147483647;
292 | files = (
293 | 701C3A5A1D9693E2006F14A7 /* Pitch_PerfectUITests.swift in Sources */,
294 | );
295 | runOnlyForDeploymentPostprocessing = 0;
296 | };
297 | /* End PBXSourcesBuildPhase section */
298 |
299 | /* Begin PBXTargetDependency section */
300 | 701C3A4C1D9693E2006F14A7 /* PBXTargetDependency */ = {
301 | isa = PBXTargetDependency;
302 | target = 701C3A351D9693E2006F14A7 /* Pitch Perfect */;
303 | targetProxy = 701C3A4B1D9693E2006F14A7 /* PBXContainerItemProxy */;
304 | };
305 | 701C3A571D9693E2006F14A7 /* PBXTargetDependency */ = {
306 | isa = PBXTargetDependency;
307 | target = 701C3A351D9693E2006F14A7 /* Pitch Perfect */;
308 | targetProxy = 701C3A561D9693E2006F14A7 /* PBXContainerItemProxy */;
309 | };
310 | /* End PBXTargetDependency section */
311 |
312 | /* Begin PBXVariantGroup section */
313 | 701C3A3D1D9693E2006F14A7 /* Main.storyboard */ = {
314 | isa = PBXVariantGroup;
315 | children = (
316 | 701C3A3E1D9693E2006F14A7 /* Base */,
317 | );
318 | name = Main.storyboard;
319 | sourceTree = "";
320 | };
321 | 701C3A421D9693E2006F14A7 /* LaunchScreen.storyboard */ = {
322 | isa = PBXVariantGroup;
323 | children = (
324 | 701C3A431D9693E2006F14A7 /* Base */,
325 | );
326 | name = LaunchScreen.storyboard;
327 | sourceTree = "";
328 | };
329 | /* End PBXVariantGroup section */
330 |
331 | /* Begin XCBuildConfiguration section */
332 | 701C3A5C1D9693E3006F14A7 /* Debug */ = {
333 | isa = XCBuildConfiguration;
334 | buildSettings = {
335 | ALWAYS_SEARCH_USER_PATHS = NO;
336 | CLANG_ANALYZER_NONNULL = YES;
337 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
338 | CLANG_CXX_LIBRARY = "libc++";
339 | CLANG_ENABLE_MODULES = YES;
340 | CLANG_ENABLE_OBJC_ARC = YES;
341 | CLANG_WARN_BOOL_CONVERSION = YES;
342 | CLANG_WARN_CONSTANT_CONVERSION = YES;
343 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
344 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
345 | CLANG_WARN_EMPTY_BODY = YES;
346 | CLANG_WARN_ENUM_CONVERSION = YES;
347 | CLANG_WARN_INFINITE_RECURSION = YES;
348 | CLANG_WARN_INT_CONVERSION = YES;
349 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
350 | CLANG_WARN_SUSPICIOUS_MOVES = YES;
351 | CLANG_WARN_UNREACHABLE_CODE = YES;
352 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
353 | CODE_SIGN_IDENTITY = "";
354 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
355 | COPY_PHASE_STRIP = NO;
356 | DEBUG_INFORMATION_FORMAT = dwarf;
357 | DEVELOPMENT_TEAM = "";
358 | ENABLE_STRICT_OBJC_MSGSEND = YES;
359 | ENABLE_TESTABILITY = YES;
360 | GCC_C_LANGUAGE_STANDARD = gnu99;
361 | GCC_DYNAMIC_NO_PIC = NO;
362 | GCC_NO_COMMON_BLOCKS = YES;
363 | GCC_OPTIMIZATION_LEVEL = 0;
364 | GCC_PREPROCESSOR_DEFINITIONS = (
365 | "DEBUG=1",
366 | "$(inherited)",
367 | );
368 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
369 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
370 | GCC_WARN_UNDECLARED_SELECTOR = YES;
371 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
372 | GCC_WARN_UNUSED_FUNCTION = YES;
373 | GCC_WARN_UNUSED_VARIABLE = YES;
374 | IPHONEOS_DEPLOYMENT_TARGET = 10.0;
375 | MTL_ENABLE_DEBUG_INFO = YES;
376 | ONLY_ACTIVE_ARCH = YES;
377 | PROVISIONING_PROFILE = "";
378 | SDKROOT = iphoneos;
379 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
380 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
381 | TARGETED_DEVICE_FAMILY = "1,2";
382 | };
383 | name = Debug;
384 | };
385 | 701C3A5D1D9693E3006F14A7 /* Release */ = {
386 | isa = XCBuildConfiguration;
387 | buildSettings = {
388 | ALWAYS_SEARCH_USER_PATHS = NO;
389 | CLANG_ANALYZER_NONNULL = YES;
390 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
391 | CLANG_CXX_LIBRARY = "libc++";
392 | CLANG_ENABLE_MODULES = YES;
393 | CLANG_ENABLE_OBJC_ARC = YES;
394 | CLANG_WARN_BOOL_CONVERSION = YES;
395 | CLANG_WARN_CONSTANT_CONVERSION = YES;
396 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
397 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
398 | CLANG_WARN_EMPTY_BODY = YES;
399 | CLANG_WARN_ENUM_CONVERSION = YES;
400 | CLANG_WARN_INFINITE_RECURSION = YES;
401 | CLANG_WARN_INT_CONVERSION = YES;
402 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
403 | CLANG_WARN_SUSPICIOUS_MOVES = YES;
404 | CLANG_WARN_UNREACHABLE_CODE = YES;
405 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
406 | CODE_SIGN_IDENTITY = "";
407 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
408 | COPY_PHASE_STRIP = NO;
409 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
410 | DEVELOPMENT_TEAM = "";
411 | ENABLE_NS_ASSERTIONS = NO;
412 | ENABLE_STRICT_OBJC_MSGSEND = YES;
413 | GCC_C_LANGUAGE_STANDARD = gnu99;
414 | GCC_NO_COMMON_BLOCKS = YES;
415 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
416 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
417 | GCC_WARN_UNDECLARED_SELECTOR = YES;
418 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
419 | GCC_WARN_UNUSED_FUNCTION = YES;
420 | GCC_WARN_UNUSED_VARIABLE = YES;
421 | IPHONEOS_DEPLOYMENT_TARGET = 10.0;
422 | MTL_ENABLE_DEBUG_INFO = NO;
423 | PROVISIONING_PROFILE = "";
424 | SDKROOT = iphoneos;
425 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
426 | TARGETED_DEVICE_FAMILY = "1,2";
427 | VALIDATE_PRODUCT = YES;
428 | };
429 | name = Release;
430 | };
431 | 701C3A5F1D9693E3006F14A7 /* Debug */ = {
432 | isa = XCBuildConfiguration;
433 | buildSettings = {
434 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
435 | CODE_SIGN_IDENTITY = "iPhone Developer";
436 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
437 | DEVELOPMENT_TEAM = "";
438 | INFOPLIST_FILE = "Pitch Perfect/Info.plist";
439 | IPHONEOS_DEPLOYMENT_TARGET = 10.0;
440 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
441 | PRODUCT_BUNDLE_IDENTIFIER = "iamchanandlerbong.Pitch-Perfect";
442 | PRODUCT_NAME = "$(TARGET_NAME)";
443 | PROVISIONING_PROFILE = "";
444 | PROVISIONING_PROFILE_SPECIFIER = "";
445 | SWIFT_VERSION = 3.0;
446 | };
447 | name = Debug;
448 | };
449 | 701C3A601D9693E3006F14A7 /* Release */ = {
450 | isa = XCBuildConfiguration;
451 | buildSettings = {
452 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
453 | CODE_SIGN_IDENTITY = "iPhone Developer";
454 | DEVELOPMENT_TEAM = "";
455 | INFOPLIST_FILE = "Pitch Perfect/Info.plist";
456 | IPHONEOS_DEPLOYMENT_TARGET = 10.0;
457 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
458 | PRODUCT_BUNDLE_IDENTIFIER = "iamchanandlerbong.Pitch-Perfect";
459 | PRODUCT_NAME = "$(TARGET_NAME)";
460 | PROVISIONING_PROFILE = "";
461 | PROVISIONING_PROFILE_SPECIFIER = "";
462 | SWIFT_VERSION = 3.0;
463 | };
464 | name = Release;
465 | };
466 | 701C3A621D9693E3006F14A7 /* Debug */ = {
467 | isa = XCBuildConfiguration;
468 | buildSettings = {
469 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
470 | DEVELOPMENT_TEAM = "";
471 | INFOPLIST_FILE = "Pitch PerfectTests/Info.plist";
472 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
473 | PRODUCT_BUNDLE_IDENTIFIER = "iamchanandlerbong.Pitch-PerfectTests";
474 | PRODUCT_NAME = "$(TARGET_NAME)";
475 | SWIFT_VERSION = 3.0;
476 | };
477 | name = Debug;
478 | };
479 | 701C3A631D9693E3006F14A7 /* Release */ = {
480 | isa = XCBuildConfiguration;
481 | buildSettings = {
482 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
483 | DEVELOPMENT_TEAM = "";
484 | INFOPLIST_FILE = "Pitch PerfectTests/Info.plist";
485 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
486 | PRODUCT_BUNDLE_IDENTIFIER = "iamchanandlerbong.Pitch-PerfectTests";
487 | PRODUCT_NAME = "$(TARGET_NAME)";
488 | SWIFT_VERSION = 3.0;
489 | };
490 | name = Release;
491 | };
492 | 701C3A651D9693E3006F14A7 /* Debug */ = {
493 | isa = XCBuildConfiguration;
494 | buildSettings = {
495 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
496 | DEVELOPMENT_TEAM = "";
497 | INFOPLIST_FILE = "Pitch PerfectUITests/Info.plist";
498 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
499 | PRODUCT_BUNDLE_IDENTIFIER = "iamchanandlerbong.Pitch-PerfectUITests";
500 | PRODUCT_NAME = "$(TARGET_NAME)";
501 | PROVISIONING_PROFILE = "";
502 | SWIFT_VERSION = 3.0;
503 | };
504 | name = Debug;
505 | };
506 | 701C3A661D9693E3006F14A7 /* Release */ = {
507 | isa = XCBuildConfiguration;
508 | buildSettings = {
509 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
510 | DEVELOPMENT_TEAM = "";
511 | INFOPLIST_FILE = "Pitch PerfectUITests/Info.plist";
512 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
513 | PRODUCT_BUNDLE_IDENTIFIER = "iamchanandlerbong.Pitch-PerfectUITests";
514 | PRODUCT_NAME = "$(TARGET_NAME)";
515 | PROVISIONING_PROFILE = "";
516 | SWIFT_VERSION = 3.0;
517 | };
518 | name = Release;
519 | };
520 | /* End XCBuildConfiguration section */
521 |
522 | /* Begin XCConfigurationList section */
523 | 701C3A311D9693E2006F14A7 /* Build configuration list for PBXProject "Pitch Perfect" */ = {
524 | isa = XCConfigurationList;
525 | buildConfigurations = (
526 | 701C3A5C1D9693E3006F14A7 /* Debug */,
527 | 701C3A5D1D9693E3006F14A7 /* Release */,
528 | );
529 | defaultConfigurationIsVisible = 0;
530 | defaultConfigurationName = Release;
531 | };
532 | 701C3A5E1D9693E3006F14A7 /* Build configuration list for PBXNativeTarget "Pitch Perfect" */ = {
533 | isa = XCConfigurationList;
534 | buildConfigurations = (
535 | 701C3A5F1D9693E3006F14A7 /* Debug */,
536 | 701C3A601D9693E3006F14A7 /* Release */,
537 | );
538 | defaultConfigurationIsVisible = 0;
539 | defaultConfigurationName = Release;
540 | };
541 | 701C3A611D9693E3006F14A7 /* Build configuration list for PBXNativeTarget "Pitch PerfectTests" */ = {
542 | isa = XCConfigurationList;
543 | buildConfigurations = (
544 | 701C3A621D9693E3006F14A7 /* Debug */,
545 | 701C3A631D9693E3006F14A7 /* Release */,
546 | );
547 | defaultConfigurationIsVisible = 0;
548 | defaultConfigurationName = Release;
549 | };
550 | 701C3A641D9693E3006F14A7 /* Build configuration list for PBXNativeTarget "Pitch PerfectUITests" */ = {
551 | isa = XCConfigurationList;
552 | buildConfigurations = (
553 | 701C3A651D9693E3006F14A7 /* Debug */,
554 | 701C3A661D9693E3006F14A7 /* Release */,
555 | );
556 | defaultConfigurationIsVisible = 0;
557 | defaultConfigurationName = Release;
558 | };
559 | /* End XCConfigurationList section */
560 | };
561 | rootObject = 701C3A2E1D9693E2006F14A7 /* Project object */;
562 | }
563 |
--------------------------------------------------------------------------------