├── AudioSample-Info.plist ├── AudioSample.xcodeproj ├── alex.mode1v3 ├── alex.pbxuser ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── alex.xcuserdatad │ │ └── WorkspaceSettings.xcsettings └── xcuserdata │ └── alex.xcuserdatad │ ├── xcdebugger │ └── Breakpoints.xcbkptlist │ └── xcschemes │ ├── AudioSample.xcscheme │ └── xcschememanagement.plist ├── AudioSample_Prefix.pch ├── Classes ├── AppleOpenALSupport.c ├── AppleOpenALSupport.h ├── AudioSampleAppDelegate.h ├── AudioSampleAppDelegate.m ├── CMOpenALSound.h ├── CMOpenALSound.m ├── CMOpenALSoundManager.h ├── CMOpenALSoundManager.m ├── DebugOutput.h ├── DebugOutput.m ├── RootViewController.h ├── RootViewController.m └── SynthesizeSingleton.h ├── License ├── MainWindow.xib ├── Readme.markdown ├── RootViewController.xib ├── Start.caf ├── backgroundLoop.m4a ├── engine.caf ├── main.m ├── screen.png ├── volumedown.png └── volumeup.png /AudioSample-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIconFile 12 | 13 | CFBundleIdentifier 14 | com.yourcompany.${PRODUCT_NAME:rfc1034identifier} 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleName 18 | ${PRODUCT_NAME} 19 | CFBundlePackageType 20 | APPL 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | NSMainNibFile 28 | MainWindow 29 | 30 | 31 | -------------------------------------------------------------------------------- /AudioSample.xcodeproj/alex.mode1v3: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ActivePerspectiveName 6 | Project 7 | AllowedModules 8 | 9 | 10 | BundleLoadPath 11 | 12 | MaxInstances 13 | n 14 | Module 15 | PBXSmartGroupTreeModule 16 | Name 17 | Groups and Files Outline View 18 | 19 | 20 | BundleLoadPath 21 | 22 | MaxInstances 23 | n 24 | Module 25 | PBXNavigatorGroup 26 | Name 27 | Editor 28 | 29 | 30 | BundleLoadPath 31 | 32 | MaxInstances 33 | n 34 | Module 35 | XCTaskListModule 36 | Name 37 | Task List 38 | 39 | 40 | BundleLoadPath 41 | 42 | MaxInstances 43 | n 44 | Module 45 | XCDetailModule 46 | Name 47 | File and Smart Group Detail Viewer 48 | 49 | 50 | BundleLoadPath 51 | 52 | MaxInstances 53 | 1 54 | Module 55 | PBXBuildResultsModule 56 | Name 57 | Detailed Build Results Viewer 58 | 59 | 60 | BundleLoadPath 61 | 62 | MaxInstances 63 | 1 64 | Module 65 | PBXProjectFindModule 66 | Name 67 | Project Batch Find Tool 68 | 69 | 70 | BundleLoadPath 71 | 72 | MaxInstances 73 | n 74 | Module 75 | XCProjectFormatConflictsModule 76 | Name 77 | Project Format Conflicts List 78 | 79 | 80 | BundleLoadPath 81 | 82 | MaxInstances 83 | n 84 | Module 85 | PBXBookmarksModule 86 | Name 87 | Bookmarks Tool 88 | 89 | 90 | BundleLoadPath 91 | 92 | MaxInstances 93 | n 94 | Module 95 | PBXClassBrowserModule 96 | Name 97 | Class Browser 98 | 99 | 100 | BundleLoadPath 101 | 102 | MaxInstances 103 | n 104 | Module 105 | PBXCVSModule 106 | Name 107 | Source Code Control Tool 108 | 109 | 110 | BundleLoadPath 111 | 112 | MaxInstances 113 | n 114 | Module 115 | PBXDebugBreakpointsModule 116 | Name 117 | Debug Breakpoints Tool 118 | 119 | 120 | BundleLoadPath 121 | 122 | MaxInstances 123 | n 124 | Module 125 | XCDockableInspector 126 | Name 127 | Inspector 128 | 129 | 130 | BundleLoadPath 131 | 132 | MaxInstances 133 | n 134 | Module 135 | PBXOpenQuicklyModule 136 | Name 137 | Open Quickly Tool 138 | 139 | 140 | BundleLoadPath 141 | 142 | MaxInstances 143 | 1 144 | Module 145 | PBXDebugSessionModule 146 | Name 147 | Debugger 148 | 149 | 150 | BundleLoadPath 151 | 152 | MaxInstances 153 | 1 154 | Module 155 | PBXDebugCLIModule 156 | Name 157 | Debug Console 158 | 159 | 160 | BundleLoadPath 161 | 162 | MaxInstances 163 | n 164 | Module 165 | XCSnapshotModule 166 | Name 167 | Snapshots Tool 168 | 169 | 170 | BundlePath 171 | /Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources 172 | Description 173 | DefaultDescriptionKey 174 | DockingSystemVisible 175 | 176 | Extension 177 | mode1v3 178 | FavBarConfig 179 | 180 | PBXProjectModuleGUID 181 | FA3D99A5105EA8C50075FE34 182 | XCBarModuleItemNames 183 | 184 | XCBarModuleItems 185 | 186 | 187 | FirstTimeWindowDisplayed 188 | 189 | Identifier 190 | com.apple.perspectives.project.mode1v3 191 | MajorVersion 192 | 33 193 | MinorVersion 194 | 0 195 | Name 196 | Default 197 | Notifications 198 | 199 | OpenEditors 200 | 201 | PerspectiveWidths 202 | 203 | -1 204 | -1 205 | 206 | Perspectives 207 | 208 | 209 | ChosenToolbarItems 210 | 211 | action 212 | active-target-popup 213 | active-buildstyle-popup 214 | active-platform-popup 215 | NSToolbarFlexibleSpaceItem 216 | debugger-enable-breakpoints 217 | buildOrClean 218 | build-and-go 219 | com.apple.ide.PBXToolbarStopButton 220 | get-info 221 | toggle-editor 222 | NSToolbarFlexibleSpaceItem 223 | com.apple.pbx.toolbar.searchfield 224 | 225 | ControllerClassBaseName 226 | 227 | IconName 228 | WindowOfProjectWithEditor 229 | Identifier 230 | perspective.project 231 | IsVertical 232 | 233 | Layout 234 | 235 | 236 | ContentConfiguration 237 | 238 | PBXBottomSmartGroupGIDs 239 | 240 | 1C37FBAC04509CD000000102 241 | 1C37FAAC04509CD000000102 242 | 1C37FABC05509CD000000102 243 | 1C37FABC05539CD112110102 244 | E2644B35053B69B200211256 245 | 1C37FABC04509CD000100104 246 | 1CC0EA4004350EF90044410B 247 | 1CC0EA4004350EF90041110B 248 | 249 | PBXProjectModuleGUID 250 | 1CE0B1FE06471DED0097A5F4 251 | PBXProjectModuleLabel 252 | Files 253 | PBXProjectStructureProvided 254 | yes 255 | PBXSmartGroupTreeModuleColumnData 256 | 257 | PBXSmartGroupTreeModuleColumnWidthsKey 258 | 259 | 245 260 | 261 | PBXSmartGroupTreeModuleColumnsKey_v4 262 | 263 | MainColumn 264 | 265 | 266 | PBXSmartGroupTreeModuleOutlineStateKey_v7 267 | 268 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 269 | 270 | 29B97314FDCFA39411CA2CEA 271 | 080E96DDFE201D6D7F000001 272 | FA3D9983105EA88A0075FE34 273 | FA3D9977105EA8850075FE34 274 | 29B97317FDCFA39411CA2CEA 275 | 1C37FBAC04509CD000000102 276 | 1C37FABC05509CD000000102 277 | 278 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 279 | 280 | 281 | 13 282 | 6 283 | 1 284 | 0 285 | 286 | 287 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 288 | {{0, 0}, {245, 760}} 289 | 290 | PBXTopSmartGroupGIDs 291 | 292 | XCIncludePerspectivesSwitch 293 | 294 | XCSharingToken 295 | com.apple.Xcode.GFSharingToken 296 | 297 | GeometryConfiguration 298 | 299 | Frame 300 | {{0, 0}, {262, 778}} 301 | GroupTreeTableConfiguration 302 | 303 | MainColumn 304 | 245 305 | 306 | RubberWindowFrame 307 | 0 59 1440 819 0 0 1440 878 308 | 309 | Module 310 | PBXSmartGroupTreeModule 311 | Proportion 312 | 262pt 313 | 314 | 315 | Dock 316 | 317 | 318 | BecomeActive 319 | 320 | ContentConfiguration 321 | 322 | PBXProjectModuleGUID 323 | 1CE0B20306471E060097A5F4 324 | PBXProjectModuleLabel 325 | CMOpenALSound.m 326 | PBXSplitModuleInNavigatorKey 327 | 328 | Split0 329 | 330 | PBXProjectModuleGUID 331 | 1CE0B20406471E060097A5F4 332 | PBXProjectModuleLabel 333 | CMOpenALSound.m 334 | _historyCapacity 335 | 10 336 | bookmark 337 | FA692CE912020774009A2DE5 338 | history 339 | 340 | FADB4FC910BC4C3200BFA7F7 341 | FADB4FCA10BC4C3200BFA7F7 342 | FADB4FCB10BC4C3200BFA7F7 343 | FAFCD07A10D06B9300B54D9F 344 | FAAC1EA910D6DC8000139279 345 | FAAC1EB910D6DE0900139279 346 | FAAC1EF210D6E48D00139279 347 | FAC6C95D11FE95FE006E2F21 348 | FAC6C95E11FE95FE006E2F21 349 | FAC6C96011FE95FE006E2F21 350 | 351 | 352 | SplitCount 353 | 1 354 | 355 | StatusBarVisibility 356 | 357 | 358 | GeometryConfiguration 359 | 360 | Frame 361 | {{0, 0}, {1173, 773}} 362 | RubberWindowFrame 363 | 0 59 1440 819 0 0 1440 878 364 | 365 | Module 366 | PBXNavigatorGroup 367 | Proportion 368 | 773pt 369 | 370 | 371 | ContentConfiguration 372 | 373 | PBXProjectModuleGUID 374 | 1CE0B20506471E060097A5F4 375 | PBXProjectModuleLabel 376 | Detail 377 | 378 | GeometryConfiguration 379 | 380 | Frame 381 | {{0, 778}, {1173, 0}} 382 | RubberWindowFrame 383 | 0 59 1440 819 0 0 1440 878 384 | 385 | Module 386 | XCDetailModule 387 | Proportion 388 | 0pt 389 | 390 | 391 | Proportion 392 | 1173pt 393 | 394 | 395 | Name 396 | Project 397 | ServiceClasses 398 | 399 | XCModuleDock 400 | PBXSmartGroupTreeModule 401 | XCModuleDock 402 | PBXNavigatorGroup 403 | XCDetailModule 404 | 405 | TableOfContents 406 | 407 | FA692CE61202046F009A2DE5 408 | 1CE0B1FE06471DED0097A5F4 409 | FA692CE71202046F009A2DE5 410 | 1CE0B20306471E060097A5F4 411 | 1CE0B20506471E060097A5F4 412 | 413 | ToolbarConfigUserDefaultsMinorVersion 414 | 2 415 | ToolbarConfiguration 416 | xcode.toolbar.config.defaultV3 417 | 418 | 419 | ControllerClassBaseName 420 | 421 | IconName 422 | WindowOfProject 423 | Identifier 424 | perspective.morph 425 | IsVertical 426 | 0 427 | Layout 428 | 429 | 430 | BecomeActive 431 | 1 432 | ContentConfiguration 433 | 434 | PBXBottomSmartGroupGIDs 435 | 436 | 1C37FBAC04509CD000000102 437 | 1C37FAAC04509CD000000102 438 | 1C08E77C0454961000C914BD 439 | 1C37FABC05509CD000000102 440 | 1C37FABC05539CD112110102 441 | E2644B35053B69B200211256 442 | 1C37FABC04509CD000100104 443 | 1CC0EA4004350EF90044410B 444 | 1CC0EA4004350EF90041110B 445 | 446 | PBXProjectModuleGUID 447 | 11E0B1FE06471DED0097A5F4 448 | PBXProjectModuleLabel 449 | Files 450 | PBXProjectStructureProvided 451 | yes 452 | PBXSmartGroupTreeModuleColumnData 453 | 454 | PBXSmartGroupTreeModuleColumnWidthsKey 455 | 456 | 186 457 | 458 | PBXSmartGroupTreeModuleColumnsKey_v4 459 | 460 | MainColumn 461 | 462 | 463 | PBXSmartGroupTreeModuleOutlineStateKey_v7 464 | 465 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 466 | 467 | 29B97314FDCFA39411CA2CEA 468 | 1C37FABC05509CD000000102 469 | 470 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 471 | 472 | 473 | 0 474 | 475 | 476 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 477 | {{0, 0}, {186, 337}} 478 | 479 | PBXTopSmartGroupGIDs 480 | 481 | XCIncludePerspectivesSwitch 482 | 1 483 | XCSharingToken 484 | com.apple.Xcode.GFSharingToken 485 | 486 | GeometryConfiguration 487 | 488 | Frame 489 | {{0, 0}, {203, 355}} 490 | GroupTreeTableConfiguration 491 | 492 | MainColumn 493 | 186 494 | 495 | RubberWindowFrame 496 | 373 269 690 397 0 0 1440 878 497 | 498 | Module 499 | PBXSmartGroupTreeModule 500 | Proportion 501 | 100% 502 | 503 | 504 | Name 505 | Morph 506 | PreferredWidth 507 | 300 508 | ServiceClasses 509 | 510 | XCModuleDock 511 | PBXSmartGroupTreeModule 512 | 513 | TableOfContents 514 | 515 | 11E0B1FE06471DED0097A5F4 516 | 517 | ToolbarConfiguration 518 | xcode.toolbar.config.default.shortV3 519 | 520 | 521 | PerspectivesBarVisible 522 | 523 | ShelfIsVisible 524 | 525 | SourceDescription 526 | file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecificationMode1.xcperspec' 527 | StatusbarIsVisible 528 | 529 | TimeStamp 530 | 0.0 531 | ToolbarDisplayMode 532 | 1 533 | ToolbarIsVisible 534 | 535 | ToolbarSizeMode 536 | 1 537 | Type 538 | Perspectives 539 | UpdateMessage 540 | The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? 541 | WindowJustification 542 | 5 543 | WindowOrderList 544 | 545 | FA3D9990105EA8BF0075FE34 546 | /Users/alex/Desktop/Work/Iphone/Tests/SoundEngine/AudioSample.xcodeproj 547 | 548 | WindowString 549 | 0 59 1440 819 0 0 1440 878 550 | WindowToolsV3 551 | 552 | 553 | FirstTimeWindowDisplayed 554 | 555 | Identifier 556 | windowTool.build 557 | IsVertical 558 | 559 | Layout 560 | 561 | 562 | Dock 563 | 564 | 565 | ContentConfiguration 566 | 567 | PBXProjectModuleGUID 568 | 1CD0528F0623707200166675 569 | PBXProjectModuleLabel 570 | 571 | StatusBarVisibility 572 | 573 | 574 | GeometryConfiguration 575 | 576 | Frame 577 | {{0, 0}, {500, 218}} 578 | RubberWindowFrame 579 | 502 355 500 500 0 0 1440 878 580 | 581 | Module 582 | PBXNavigatorGroup 583 | Proportion 584 | 218pt 585 | 586 | 587 | ContentConfiguration 588 | 589 | PBXProjectModuleGUID 590 | XCMainBuildResultsModuleGUID 591 | PBXProjectModuleLabel 592 | Build Results 593 | XCBuildResultsTrigger_Collapse 594 | 1021 595 | XCBuildResultsTrigger_Open 596 | 1011 597 | 598 | GeometryConfiguration 599 | 600 | Frame 601 | {{0, 223}, {500, 236}} 602 | RubberWindowFrame 603 | 502 355 500 500 0 0 1440 878 604 | 605 | Module 606 | PBXBuildResultsModule 607 | Proportion 608 | 236pt 609 | 610 | 611 | Proportion 612 | 459pt 613 | 614 | 615 | Name 616 | Build Results 617 | ServiceClasses 618 | 619 | PBXBuildResultsModule 620 | 621 | StatusbarIsVisible 622 | 623 | TableOfContents 624 | 625 | FA3D9990105EA8BF0075FE34 626 | FA692CE81202046F009A2DE5 627 | 1CD0528F0623707200166675 628 | XCMainBuildResultsModuleGUID 629 | 630 | ToolbarConfiguration 631 | xcode.toolbar.config.buildV3 632 | WindowString 633 | 502 355 500 500 0 0 1440 878 634 | WindowToolGUID 635 | FA3D9990105EA8BF0075FE34 636 | WindowToolIsVisible 637 | 638 | 639 | 640 | FirstTimeWindowDisplayed 641 | 642 | Identifier 643 | windowTool.debugger 644 | IsVertical 645 | 646 | Layout 647 | 648 | 649 | Dock 650 | 651 | 652 | ContentConfiguration 653 | 654 | Debugger 655 | 656 | HorizontalSplitView 657 | 658 | _collapsingFrameDimension 659 | 0.0 660 | _indexOfCollapsedView 661 | 0 662 | _percentageOfCollapsedView 663 | 0.0 664 | isCollapsed 665 | yes 666 | sizes 667 | 668 | {{0, 0}, {316, 203}} 669 | {{316, 0}, {378, 203}} 670 | 671 | 672 | VerticalSplitView 673 | 674 | _collapsingFrameDimension 675 | 0.0 676 | _indexOfCollapsedView 677 | 0 678 | _percentageOfCollapsedView 679 | 0.0 680 | isCollapsed 681 | yes 682 | sizes 683 | 684 | {{0, 0}, {694, 203}} 685 | {{0, 203}, {694, 178}} 686 | 687 | 688 | 689 | LauncherConfigVersion 690 | 8 691 | PBXProjectModuleGUID 692 | 1C162984064C10D400B95A72 693 | PBXProjectModuleLabel 694 | Debug - GLUTExamples (Underwater) 695 | 696 | GeometryConfiguration 697 | 698 | DebugConsoleVisible 699 | None 700 | DebugConsoleWindowFrame 701 | {{200, 200}, {500, 300}} 702 | DebugSTDIOWindowFrame 703 | {{200, 200}, {500, 300}} 704 | Frame 705 | {{0, 0}, {694, 381}} 706 | PBXDebugSessionStackFrameViewKey 707 | 708 | DebugVariablesTableConfiguration 709 | 710 | Name 711 | 120 712 | Value 713 | 85 714 | Summary 715 | 148 716 | 717 | Frame 718 | {{316, 0}, {378, 203}} 719 | RubberWindowFrame 720 | 502 433 694 422 0 0 1440 878 721 | 722 | RubberWindowFrame 723 | 502 433 694 422 0 0 1440 878 724 | 725 | Module 726 | PBXDebugSessionModule 727 | Proportion 728 | 381pt 729 | 730 | 731 | Proportion 732 | 381pt 733 | 734 | 735 | Name 736 | Debugger 737 | ServiceClasses 738 | 739 | PBXDebugSessionModule 740 | 741 | StatusbarIsVisible 742 | 743 | TableOfContents 744 | 745 | 1CD10A99069EF8BA00B06720 746 | FA9190AE1190B9F100B678BE 747 | 1C162984064C10D400B95A72 748 | FA9190AF1190B9F100B678BE 749 | FA9190B01190B9F100B678BE 750 | FA9190B11190B9F100B678BE 751 | FA9190B21190B9F100B678BE 752 | FA9190B31190B9F100B678BE 753 | 754 | ToolbarConfiguration 755 | xcode.toolbar.config.debugV3 756 | WindowString 757 | 502 433 694 422 0 0 1440 878 758 | WindowToolGUID 759 | 1CD10A99069EF8BA00B06720 760 | WindowToolIsVisible 761 | 762 | 763 | 764 | FirstTimeWindowDisplayed 765 | 766 | Identifier 767 | windowTool.find 768 | IsVertical 769 | 770 | Layout 771 | 772 | 773 | Dock 774 | 775 | 776 | Dock 777 | 778 | 779 | BecomeActive 780 | 781 | ContentConfiguration 782 | 783 | PBXProjectModuleGUID 784 | 1CDD528C0622207200134675 785 | PBXProjectModuleLabel 786 | CMOpenALSoundManager.m 787 | StatusBarVisibility 788 | 789 | 790 | GeometryConfiguration 791 | 792 | Frame 793 | {{0, 0}, {935, 427}} 794 | RubberWindowFrame 795 | 21 170 935 685 0 0 1440 878 796 | 797 | Module 798 | PBXNavigatorGroup 799 | Proportion 800 | 935pt 801 | 802 | 803 | Proportion 804 | 427pt 805 | 806 | 807 | ContentConfiguration 808 | 809 | PBXProjectModuleGUID 810 | 1CD0528E0623707200166675 811 | PBXProjectModuleLabel 812 | Project Find 813 | 814 | GeometryConfiguration 815 | 816 | Frame 817 | {{0, 432}, {935, 212}} 818 | RubberWindowFrame 819 | 21 170 935 685 0 0 1440 878 820 | 821 | Module 822 | PBXProjectFindModule 823 | Proportion 824 | 212pt 825 | 826 | 827 | Proportion 828 | 644pt 829 | 830 | 831 | Name 832 | Project Find 833 | ServiceClasses 834 | 835 | PBXProjectFindModule 836 | 837 | StatusbarIsVisible 838 | 839 | TableOfContents 840 | 841 | 1C530D57069F1CE1000CFCEE 842 | FA4129FE114AA2AE0041FAC7 843 | FA4129FF114AA2AE0041FAC7 844 | 1CDD528C0622207200134675 845 | 1CD0528E0623707200166675 846 | 847 | WindowString 848 | 21 170 935 685 0 0 1440 878 849 | WindowToolGUID 850 | 1C530D57069F1CE1000CFCEE 851 | WindowToolIsVisible 852 | 853 | 854 | 855 | Identifier 856 | MENUSEPARATOR 857 | 858 | 859 | FirstTimeWindowDisplayed 860 | 861 | Identifier 862 | windowTool.debuggerConsole 863 | IsVertical 864 | 865 | Layout 866 | 867 | 868 | Dock 869 | 870 | 871 | BecomeActive 872 | 873 | ContentConfiguration 874 | 875 | PBXProjectModuleGUID 876 | 1C78EAAC065D492600B07095 877 | PBXProjectModuleLabel 878 | Debugger Console 879 | 880 | GeometryConfiguration 881 | 882 | Frame 883 | {{0, 0}, {650, 209}} 884 | RubberWindowFrame 885 | 372 615 650 250 0 0 1440 878 886 | 887 | Module 888 | PBXDebugCLIModule 889 | Proportion 890 | 209pt 891 | 892 | 893 | Proportion 894 | 209pt 895 | 896 | 897 | Name 898 | Debugger Console 899 | ServiceClasses 900 | 901 | PBXDebugCLIModule 902 | 903 | StatusbarIsVisible 904 | 905 | TableOfContents 906 | 907 | 1C78EAAD065D492600B07095 908 | FA9190B41190B9F100B678BE 909 | 1C78EAAC065D492600B07095 910 | 911 | ToolbarConfiguration 912 | xcode.toolbar.config.consoleV3 913 | WindowString 914 | 372 615 650 250 0 0 1440 878 915 | WindowToolGUID 916 | 1C78EAAD065D492600B07095 917 | WindowToolIsVisible 918 | 919 | 920 | 921 | Identifier 922 | windowTool.snapshots 923 | Layout 924 | 925 | 926 | Dock 927 | 928 | 929 | Module 930 | XCSnapshotModule 931 | Proportion 932 | 100% 933 | 934 | 935 | Proportion 936 | 100% 937 | 938 | 939 | Name 940 | Snapshots 941 | ServiceClasses 942 | 943 | XCSnapshotModule 944 | 945 | StatusbarIsVisible 946 | Yes 947 | ToolbarConfiguration 948 | xcode.toolbar.config.snapshots 949 | WindowString 950 | 315 824 300 550 0 0 1440 878 951 | WindowToolIsVisible 952 | Yes 953 | 954 | 955 | Identifier 956 | windowTool.scm 957 | Layout 958 | 959 | 960 | Dock 961 | 962 | 963 | ContentConfiguration 964 | 965 | PBXProjectModuleGUID 966 | 1C78EAB2065D492600B07095 967 | PBXProjectModuleLabel 968 | <No Editor> 969 | PBXSplitModuleInNavigatorKey 970 | 971 | Split0 972 | 973 | PBXProjectModuleGUID 974 | 1C78EAB3065D492600B07095 975 | 976 | SplitCount 977 | 1 978 | 979 | StatusBarVisibility 980 | 1 981 | 982 | GeometryConfiguration 983 | 984 | Frame 985 | {{0, 0}, {452, 0}} 986 | RubberWindowFrame 987 | 743 379 452 308 0 0 1280 1002 988 | 989 | Module 990 | PBXNavigatorGroup 991 | Proportion 992 | 0pt 993 | 994 | 995 | BecomeActive 996 | 1 997 | ContentConfiguration 998 | 999 | PBXProjectModuleGUID 1000 | 1CD052920623707200166675 1001 | PBXProjectModuleLabel 1002 | SCM 1003 | 1004 | GeometryConfiguration 1005 | 1006 | ConsoleFrame 1007 | {{0, 259}, {452, 0}} 1008 | Frame 1009 | {{0, 7}, {452, 259}} 1010 | RubberWindowFrame 1011 | 743 379 452 308 0 0 1280 1002 1012 | TableConfiguration 1013 | 1014 | Status 1015 | 30 1016 | FileName 1017 | 199 1018 | Path 1019 | 197.0950012207031 1020 | 1021 | TableFrame 1022 | {{0, 0}, {452, 250}} 1023 | 1024 | Module 1025 | PBXCVSModule 1026 | Proportion 1027 | 262pt 1028 | 1029 | 1030 | Proportion 1031 | 266pt 1032 | 1033 | 1034 | Name 1035 | SCM 1036 | ServiceClasses 1037 | 1038 | PBXCVSModule 1039 | 1040 | StatusbarIsVisible 1041 | 1 1042 | TableOfContents 1043 | 1044 | 1C78EAB4065D492600B07095 1045 | 1C78EAB5065D492600B07095 1046 | 1C78EAB2065D492600B07095 1047 | 1CD052920623707200166675 1048 | 1049 | ToolbarConfiguration 1050 | xcode.toolbar.config.scm 1051 | WindowString 1052 | 743 379 452 308 0 0 1280 1002 1053 | 1054 | 1055 | FirstTimeWindowDisplayed 1056 | 1057 | Identifier 1058 | windowTool.breakpoints 1059 | IsVertical 1060 | 1061 | Layout 1062 | 1063 | 1064 | Dock 1065 | 1066 | 1067 | ContentConfiguration 1068 | 1069 | PBXBottomSmartGroupGIDs 1070 | 1071 | 1C77FABC04509CD000000102 1072 | 1073 | PBXProjectModuleGUID 1074 | 1CE0B1FE06471DED0097A5F4 1075 | PBXProjectModuleLabel 1076 | Files 1077 | PBXProjectStructureProvided 1078 | no 1079 | PBXSmartGroupTreeModuleColumnData 1080 | 1081 | PBXSmartGroupTreeModuleColumnWidthsKey 1082 | 1083 | 168 1084 | 1085 | PBXSmartGroupTreeModuleColumnsKey_v4 1086 | 1087 | MainColumn 1088 | 1089 | 1090 | PBXSmartGroupTreeModuleOutlineStateKey_v7 1091 | 1092 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 1093 | 1094 | 1C77FABC04509CD000000102 1095 | 1096 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 1097 | 1098 | 1099 | 0 1100 | 1101 | 1102 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 1103 | {{0, 0}, {168, 350}} 1104 | 1105 | PBXTopSmartGroupGIDs 1106 | 1107 | XCIncludePerspectivesSwitch 1108 | 1109 | 1110 | GeometryConfiguration 1111 | 1112 | Frame 1113 | {{0, 0}, {185, 368}} 1114 | GroupTreeTableConfiguration 1115 | 1116 | MainColumn 1117 | 168 1118 | 1119 | RubberWindowFrame 1120 | 21 446 744 409 0 0 1440 878 1121 | 1122 | Module 1123 | PBXSmartGroupTreeModule 1124 | Proportion 1125 | 185pt 1126 | 1127 | 1128 | BecomeActive 1129 | 1130 | ContentConfiguration 1131 | 1132 | PBXProjectModuleGUID 1133 | 1CA1AED706398EBD00589147 1134 | PBXProjectModuleLabel 1135 | Detail 1136 | 1137 | GeometryConfiguration 1138 | 1139 | Frame 1140 | {{190, 0}, {554, 368}} 1141 | RubberWindowFrame 1142 | 21 446 744 409 0 0 1440 878 1143 | 1144 | Module 1145 | XCDetailModule 1146 | Proportion 1147 | 554pt 1148 | 1149 | 1150 | Proportion 1151 | 368pt 1152 | 1153 | 1154 | MajorVersion 1155 | 3 1156 | MinorVersion 1157 | 0 1158 | Name 1159 | Breakpoints 1160 | ServiceClasses 1161 | 1162 | PBXSmartGroupTreeModule 1163 | XCDetailModule 1164 | 1165 | StatusbarIsVisible 1166 | 1167 | TableOfContents 1168 | 1169 | FAAC1EA210D6DC6A00139279 1170 | FAAC1EA310D6DC6A00139279 1171 | 1CE0B1FE06471DED0097A5F4 1172 | 1CA1AED706398EBD00589147 1173 | 1174 | ToolbarConfiguration 1175 | xcode.toolbar.config.breakpointsV3 1176 | WindowString 1177 | 21 446 744 409 0 0 1440 878 1178 | WindowToolGUID 1179 | FAAC1EA210D6DC6A00139279 1180 | WindowToolIsVisible 1181 | 1182 | 1183 | 1184 | Identifier 1185 | windowTool.debugAnimator 1186 | Layout 1187 | 1188 | 1189 | Dock 1190 | 1191 | 1192 | Module 1193 | PBXNavigatorGroup 1194 | Proportion 1195 | 100% 1196 | 1197 | 1198 | Proportion 1199 | 100% 1200 | 1201 | 1202 | Name 1203 | Debug Visualizer 1204 | ServiceClasses 1205 | 1206 | PBXNavigatorGroup 1207 | 1208 | StatusbarIsVisible 1209 | 1 1210 | ToolbarConfiguration 1211 | xcode.toolbar.config.debugAnimatorV3 1212 | WindowString 1213 | 100 100 700 500 0 0 1280 1002 1214 | 1215 | 1216 | Identifier 1217 | windowTool.bookmarks 1218 | Layout 1219 | 1220 | 1221 | Dock 1222 | 1223 | 1224 | Module 1225 | PBXBookmarksModule 1226 | Proportion 1227 | 100% 1228 | 1229 | 1230 | Proportion 1231 | 100% 1232 | 1233 | 1234 | Name 1235 | Bookmarks 1236 | ServiceClasses 1237 | 1238 | PBXBookmarksModule 1239 | 1240 | StatusbarIsVisible 1241 | 0 1242 | WindowString 1243 | 538 42 401 187 0 0 1280 1002 1244 | 1245 | 1246 | Identifier 1247 | windowTool.projectFormatConflicts 1248 | Layout 1249 | 1250 | 1251 | Dock 1252 | 1253 | 1254 | Module 1255 | XCProjectFormatConflictsModule 1256 | Proportion 1257 | 100% 1258 | 1259 | 1260 | Proportion 1261 | 100% 1262 | 1263 | 1264 | Name 1265 | Project Format Conflicts 1266 | ServiceClasses 1267 | 1268 | XCProjectFormatConflictsModule 1269 | 1270 | StatusbarIsVisible 1271 | 0 1272 | WindowContentMinSize 1273 | 450 300 1274 | WindowString 1275 | 50 850 472 307 0 0 1440 877 1276 | 1277 | 1278 | Identifier 1279 | windowTool.classBrowser 1280 | Layout 1281 | 1282 | 1283 | Dock 1284 | 1285 | 1286 | BecomeActive 1287 | 1 1288 | ContentConfiguration 1289 | 1290 | OptionsSetName 1291 | Hierarchy, all classes 1292 | PBXProjectModuleGUID 1293 | 1CA6456E063B45B4001379D8 1294 | PBXProjectModuleLabel 1295 | Class Browser - NSObject 1296 | 1297 | GeometryConfiguration 1298 | 1299 | ClassesFrame 1300 | {{0, 0}, {374, 96}} 1301 | ClassesTreeTableConfiguration 1302 | 1303 | PBXClassNameColumnIdentifier 1304 | 208 1305 | PBXClassBookColumnIdentifier 1306 | 22 1307 | 1308 | Frame 1309 | {{0, 0}, {630, 331}} 1310 | MembersFrame 1311 | {{0, 105}, {374, 395}} 1312 | MembersTreeTableConfiguration 1313 | 1314 | PBXMemberTypeIconColumnIdentifier 1315 | 22 1316 | PBXMemberNameColumnIdentifier 1317 | 216 1318 | PBXMemberTypeColumnIdentifier 1319 | 97 1320 | PBXMemberBookColumnIdentifier 1321 | 22 1322 | 1323 | PBXModuleWindowStatusBarHidden2 1324 | 1 1325 | RubberWindowFrame 1326 | 385 179 630 352 0 0 1440 878 1327 | 1328 | Module 1329 | PBXClassBrowserModule 1330 | Proportion 1331 | 332pt 1332 | 1333 | 1334 | Proportion 1335 | 332pt 1336 | 1337 | 1338 | Name 1339 | Class Browser 1340 | ServiceClasses 1341 | 1342 | PBXClassBrowserModule 1343 | 1344 | StatusbarIsVisible 1345 | 0 1346 | TableOfContents 1347 | 1348 | 1C0AD2AF069F1E9B00FABCE6 1349 | 1C0AD2B0069F1E9B00FABCE6 1350 | 1CA6456E063B45B4001379D8 1351 | 1352 | ToolbarConfiguration 1353 | xcode.toolbar.config.classbrowser 1354 | WindowString 1355 | 385 179 630 352 0 0 1440 878 1356 | WindowToolGUID 1357 | 1C0AD2AF069F1E9B00FABCE6 1358 | WindowToolIsVisible 1359 | 0 1360 | 1361 | 1362 | Identifier 1363 | windowTool.refactoring 1364 | IncludeInToolsMenu 1365 | 0 1366 | Layout 1367 | 1368 | 1369 | Dock 1370 | 1371 | 1372 | BecomeActive 1373 | 1 1374 | GeometryConfiguration 1375 | 1376 | Frame 1377 | {0, 0}, {500, 335} 1378 | RubberWindowFrame 1379 | {0, 0}, {500, 335} 1380 | 1381 | Module 1382 | XCRefactoringModule 1383 | Proportion 1384 | 100% 1385 | 1386 | 1387 | Proportion 1388 | 100% 1389 | 1390 | 1391 | Name 1392 | Refactoring 1393 | ServiceClasses 1394 | 1395 | XCRefactoringModule 1396 | 1397 | WindowString 1398 | 200 200 500 356 0 0 1920 1200 1399 | 1400 | 1401 | 1402 | 1403 | -------------------------------------------------------------------------------- /AudioSample.xcodeproj/alex.pbxuser: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | 1D3623240D0F684500981E51 /* AudioSampleAppDelegate.h */ = { 4 | uiCtxt = { 5 | sepNavIntBoundsRect = "{{0, 0}, {1112, 741}}"; 6 | sepNavSelRange = "{0, 0}"; 7 | sepNavVisRange = "{0, 448}"; 8 | }; 9 | }; 10 | 1D3623250D0F684500981E51 /* AudioSampleAppDelegate.m */ = { 11 | uiCtxt = { 12 | sepNavIntBoundsRect = "{{0, 0}, {1112, 693}}"; 13 | sepNavSelRange = "{0, 0}"; 14 | sepNavVisRange = "{0, 832}"; 15 | }; 16 | }; 17 | 1D6058900D05DD3D006BFB54 /* AudioSample */ = { 18 | activeExec = 0; 19 | executables = ( 20 | FA3D9974105EA87A0075FE34 /* AudioSample */, 21 | ); 22 | }; 23 | 28C286DF0D94DF7D0034E888 /* RootViewController.h */ = { 24 | uiCtxt = { 25 | sepNavIntBoundsRect = "{{0, 0}, {1112, 741}}"; 26 | sepNavSelRange = "{270, 0}"; 27 | sepNavVisRange = "{0, 270}"; 28 | }; 29 | }; 30 | 28C286E00D94DF7D0034E888 /* RootViewController.m */ = { 31 | uiCtxt = { 32 | sepNavIntBoundsRect = "{{0, 0}, {1112, 2171}}"; 33 | sepNavSelRange = "{4575, 0}"; 34 | sepNavVisRange = "{3638, 1049}"; 35 | }; 36 | }; 37 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 38 | activeBuildConfigurationName = Debug; 39 | activeExecutable = FA3D9974105EA87A0075FE34 /* AudioSample */; 40 | activeSDKPreference = iphonesimulator3.1.2; 41 | activeTarget = 1D6058900D05DD3D006BFB54 /* AudioSample */; 42 | addToTargets = ( 43 | 1D6058900D05DD3D006BFB54 /* AudioSample */, 44 | ); 45 | breakpoints = ( 46 | FAAC1EBD10D6DEE100139279 /* CMOpenALSoundManager.m:220 */, 47 | ); 48 | codeSenseManager = FA3D9982105EA8850075FE34 /* Code sense */; 49 | executables = ( 50 | FA3D9974105EA87A0075FE34 /* AudioSample */, 51 | ); 52 | perUserDictionary = { 53 | "PBXConfiguration.PBXBreakpointsDataSource.v1:1CA1AED706398EBD00589147" = { 54 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 55 | PBXFileTableDataSourceColumnSortingKey = PBXBreakpointsDataSource_BreakpointID; 56 | PBXFileTableDataSourceColumnWidthsKey = ( 57 | 20, 58 | 20, 59 | 198, 60 | 20, 61 | 99, 62 | 99, 63 | 29, 64 | 20, 65 | ); 66 | PBXFileTableDataSourceColumnsKey = ( 67 | PBXBreakpointsDataSource_ActionID, 68 | PBXBreakpointsDataSource_TypeID, 69 | PBXBreakpointsDataSource_BreakpointID, 70 | PBXBreakpointsDataSource_UseID, 71 | PBXBreakpointsDataSource_LocationID, 72 | PBXBreakpointsDataSource_ConditionID, 73 | PBXBreakpointsDataSource_IgnoreCountID, 74 | PBXBreakpointsDataSource_ContinueID, 75 | ); 76 | }; 77 | PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { 78 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 79 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; 80 | PBXFileTableDataSourceColumnWidthsKey = ( 81 | 20, 82 | 934, 83 | 20, 84 | 48, 85 | 43, 86 | 43, 87 | 20, 88 | ); 89 | PBXFileTableDataSourceColumnsKey = ( 90 | PBXFileDataSource_FiletypeID, 91 | PBXFileDataSource_Filename_ColumnID, 92 | PBXFileDataSource_Built_ColumnID, 93 | PBXFileDataSource_ObjectSize_ColumnID, 94 | PBXFileDataSource_Errors_ColumnID, 95 | PBXFileDataSource_Warnings_ColumnID, 96 | PBXFileDataSource_Target_ColumnID, 97 | ); 98 | }; 99 | PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { 100 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 101 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; 102 | PBXFileTableDataSourceColumnWidthsKey = ( 103 | 20, 104 | 894, 105 | 60, 106 | 20, 107 | 48, 108 | 43, 109 | 43, 110 | ); 111 | PBXFileTableDataSourceColumnsKey = ( 112 | PBXFileDataSource_FiletypeID, 113 | PBXFileDataSource_Filename_ColumnID, 114 | PBXTargetDataSource_PrimaryAttribute, 115 | PBXFileDataSource_Built_ColumnID, 116 | PBXFileDataSource_ObjectSize_ColumnID, 117 | PBXFileDataSource_Errors_ColumnID, 118 | PBXFileDataSource_Warnings_ColumnID, 119 | ); 120 | }; 121 | PBXPerProjectTemplateStateSaveDate = 302122068; 122 | PBXWorkspaceStateSaveDate = 302122068; 123 | }; 124 | perUserProjectItems = { 125 | FA692CE912020774009A2DE5 /* PBXTextBookmark */ = FA692CE912020774009A2DE5 /* PBXTextBookmark */; 126 | FAAC1EA910D6DC8000139279 /* PBXTextBookmark */ = FAAC1EA910D6DC8000139279 /* PBXTextBookmark */; 127 | FAAC1EB910D6DE0900139279 /* PBXTextBookmark */ = FAAC1EB910D6DE0900139279 /* PBXTextBookmark */; 128 | FAAC1EF210D6E48D00139279 /* PBXTextBookmark */ = FAAC1EF210D6E48D00139279 /* PBXTextBookmark */; 129 | FAC6C95D11FE95FE006E2F21 /* PBXTextBookmark */ = FAC6C95D11FE95FE006E2F21 /* PBXTextBookmark */; 130 | FAC6C95E11FE95FE006E2F21 /* PBXTextBookmark */ = FAC6C95E11FE95FE006E2F21 /* PBXTextBookmark */; 131 | FAC6C96011FE95FE006E2F21 /* PBXTextBookmark */ = FAC6C96011FE95FE006E2F21 /* PBXTextBookmark */; 132 | FADB4FC910BC4C3200BFA7F7 /* PBXTextBookmark */ = FADB4FC910BC4C3200BFA7F7 /* PBXTextBookmark */; 133 | FADB4FCA10BC4C3200BFA7F7 /* PBXTextBookmark */ = FADB4FCA10BC4C3200BFA7F7 /* PBXTextBookmark */; 134 | FADB4FCB10BC4C3200BFA7F7 /* PBXTextBookmark */ = FADB4FCB10BC4C3200BFA7F7 /* PBXTextBookmark */; 135 | FAFCD07A10D06B9300B54D9F /* PBXTextBookmark */ = FAFCD07A10D06B9300B54D9F /* PBXTextBookmark */; 136 | }; 137 | sourceControlManager = FA3D9981105EA8850075FE34 /* Source Control */; 138 | userBuildSettings = { 139 | }; 140 | }; 141 | FA3D9974105EA87A0075FE34 /* AudioSample */ = { 142 | isa = PBXExecutable; 143 | activeArgIndices = ( 144 | ); 145 | argumentStrings = ( 146 | ); 147 | autoAttachOnCrash = 1; 148 | breakpointsEnabled = 0; 149 | configStateDict = { 150 | }; 151 | customDataFormattersEnabled = 1; 152 | dataTipCustomDataFormattersEnabled = 1; 153 | dataTipShowTypeColumn = 1; 154 | dataTipSortType = 0; 155 | debuggerPlugin = GDBDebugging; 156 | disassemblyDisplayState = 0; 157 | dylibVariantSuffix = ""; 158 | enableDebugStr = 1; 159 | environmentEntries = ( 160 | ); 161 | executableSystemSymbolLevel = 0; 162 | executableUserSymbolLevel = 0; 163 | libgmallocEnabled = 0; 164 | name = AudioSample; 165 | savedGlobals = { 166 | }; 167 | showTypeColumn = 0; 168 | sourceDirectories = ( 169 | ); 170 | variableFormatDictionary = { 171 | }; 172 | }; 173 | FA3D9978105EA8850075FE34 /* AppleOpenALSupport.h */ = { 174 | uiCtxt = { 175 | sepNavIntBoundsRect = "{{0, 0}, {1112, 806}}"; 176 | sepNavSelRange = "{0, 0}"; 177 | sepNavVisRange = "{0, 2839}"; 178 | }; 179 | }; 180 | FA3D9979105EA8850075FE34 /* AppleOpenALSupport.c */ = { 181 | uiCtxt = { 182 | sepNavIntBoundsRect = "{{0, 0}, {1112, 2054}}"; 183 | sepNavSelRange = "{2458, 105}"; 184 | sepNavVisRange = "{1108, 2342}"; 185 | }; 186 | }; 187 | FA3D997A105EA8850075FE34 /* CMOpenALSound.h */ = { 188 | uiCtxt = { 189 | sepNavIntBoundsRect = "{{0, 0}, {1112, 741}}"; 190 | sepNavSelRange = "{288, 629}"; 191 | sepNavVisRange = "{0, 1904}"; 192 | }; 193 | }; 194 | FA3D997B105EA8850075FE34 /* CMOpenALSound.m */ = { 195 | uiCtxt = { 196 | sepNavIntBoundsRect = "{{0, 0}, {1112, 3588}}"; 197 | sepNavSelRange = "{5309, 12}"; 198 | sepNavVisRange = "{5333, 1136}"; 199 | }; 200 | }; 201 | FA3D997C105EA8850075FE34 /* CMOpenALSoundManager.h */ = { 202 | uiCtxt = { 203 | sepNavIntBoundsRect = "{{0, 0}, {1112, 975}}"; 204 | sepNavSelRange = "{1686, 0}"; 205 | sepNavVisRange = "{761, 2006}"; 206 | }; 207 | }; 208 | FA3D997D105EA8850075FE34 /* CMOpenALSoundManager.m */ = { 209 | uiCtxt = { 210 | sepNavIntBoundsRect = "{{0, 0}, {1112, 5252}}"; 211 | sepNavSelRange = "{8869, 4}"; 212 | sepNavVisRange = "{8097, 1350}"; 213 | }; 214 | }; 215 | FA3D9981105EA8850075FE34 /* Source Control */ = { 216 | isa = PBXSourceControlManager; 217 | fallbackIsa = XCSourceControlManager; 218 | isSCMEnabled = 0; 219 | scmConfiguration = { 220 | repositoryNamesForRoots = { 221 | "" = ""; 222 | }; 223 | }; 224 | }; 225 | FA3D9982105EA8850075FE34 /* Code sense */ = { 226 | isa = PBXCodeSenseManager; 227 | indexTemplatePath = ""; 228 | }; 229 | FA3D9984105EA88A0075FE34 /* DebugOutput.h */ = { 230 | uiCtxt = { 231 | sepNavIntBoundsRect = "{{0, 0}, {1112, 741}}"; 232 | sepNavSelRange = "{427, 0}"; 233 | sepNavVisRange = "{0, 809}"; 234 | }; 235 | }; 236 | FA3D9985105EA88A0075FE34 /* DebugOutput.m */ = { 237 | uiCtxt = { 238 | sepNavIntBoundsRect = "{{0, 0}, {1112, 1352}}"; 239 | sepNavSelRange = "{886, 0}"; 240 | sepNavVisRange = "{410, 1112}"; 241 | }; 242 | }; 243 | FA3D998E105EA8A50075FE34 /* SynthesizeSingleton.h */ = { 244 | uiCtxt = { 245 | sepNavIntBoundsRect = "{{0, 0}, {1112, 897}}"; 246 | sepNavSelRange = "{0, 0}"; 247 | sepNavVisRange = "{0, 1205}"; 248 | }; 249 | }; 250 | FA692CE912020774009A2DE5 /* PBXTextBookmark */ = { 251 | isa = PBXTextBookmark; 252 | fRef = FA3D997B105EA8850075FE34 /* CMOpenALSound.m */; 253 | name = "CMOpenALSound.m: 186"; 254 | rLen = 12; 255 | rLoc = 5309; 256 | rType = 0; 257 | vrLen = 1136; 258 | vrLoc = 5333; 259 | }; 260 | FA74238210A87F4300342F0E /* License */ = { 261 | uiCtxt = { 262 | sepNavIntBoundsRect = "{{0, 0}, {1112, 741}}"; 263 | sepNavSelRange = "{738, 0}"; 264 | sepNavVisRange = "{0, 738}"; 265 | }; 266 | }; 267 | FAAC1EA910D6DC8000139279 /* PBXTextBookmark */ = { 268 | isa = PBXTextBookmark; 269 | fRef = FA3D9985105EA88A0075FE34 /* DebugOutput.m */; 270 | name = "DebugOutput.m: 34"; 271 | rLen = 0; 272 | rLoc = 886; 273 | rType = 0; 274 | vrLen = 1112; 275 | vrLoc = 410; 276 | }; 277 | FAAC1EB910D6DE0900139279 /* PBXTextBookmark */ = { 278 | isa = PBXTextBookmark; 279 | fRef = 1D3623250D0F684500981E51 /* AudioSampleAppDelegate.m */; 280 | name = "AudioSampleAppDelegate.m: 1"; 281 | rLen = 0; 282 | rLoc = 0; 283 | rType = 0; 284 | vrLen = 832; 285 | vrLoc = 0; 286 | }; 287 | FAAC1EBD10D6DEE100139279 /* CMOpenALSoundManager.m:220 */ = { 288 | isa = PBXFileBreakpoint; 289 | actions = ( 290 | ); 291 | breakpointStyle = 0; 292 | continueAfterActions = 0; 293 | countType = 0; 294 | delayBeforeContinue = 0; 295 | fileReference = FA3D997D105EA8850075FE34 /* CMOpenALSoundManager.m */; 296 | functionName = "-purgeSounds"; 297 | hitCount = 1; 298 | ignoreCount = 0; 299 | lineNumber = 220; 300 | modificationTime = 290103980.092953; 301 | originalNumberOfMultipleMatches = 1; 302 | state = 1; 303 | }; 304 | FAAC1EF210D6E48D00139279 /* PBXTextBookmark */ = { 305 | isa = PBXTextBookmark; 306 | fRef = 28C286E00D94DF7D0034E888 /* RootViewController.m */; 307 | name = "RootViewController.m: 154"; 308 | rLen = 0; 309 | rLoc = 4575; 310 | rType = 0; 311 | vrLen = 1049; 312 | vrLoc = 3638; 313 | }; 314 | FAC6C95D11FE95FE006E2F21 /* PBXTextBookmark */ = { 315 | isa = PBXTextBookmark; 316 | fRef = FA3D997C105EA8850075FE34 /* CMOpenALSoundManager.h */; 317 | name = "CMOpenALSoundManager.h: 45"; 318 | rLen = 0; 319 | rLoc = 1686; 320 | rType = 0; 321 | vrLen = 2006; 322 | vrLoc = 761; 323 | }; 324 | FAC6C95E11FE95FE006E2F21 /* PBXTextBookmark */ = { 325 | isa = PBXTextBookmark; 326 | fRef = FA3D997D105EA8850075FE34 /* CMOpenALSoundManager.m */; 327 | name = "CMOpenALSoundManager.m: 332"; 328 | rLen = 4; 329 | rLoc = 8869; 330 | rType = 0; 331 | vrLen = 1350; 332 | vrLoc = 8097; 333 | }; 334 | FAC6C96011FE95FE006E2F21 /* PBXTextBookmark */ = { 335 | isa = PBXTextBookmark; 336 | fRef = FA3D997B105EA8850075FE34 /* CMOpenALSound.m */; 337 | name = "CMOpenALSound.m: 162"; 338 | rLen = 14; 339 | rLoc = 4571; 340 | rType = 0; 341 | vrLen = 1486; 342 | vrLoc = 4007; 343 | }; 344 | FADB4FC910BC4C3200BFA7F7 /* PBXTextBookmark */ = { 345 | isa = PBXTextBookmark; 346 | fRef = FA3D9978105EA8850075FE34 /* AppleOpenALSupport.h */; 347 | name = "AppleOpenALSupport.h: 1"; 348 | rLen = 0; 349 | rLoc = 0; 350 | rType = 0; 351 | vrLen = 2839; 352 | vrLoc = 0; 353 | }; 354 | FADB4FCA10BC4C3200BFA7F7 /* PBXTextBookmark */ = { 355 | isa = PBXTextBookmark; 356 | fRef = FA3D9979105EA8850075FE34 /* AppleOpenALSupport.c */; 357 | name = "AppleOpenALSupport.c: 52"; 358 | rLen = 105; 359 | rLoc = 2458; 360 | rType = 0; 361 | vrLen = 2342; 362 | vrLoc = 1108; 363 | }; 364 | FADB4FCB10BC4C3200BFA7F7 /* PBXTextBookmark */ = { 365 | isa = PBXTextBookmark; 366 | fRef = 28C286DF0D94DF7D0034E888 /* RootViewController.h */; 367 | name = "RootViewController.h: 15"; 368 | rLen = 0; 369 | rLoc = 270; 370 | rType = 0; 371 | vrLen = 270; 372 | vrLoc = 0; 373 | }; 374 | FAFCD07A10D06B9300B54D9F /* PBXTextBookmark */ = { 375 | isa = PBXTextBookmark; 376 | fRef = FA3D997A105EA8850075FE34 /* CMOpenALSound.h */; 377 | name = "CMOpenALSound.h: 10"; 378 | rLen = 629; 379 | rLoc = 288; 380 | rType = 0; 381 | vrLen = 1904; 382 | vrLoc = 0; 383 | }; 384 | } 385 | -------------------------------------------------------------------------------- /AudioSample.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1D3623260D0F684500981E51 /* AudioSampleAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* AudioSampleAppDelegate.m */; }; 11 | 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; 12 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 13 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 14 | 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */; }; 15 | 28AD73600D9D9599002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD735F0D9D9599002E5188 /* MainWindow.xib */; }; 16 | 28C286E10D94DF7D0034E888 /* RootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28C286E00D94DF7D0034E888 /* RootViewController.m */; }; 17 | 28F335F11007B36200424DE2 /* RootViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28F335F01007B36200424DE2 /* RootViewController.xib */; }; 18 | FA3D997E105EA8850075FE34 /* AppleOpenALSupport.c in Sources */ = {isa = PBXBuildFile; fileRef = FA3D9979105EA8850075FE34 /* AppleOpenALSupport.c */; }; 19 | FA3D997F105EA8850075FE34 /* CMOpenALSound.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3D997B105EA8850075FE34 /* CMOpenALSound.m */; }; 20 | FA3D9980105EA8850075FE34 /* CMOpenALSoundManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3D997D105EA8850075FE34 /* CMOpenALSoundManager.m */; }; 21 | FA3D9986105EA88A0075FE34 /* DebugOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3D9985105EA88A0075FE34 /* DebugOutput.m */; }; 22 | FA3D9988105EA8920075FE34 /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA3D9987105EA8920075FE34 /* OpenAL.framework */; }; 23 | FA3D998A105EA8970075FE34 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA3D9989105EA8970075FE34 /* AudioToolbox.framework */; }; 24 | FA3D998C105EA89A0075FE34 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA3D998B105EA89A0075FE34 /* AVFoundation.framework */; }; 25 | FA3D99AE105EAC4E0075FE34 /* Start.caf in Resources */ = {isa = PBXBuildFile; fileRef = FA3D99AC105EAC4E0075FE34 /* Start.caf */; }; 26 | FA3D99AF105EAC4E0075FE34 /* backgroundLoop.m4a in Resources */ = {isa = PBXBuildFile; fileRef = FA3D99AD105EAC4E0075FE34 /* backgroundLoop.m4a */; }; 27 | FA3D99B9105EAC920075FE34 /* volumedown.png in Resources */ = {isa = PBXBuildFile; fileRef = FA3D99B7105EAC920075FE34 /* volumedown.png */; }; 28 | FA3D99BA105EAC920075FE34 /* volumeup.png in Resources */ = {isa = PBXBuildFile; fileRef = FA3D99B8105EAC920075FE34 /* volumeup.png */; }; 29 | FA4A19C0152D3EE300FDB704 /* engine.caf in Resources */ = {isa = PBXBuildFile; fileRef = FA4A19BF152D3EE300FDB704 /* engine.caf */; }; 30 | /* End PBXBuildFile section */ 31 | 32 | /* Begin PBXFileReference section */ 33 | 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 34 | 1D3623240D0F684500981E51 /* AudioSampleAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioSampleAppDelegate.h; sourceTree = ""; }; 35 | 1D3623250D0F684500981E51 /* AudioSampleAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AudioSampleAppDelegate.m; sourceTree = ""; }; 36 | 1D6058910D05DD3D006BFB54 /* AudioSample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AudioSample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 37 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 38 | 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 39 | 28A0AAE50D9B0CCF005BE974 /* AudioSample_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioSample_Prefix.pch; sourceTree = ""; }; 40 | 28AD735F0D9D9599002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; 41 | 28C286DF0D94DF7D0034E888 /* RootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RootViewController.h; sourceTree = ""; }; 42 | 28C286E00D94DF7D0034E888 /* RootViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RootViewController.m; sourceTree = ""; }; 43 | 28F335F01007B36200424DE2 /* RootViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RootViewController.xib; sourceTree = ""; }; 44 | 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 45 | 8D1107310486CEB800E47090 /* AudioSample-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "AudioSample-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; 46 | FA3D9978105EA8850075FE34 /* AppleOpenALSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppleOpenALSupport.h; sourceTree = ""; }; 47 | FA3D9979105EA8850075FE34 /* AppleOpenALSupport.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = AppleOpenALSupport.c; sourceTree = ""; }; 48 | FA3D997A105EA8850075FE34 /* CMOpenALSound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMOpenALSound.h; sourceTree = ""; }; 49 | FA3D997B105EA8850075FE34 /* CMOpenALSound.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMOpenALSound.m; sourceTree = ""; }; 50 | FA3D997C105EA8850075FE34 /* CMOpenALSoundManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMOpenALSoundManager.h; sourceTree = ""; }; 51 | FA3D997D105EA8850075FE34 /* CMOpenALSoundManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMOpenALSoundManager.m; sourceTree = ""; }; 52 | FA3D9984105EA88A0075FE34 /* DebugOutput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebugOutput.h; sourceTree = ""; }; 53 | FA3D9985105EA88A0075FE34 /* DebugOutput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DebugOutput.m; sourceTree = ""; }; 54 | FA3D9987105EA8920075FE34 /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; }; 55 | FA3D9989105EA8970075FE34 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; 56 | FA3D998B105EA89A0075FE34 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; 57 | FA3D998E105EA8A50075FE34 /* SynthesizeSingleton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SynthesizeSingleton.h; sourceTree = ""; }; 58 | FA3D99AC105EAC4E0075FE34 /* Start.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Start.caf; sourceTree = ""; }; 59 | FA3D99AD105EAC4E0075FE34 /* backgroundLoop.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = backgroundLoop.m4a; sourceTree = ""; }; 60 | FA3D99B7105EAC920075FE34 /* volumedown.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = volumedown.png; sourceTree = ""; }; 61 | FA3D99B8105EAC920075FE34 /* volumeup.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = volumeup.png; sourceTree = ""; }; 62 | FA4A19BF152D3EE300FDB704 /* engine.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = engine.caf; sourceTree = ""; }; 63 | FA4CE6D515F2E2E900544934 /* Readme.markdown */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Readme.markdown; sourceTree = SOURCE_ROOT; }; 64 | FA74238210A87F4300342F0E /* License */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = License; path = ../License; sourceTree = ""; }; 65 | /* End PBXFileReference section */ 66 | 67 | /* Begin PBXFrameworksBuildPhase section */ 68 | 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { 69 | isa = PBXFrameworksBuildPhase; 70 | buildActionMask = 2147483647; 71 | files = ( 72 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 73 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 74 | 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */, 75 | FA3D9988105EA8920075FE34 /* OpenAL.framework in Frameworks */, 76 | FA3D998A105EA8970075FE34 /* AudioToolbox.framework in Frameworks */, 77 | FA3D998C105EA89A0075FE34 /* AVFoundation.framework in Frameworks */, 78 | ); 79 | runOnlyForDeploymentPostprocessing = 0; 80 | }; 81 | /* End PBXFrameworksBuildPhase section */ 82 | 83 | /* Begin PBXGroup section */ 84 | 080E96DDFE201D6D7F000001 /* Classes */ = { 85 | isa = PBXGroup; 86 | children = ( 87 | FA4CE6D515F2E2E900544934 /* Readme.markdown */, 88 | FA74238210A87F4300342F0E /* License */, 89 | FA3D9983105EA88A0075FE34 /* Debug */, 90 | FA3D9977105EA8850075FE34 /* SoundEngine */, 91 | 28C286DF0D94DF7D0034E888 /* RootViewController.h */, 92 | 28C286E00D94DF7D0034E888 /* RootViewController.m */, 93 | 1D3623240D0F684500981E51 /* AudioSampleAppDelegate.h */, 94 | 1D3623250D0F684500981E51 /* AudioSampleAppDelegate.m */, 95 | ); 96 | path = Classes; 97 | sourceTree = ""; 98 | }; 99 | 19C28FACFE9D520D11CA2CBB /* Products */ = { 100 | isa = PBXGroup; 101 | children = ( 102 | 1D6058910D05DD3D006BFB54 /* AudioSample.app */, 103 | ); 104 | name = Products; 105 | sourceTree = ""; 106 | }; 107 | 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { 108 | isa = PBXGroup; 109 | children = ( 110 | 080E96DDFE201D6D7F000001 /* Classes */, 111 | 29B97315FDCFA39411CA2CEA /* Other Sources */, 112 | 29B97317FDCFA39411CA2CEA /* Resources */, 113 | 29B97323FDCFA39411CA2CEA /* Frameworks */, 114 | 19C28FACFE9D520D11CA2CBB /* Products */, 115 | ); 116 | name = CustomTemplate; 117 | sourceTree = ""; 118 | }; 119 | 29B97315FDCFA39411CA2CEA /* Other Sources */ = { 120 | isa = PBXGroup; 121 | children = ( 122 | 28A0AAE50D9B0CCF005BE974 /* AudioSample_Prefix.pch */, 123 | 29B97316FDCFA39411CA2CEA /* main.m */, 124 | ); 125 | name = "Other Sources"; 126 | sourceTree = ""; 127 | }; 128 | 29B97317FDCFA39411CA2CEA /* Resources */ = { 129 | isa = PBXGroup; 130 | children = ( 131 | FA3D99B7105EAC920075FE34 /* volumedown.png */, 132 | FA3D99B8105EAC920075FE34 /* volumeup.png */, 133 | FA3D99AC105EAC4E0075FE34 /* Start.caf */, 134 | FA4A19BF152D3EE300FDB704 /* engine.caf */, 135 | FA3D99AD105EAC4E0075FE34 /* backgroundLoop.m4a */, 136 | 28F335F01007B36200424DE2 /* RootViewController.xib */, 137 | 28AD735F0D9D9599002E5188 /* MainWindow.xib */, 138 | 8D1107310486CEB800E47090 /* AudioSample-Info.plist */, 139 | ); 140 | name = Resources; 141 | sourceTree = ""; 142 | }; 143 | 29B97323FDCFA39411CA2CEA /* Frameworks */ = { 144 | isa = PBXGroup; 145 | children = ( 146 | FA3D998B105EA89A0075FE34 /* AVFoundation.framework */, 147 | FA3D9989105EA8970075FE34 /* AudioToolbox.framework */, 148 | FA3D9987105EA8920075FE34 /* OpenAL.framework */, 149 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, 150 | 1D30AB110D05D00D00671497 /* Foundation.framework */, 151 | 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */, 152 | ); 153 | name = Frameworks; 154 | sourceTree = ""; 155 | }; 156 | FA3D9977105EA8850075FE34 /* SoundEngine */ = { 157 | isa = PBXGroup; 158 | children = ( 159 | FA3D998E105EA8A50075FE34 /* SynthesizeSingleton.h */, 160 | FA3D9978105EA8850075FE34 /* AppleOpenALSupport.h */, 161 | FA3D9979105EA8850075FE34 /* AppleOpenALSupport.c */, 162 | FA3D997A105EA8850075FE34 /* CMOpenALSound.h */, 163 | FA3D997B105EA8850075FE34 /* CMOpenALSound.m */, 164 | FA3D997C105EA8850075FE34 /* CMOpenALSoundManager.h */, 165 | FA3D997D105EA8850075FE34 /* CMOpenALSoundManager.m */, 166 | ); 167 | name = SoundEngine; 168 | sourceTree = ""; 169 | }; 170 | FA3D9983105EA88A0075FE34 /* Debug */ = { 171 | isa = PBXGroup; 172 | children = ( 173 | FA3D9984105EA88A0075FE34 /* DebugOutput.h */, 174 | FA3D9985105EA88A0075FE34 /* DebugOutput.m */, 175 | ); 176 | name = Debug; 177 | sourceTree = ""; 178 | }; 179 | /* End PBXGroup section */ 180 | 181 | /* Begin PBXNativeTarget section */ 182 | 1D6058900D05DD3D006BFB54 /* AudioSample */ = { 183 | isa = PBXNativeTarget; 184 | buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "AudioSample" */; 185 | buildPhases = ( 186 | 1D60588D0D05DD3D006BFB54 /* Resources */, 187 | 1D60588E0D05DD3D006BFB54 /* Sources */, 188 | 1D60588F0D05DD3D006BFB54 /* Frameworks */, 189 | ); 190 | buildRules = ( 191 | ); 192 | dependencies = ( 193 | ); 194 | name = AudioSample; 195 | productName = AudioSample; 196 | productReference = 1D6058910D05DD3D006BFB54 /* AudioSample.app */; 197 | productType = "com.apple.product-type.application"; 198 | }; 199 | /* End PBXNativeTarget section */ 200 | 201 | /* Begin PBXProject section */ 202 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 203 | isa = PBXProject; 204 | attributes = { 205 | LastUpgradeCheck = 0440; 206 | }; 207 | buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "AudioSample" */; 208 | compatibilityVersion = "Xcode 3.2"; 209 | developmentRegion = English; 210 | hasScannedForEncodings = 1; 211 | knownRegions = ( 212 | English, 213 | Japanese, 214 | French, 215 | German, 216 | en, 217 | ); 218 | mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; 219 | projectDirPath = ""; 220 | projectRoot = ""; 221 | targets = ( 222 | 1D6058900D05DD3D006BFB54 /* AudioSample */, 223 | ); 224 | }; 225 | /* End PBXProject section */ 226 | 227 | /* Begin PBXResourcesBuildPhase section */ 228 | 1D60588D0D05DD3D006BFB54 /* Resources */ = { 229 | isa = PBXResourcesBuildPhase; 230 | buildActionMask = 2147483647; 231 | files = ( 232 | 28AD73600D9D9599002E5188 /* MainWindow.xib in Resources */, 233 | 28F335F11007B36200424DE2 /* RootViewController.xib in Resources */, 234 | FA3D99AE105EAC4E0075FE34 /* Start.caf in Resources */, 235 | FA3D99AF105EAC4E0075FE34 /* backgroundLoop.m4a in Resources */, 236 | FA3D99B9105EAC920075FE34 /* volumedown.png in Resources */, 237 | FA3D99BA105EAC920075FE34 /* volumeup.png in Resources */, 238 | FA4A19C0152D3EE300FDB704 /* engine.caf in Resources */, 239 | ); 240 | runOnlyForDeploymentPostprocessing = 0; 241 | }; 242 | /* End PBXResourcesBuildPhase section */ 243 | 244 | /* Begin PBXSourcesBuildPhase section */ 245 | 1D60588E0D05DD3D006BFB54 /* Sources */ = { 246 | isa = PBXSourcesBuildPhase; 247 | buildActionMask = 2147483647; 248 | files = ( 249 | 1D60589B0D05DD56006BFB54 /* main.m in Sources */, 250 | 1D3623260D0F684500981E51 /* AudioSampleAppDelegate.m in Sources */, 251 | 28C286E10D94DF7D0034E888 /* RootViewController.m in Sources */, 252 | FA3D997E105EA8850075FE34 /* AppleOpenALSupport.c in Sources */, 253 | FA3D997F105EA8850075FE34 /* CMOpenALSound.m in Sources */, 254 | FA3D9980105EA8850075FE34 /* CMOpenALSoundManager.m in Sources */, 255 | FA3D9986105EA88A0075FE34 /* DebugOutput.m in Sources */, 256 | ); 257 | runOnlyForDeploymentPostprocessing = 0; 258 | }; 259 | /* End PBXSourcesBuildPhase section */ 260 | 261 | /* Begin XCBuildConfiguration section */ 262 | 1D6058940D05DD3E006BFB54 /* Debug */ = { 263 | isa = XCBuildConfiguration; 264 | buildSettings = { 265 | ALWAYS_SEARCH_USER_PATHS = NO; 266 | COPY_PHASE_STRIP = NO; 267 | GCC_DYNAMIC_NO_PIC = NO; 268 | GCC_OPTIMIZATION_LEVEL = 0; 269 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 270 | GCC_PREFIX_HEADER = AudioSample_Prefix.pch; 271 | INFOPLIST_FILE = "AudioSample-Info.plist"; 272 | PRODUCT_NAME = AudioSample; 273 | }; 274 | name = Debug; 275 | }; 276 | 1D6058950D05DD3E006BFB54 /* Release */ = { 277 | isa = XCBuildConfiguration; 278 | buildSettings = { 279 | ALWAYS_SEARCH_USER_PATHS = NO; 280 | COPY_PHASE_STRIP = YES; 281 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 282 | GCC_PREFIX_HEADER = AudioSample_Prefix.pch; 283 | INFOPLIST_FILE = "AudioSample-Info.plist"; 284 | PRODUCT_NAME = AudioSample; 285 | }; 286 | name = Release; 287 | }; 288 | C01FCF4F08A954540054247B /* Debug */ = { 289 | isa = XCBuildConfiguration; 290 | buildSettings = { 291 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 292 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 293 | GCC_C_LANGUAGE_STANDARD = c99; 294 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 295 | GCC_WARN_UNUSED_VARIABLE = YES; 296 | SDKROOT = iphoneos; 297 | }; 298 | name = Debug; 299 | }; 300 | C01FCF5008A954540054247B /* Release */ = { 301 | isa = XCBuildConfiguration; 302 | buildSettings = { 303 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 304 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 305 | GCC_C_LANGUAGE_STANDARD = c99; 306 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 307 | GCC_WARN_UNUSED_VARIABLE = YES; 308 | SDKROOT = iphoneos; 309 | }; 310 | name = Release; 311 | }; 312 | /* End XCBuildConfiguration section */ 313 | 314 | /* Begin XCConfigurationList section */ 315 | 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "AudioSample" */ = { 316 | isa = XCConfigurationList; 317 | buildConfigurations = ( 318 | 1D6058940D05DD3E006BFB54 /* Debug */, 319 | 1D6058950D05DD3E006BFB54 /* Release */, 320 | ); 321 | defaultConfigurationIsVisible = 0; 322 | defaultConfigurationName = Release; 323 | }; 324 | C01FCF4E08A954540054247B /* Build configuration list for PBXProject "AudioSample" */ = { 325 | isa = XCConfigurationList; 326 | buildConfigurations = ( 327 | C01FCF4F08A954540054247B /* Debug */, 328 | C01FCF5008A954540054247B /* Release */, 329 | ); 330 | defaultConfigurationIsVisible = 0; 331 | defaultConfigurationName = Release; 332 | }; 333 | /* End XCConfigurationList section */ 334 | }; 335 | rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; 336 | } 337 | -------------------------------------------------------------------------------- /AudioSample.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /AudioSample.xcodeproj/project.xcworkspace/xcuserdata/alex.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges 6 | 7 | SnapshotAutomaticallyBeforeSignificantChanges 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /AudioSample.xcodeproj/xcuserdata/alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /AudioSample.xcodeproj/xcuserdata/alex.xcuserdatad/xcschemes/AudioSample.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 51 | 52 | 58 | 59 | 60 | 61 | 62 | 63 | 69 | 70 | 76 | 77 | 78 | 79 | 81 | 82 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /AudioSample.xcodeproj/xcuserdata/alex.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | AudioSample.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 1D6058900D05DD3D006BFB54 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /AudioSample_Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'AudioSample' target in the 'AudioSample' project 3 | // 4 | #import 5 | 6 | #ifndef __IPHONE_3_0 7 | #warning "This project uses features only available in iPhone SDK 3.0 and later." 8 | #endif 9 | 10 | 11 | #ifdef __OBJC__ 12 | #import 13 | #import 14 | #endif 15 | -------------------------------------------------------------------------------- /Classes/AppleOpenALSupport.c: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | File: MyOpenALSupport.c 4 | Abstract: OpenAL-related support functions 5 | Version: 1.4 6 | 7 | Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple 8 | Inc. ("Apple") in consideration of your agreement to the following 9 | terms, and your use, installation, modification or redistribution of 10 | this Apple software constitutes acceptance of these terms. If you do 11 | not agree with these terms, please do not use, install, modify or 12 | redistribute this Apple software. 13 | 14 | In consideration of your agreement to abide by the following terms, and 15 | subject to these terms, Apple grants you a personal, non-exclusive 16 | license, under Apple's copyrights in this original Apple software (the 17 | "Apple Software"), to use, reproduce, modify and redistribute the Apple 18 | Software, with or without modifications, in source and/or binary forms; 19 | provided that if you redistribute the Apple Software in its entirety and 20 | without modifications, you must retain this notice and the following 21 | text and disclaimers in all such redistributions of the Apple Software. 22 | Neither the name, trademarks, service marks or logos of Apple Inc. may 23 | be used to endorse or promote products derived from the Apple Software 24 | without specific prior written permission from Apple. Except as 25 | expressly stated in this notice, no other rights or licenses, express or 26 | implied, are granted by Apple herein, including but not limited to any 27 | patent rights that may be infringed by your derivative works or by other 28 | works in which the Apple Software may be incorporated. 29 | 30 | The Apple Software is provided by Apple on an "AS IS" basis. APPLE 31 | MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION 32 | THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS 33 | FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND 34 | OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. 35 | 36 | IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL 37 | OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 38 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 39 | INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, 40 | MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED 41 | AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), 42 | STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE 43 | POSSIBILITY OF SUCH DAMAGE. 44 | 45 | Copyright (C) 2009 Apple Inc. All Rights Reserved. 46 | 47 | 48 | */ 49 | 50 | #include "AppleOpenALSupport.h" 51 | 52 | ALvoid alBufferDataStaticProc(const ALint bid, ALenum format, ALvoid* data, ALsizei size, ALsizei freq) 53 | { 54 | static alBufferDataStaticProcPtr proc = NULL; 55 | 56 | if (proc == NULL) { 57 | proc = (alBufferDataStaticProcPtr) alcGetProcAddress(NULL, (const ALCchar*) "alBufferDataStatic"); 58 | } 59 | 60 | if (proc) 61 | proc(bid, format, data, size, freq); 62 | 63 | return; 64 | } 65 | 66 | void* MyGetOpenALAudioData(CFURLRef inFileURL, ALsizei *outDataSize, ALenum *outDataFormat, ALsizei *outSampleRate, ALdouble *duration) 67 | { 68 | OSStatus err = noErr; 69 | SInt64 theFileLengthInFrames = 0; 70 | AudioStreamBasicDescription theFileFormat; 71 | UInt32 thePropertySize = sizeof(theFileFormat); 72 | ExtAudioFileRef extRef = NULL; 73 | void* theData = NULL; 74 | AudioStreamBasicDescription theOutputFormat; 75 | 76 | // Open a file with ExtAudioFileOpen() 77 | err = ExtAudioFileOpenURL(inFileURL, &extRef); 78 | if(err) { printf("MyGetOpenALAudioData: ExtAudioFileOpenURL FAILED, Error = %ld\n", err); goto Exit; } 79 | 80 | // Get the audio data format 81 | err = ExtAudioFileGetProperty(extRef, kExtAudioFileProperty_FileDataFormat, &thePropertySize, &theFileFormat); 82 | if(err) { printf("MyGetOpenALAudioData: ExtAudioFileGetProperty(kExtAudioFileProperty_FileDataFormat) FAILED, Error = %ld\n", err); goto Exit; } 83 | if (theFileFormat.mChannelsPerFrame > 2) { printf("MyGetOpenALAudioData - Unsupported Format, channel count is greater than stereo\n"); goto Exit;} 84 | 85 | // Set the client format to 16 bit signed integer (native-endian) data 86 | // Maintain the channel count and sample rate of the original source format 87 | theOutputFormat.mSampleRate = theFileFormat.mSampleRate; 88 | theOutputFormat.mChannelsPerFrame = theFileFormat.mChannelsPerFrame; 89 | 90 | theOutputFormat.mFormatID = kAudioFormatLinearPCM; 91 | theOutputFormat.mBytesPerPacket = 2 * theOutputFormat.mChannelsPerFrame; 92 | theOutputFormat.mFramesPerPacket = 1; 93 | theOutputFormat.mBytesPerFrame = 2 * theOutputFormat.mChannelsPerFrame; 94 | theOutputFormat.mBitsPerChannel = 16; 95 | theOutputFormat.mFormatFlags = kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger; 96 | 97 | // Set the desired client (output) data format 98 | err = ExtAudioFileSetProperty(extRef, kExtAudioFileProperty_ClientDataFormat, sizeof(theOutputFormat), &theOutputFormat); 99 | if(err) { printf("MyGetOpenALAudioData: ExtAudioFileSetProperty(kExtAudioFileProperty_ClientDataFormat) FAILED, Error = %ld\n", err); goto Exit; } 100 | 101 | // Get the total frame count 102 | thePropertySize = sizeof(theFileLengthInFrames); 103 | err = ExtAudioFileGetProperty(extRef, kExtAudioFileProperty_FileLengthFrames, &thePropertySize, &theFileLengthInFrames); 104 | if(err) { printf("MyGetOpenALAudioData: ExtAudioFileGetProperty(kExtAudioFileProperty_FileLengthFrames) FAILED, Error = %ld\n", err); goto Exit; } 105 | 106 | // Read all the data into memory 107 | UInt32 dataSize = theFileLengthInFrames * theOutputFormat.mBytesPerFrame;; 108 | theData = malloc(dataSize); 109 | if (theData) 110 | { 111 | AudioBufferList theDataBuffer; 112 | theDataBuffer.mNumberBuffers = 1; 113 | theDataBuffer.mBuffers[0].mDataByteSize = dataSize; 114 | theDataBuffer.mBuffers[0].mNumberChannels = theOutputFormat.mChannelsPerFrame; 115 | theDataBuffer.mBuffers[0].mData = theData; 116 | 117 | // Read the data into an AudioBufferList 118 | err = ExtAudioFileRead(extRef, (UInt32*)&theFileLengthInFrames, &theDataBuffer); 119 | if(err == noErr) 120 | { 121 | // success 122 | *outDataSize = (ALsizei)dataSize; 123 | *outDataFormat = (theOutputFormat.mChannelsPerFrame > 1) ? AL_FORMAT_STEREO16 : AL_FORMAT_MONO16; 124 | *outSampleRate = (ALsizei)theOutputFormat.mSampleRate; 125 | } 126 | else 127 | { 128 | // failure 129 | free (theData); 130 | theData = NULL; // make sure to return NULL 131 | printf("MyGetOpenALAudioData: ExtAudioFileRead FAILED, Error = %ld\n", err); goto Exit; 132 | } 133 | } 134 | 135 | // Alex(Colombiamug): get the file duration... 136 | // first, get the audioID for the file... 137 | AudioFileID audioID; 138 | UInt32 audioIDSize = sizeof(audioID); 139 | err = ExtAudioFileGetProperty(extRef, kExtAudioFileProperty_AudioFile, &audioIDSize, &audioID); 140 | if(err) { printf("MyGetOpenALAudioData: ExtAudioFileGetProperty(kExtAudioFileProperty_AudioFile) FAILED, Error = %ld\n", err); goto Exit; } 141 | 142 | //now the duration... 143 | double soundDuration; 144 | UInt32 durationSize = sizeof(soundDuration); 145 | err = AudioFileGetProperty(audioID, kAudioFilePropertyEstimatedDuration, &durationSize, &soundDuration); 146 | if(err) { printf("MyGetOpenALAudioData: AudioFileGetProperty(kAudioFilePropertyEstimatedDuration) FAILED, Error = %ld\n", err); goto Exit; } 147 | 148 | *duration = soundDuration; 149 | //printf("Audio duration:%f secs.\n", soundDuration); 150 | 151 | Exit: 152 | // Dispose the ExtAudioFileRef, it is no longer needed 153 | if (extRef) ExtAudioFileDispose(extRef); 154 | return theData; 155 | } 156 | 157 | -------------------------------------------------------------------------------- /Classes/AppleOpenALSupport.h: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | File: MyOpenALSupport.h 4 | Abstract: OpenAL-related support functions 5 | Version: 1.4 6 | 7 | Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple 8 | Inc. ("Apple") in consideration of your agreement to the following 9 | terms, and your use, installation, modification or redistribution of 10 | this Apple software constitutes acceptance of these terms. If you do 11 | not agree with these terms, please do not use, install, modify or 12 | redistribute this Apple software. 13 | 14 | In consideration of your agreement to abide by the following terms, and 15 | subject to these terms, Apple grants you a personal, non-exclusive 16 | license, under Apple's copyrights in this original Apple software (the 17 | "Apple Software"), to use, reproduce, modify and redistribute the Apple 18 | Software, with or without modifications, in source and/or binary forms; 19 | provided that if you redistribute the Apple Software in its entirety and 20 | without modifications, you must retain this notice and the following 21 | text and disclaimers in all such redistributions of the Apple Software. 22 | Neither the name, trademarks, service marks or logos of Apple Inc. may 23 | be used to endorse or promote products derived from the Apple Software 24 | without specific prior written permission from Apple. Except as 25 | expressly stated in this notice, no other rights or licenses, express or 26 | implied, are granted by Apple herein, including but not limited to any 27 | patent rights that may be infringed by your derivative works or by other 28 | works in which the Apple Software may be incorporated. 29 | 30 | The Apple Software is provided by Apple on an "AS IS" basis. APPLE 31 | MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION 32 | THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS 33 | FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND 34 | OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. 35 | 36 | IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL 37 | OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 38 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 39 | INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, 40 | MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED 41 | AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), 42 | STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE 43 | POSSIBILITY OF SUCH DAMAGE. 44 | 45 | Copyright (C) 2009 Apple Inc. All Rights Reserved. 46 | 47 | 48 | */ 49 | 50 | #import 51 | #import 52 | #import 53 | #import 54 | #import 55 | 56 | //typedef ALvoid AL_APIENTRY (*alBufferDataStaticProcPtr) (const ALint bid, ALenum format, ALvoid* data, ALsizei size, ALsizei freq); 57 | ALvoid alBufferDataStaticProc(const ALint bid, ALenum format, ALvoid* data, ALsizei size, ALsizei freq); 58 | 59 | void* MyGetOpenALAudioData(CFURLRef inFileURL, ALsizei *outDataSize, ALenum *outDataFormat, ALsizei *outSampleRate, ALdouble *duration); 60 | 61 | 62 | -------------------------------------------------------------------------------- /Classes/AudioSampleAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AudioSampleAppDelegate.h 3 | // AudioSample 4 | // 5 | // Created by Alex Restrepo on 9/14/09. 6 | // Copyright Brainchild 2009. All rights reserved. 7 | // 8 | 9 | @interface AudioSampleAppDelegate : NSObject { 10 | 11 | UIWindow *window; 12 | UINavigationController *navigationController; 13 | } 14 | 15 | @property (nonatomic, retain) IBOutlet UIWindow *window; 16 | @property (nonatomic, retain) IBOutlet UINavigationController *navigationController; 17 | 18 | @end 19 | 20 | -------------------------------------------------------------------------------- /Classes/AudioSampleAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AudioSampleAppDelegate.m 3 | // AudioSample 4 | // 5 | // Created by Alex Restrepo on 9/14/09. 6 | // Copyright Brainchild 2009. All rights reserved. 7 | // 8 | 9 | #import "AudioSampleAppDelegate.h" 10 | #import "RootViewController.h" 11 | 12 | 13 | @implementation AudioSampleAppDelegate 14 | 15 | @synthesize window; 16 | @synthesize navigationController; 17 | 18 | 19 | #pragma mark - 20 | #pragma mark Application lifecycle 21 | 22 | - (void)applicationDidFinishLaunching:(UIApplication *)application { 23 | 24 | // Override point for customization after app launch 25 | 26 | [window addSubview:[navigationController view]]; 27 | [window makeKeyAndVisible]; 28 | } 29 | 30 | 31 | - (void)applicationWillTerminate:(UIApplication *)application { 32 | // Save data if appropriate 33 | } 34 | 35 | 36 | #pragma mark - 37 | #pragma mark Memory management 38 | 39 | - (void)dealloc { 40 | [navigationController release]; 41 | [window release]; 42 | [super dealloc]; 43 | } 44 | 45 | 46 | @end 47 | 48 | -------------------------------------------------------------------------------- /Classes/CMOpenALSound.h: -------------------------------------------------------------------------------- 1 | // 2 | // CMOpenALSound.h 3 | // 4 | // Created by Alex Restrepo on 5/19/09. 5 | // Copyright 2009 Colombiamug. All rights reserved. 6 | // 7 | // Portions of this code are adapted from Apple's oalTouch example and 8 | // http://www.gehacktes.net/2009/03/iphone-programming-part-6-multiple-sounds-with-openal/ 9 | // 10 | // This code is released under the creative commons attribution-share alike licence, meaning: 11 | // 12 | // Attribution - You must attribute the work in the manner specified by the author or licensor 13 | // (but not in any way that suggests that they endorse you or your use of the work). 14 | // In this case, simple credit somewhere in your app or documentation will suffice. 15 | // 16 | // Share Alike - If you alter, transform, or build upon this work, you may distribute the resulting 17 | // work only under the same, similar or a compatible license. 18 | // Simply put, if you improve upon it, share! 19 | // 20 | // http://creativecommons.org/licenses/by-sa/3.0/us/ 21 | 22 | #import 23 | #import 24 | #import 25 | #import 26 | 27 | @interface CMOpenALSound : NSObject 28 | { 29 | ALuint bufferID; 30 | ALuint sourceID; //base source ID 31 | ALdouble duration; //duration of the sound in seconds 32 | ALfloat volume; //volume [0 - 1] 33 | ALfloat pitch; //speed 34 | 35 | ALenum error; 36 | ALvoid *bufferData; //holds the actual sound data 37 | 38 | NSMutableArray *temporarySounds; //holds source IDs to temporary sounds (sounds played when the base source was busy) 39 | NSString *sourceFileName; 40 | } 41 | 42 | @property (nonatomic, readonly) ALenum error; 43 | @property (nonatomic, readonly) ALdouble duration; 44 | @property (nonatomic) ALfloat volume; 45 | @property (nonatomic) ALfloat pitch; 46 | @property (nonatomic, copy, readonly) NSString *sourceFileName; 47 | 48 | - (id) initWithSoundFile:(NSString *)file doesLoop:(BOOL)loops; 49 | 50 | - (BOOL) play; 51 | - (BOOL) stop; 52 | - (BOOL) pause; 53 | - (BOOL) rewind; 54 | - (BOOL) isPlaying; 55 | - (BOOL) isAnyPlaying; 56 | @end 57 | -------------------------------------------------------------------------------- /Classes/CMOpenALSound.m: -------------------------------------------------------------------------------- 1 | // 2 | // CMOpenALSound.m 3 | // 4 | // Created by Alex Restrepo on 5/19/09. 5 | // Copyright 2009 Colombiamug. All rights reserved. 6 | // 7 | // Portions of this code are adapted from Apple's oalTouch example and 8 | // http://www.gehacktes.net/2009/03/iphone-programming-part-6-multiple-sounds-with-openal/ 9 | // 10 | // This code is released under the creative commons attribution-share alike licence, meaning: 11 | // 12 | // Attribution - You must attribute the work in the manner specified by the author or licensor 13 | // (but not in any way that suggests that they endorse you or your use of the work). 14 | // In this case, simple credit somewhere in your app or documentation will suffice. 15 | // 16 | // Share Alike - If you alter, transform, or build upon this work, you may distribute the resulting 17 | // work only under the same, similar or a compatible license. 18 | // Simply put, if you improve upon it, share! 19 | // 20 | // http://creativecommons.org/licenses/by-sa/3.0/us/ 21 | 22 | #import "CMOpenALSound.h" 23 | #import "AppleOpenALSupport.h" 24 | #import "DebugOutput.h" 25 | 26 | @interface CMOpenALSound() 27 | @property (nonatomic, retain) NSMutableArray *temporarySounds; 28 | @property (nonatomic, copy) NSString *sourceFileName; 29 | -(BOOL) loadSoundFile:(NSString *)file doesLoop:(BOOL)loops; 30 | @end 31 | 32 | @implementation CMOpenALSound 33 | @synthesize error, temporarySounds, duration, sourceFileName; 34 | 35 | #pragma mark - 36 | #pragma mark init/dealloc 37 | //initialize with a sound file... 38 | - (id) initWithSoundFile:(NSString *)file doesLoop:(BOOL)loops 39 | { 40 | self = [super init]; 41 | if (self != nil) 42 | { 43 | if(![self loadSoundFile:file doesLoop:loops]) 44 | { 45 | debug(@"Failed to load the sound file: %@...", file); 46 | [self release]; 47 | return nil; 48 | } 49 | self.sourceFileName = file; 50 | 51 | //temporary sound queue 52 | self.temporarySounds = [NSMutableArray array]; 53 | 54 | //default volume/pitch 55 | self.volume = 1.0; 56 | self.pitch = 1.0; 57 | } 58 | return self; 59 | } 60 | 61 | - (void) dealloc 62 | { 63 | debug(@"Deallocing sound: sourceID:%u, bufferID:%u", sourceID, bufferID); 64 | 65 | //delete base source... 66 | alDeleteSources(1, &sourceID); 67 | 68 | //and all temporary sources... 69 | for(NSNumber *tmpSourceID in temporarySounds) 70 | { 71 | //tmpSourceID is the source ID for the temporary sound 72 | NSUInteger srcID = [tmpSourceID unsignedIntegerValue]; 73 | alDeleteSources(1, &srcID); 74 | } 75 | [temporarySounds release]; 76 | 77 | //now the buffer, since it wasn't copied to openAL 78 | alDeleteBuffers(1, &bufferID); 79 | 80 | if(bufferData) 81 | { 82 | free(bufferData); 83 | bufferData = NULL; 84 | } 85 | 86 | [sourceFileName release]; 87 | 88 | [super dealloc]; 89 | } 90 | 91 | #pragma mark - 92 | #pragma mark loading 93 | -(BOOL) loadSoundFile:(NSString *)fileName doesLoop:(BOOL)loops 94 | { 95 | ALenum format; 96 | ALsizei size; 97 | ALsizei freq; 98 | error = AL_NO_ERROR; 99 | alGetError(); //clear any previous error... 100 | 101 | //get the URL for the sound file... 102 | NSBundle *bundle = [NSBundle mainBundle]; 103 | NSString *path = [bundle pathForResource:[fileName stringByDeletingPathExtension] 104 | ofType:[fileName pathExtension]]; 105 | 106 | if(!path) return NO; 107 | 108 | CFURLRef fileURL = (CFURLRef)[[NSURL fileURLWithPath:path] retain]; 109 | 110 | if (!fileURL) 111 | { 112 | debug(@"file: %@ not found.", fileName); 113 | return NO; 114 | } 115 | 116 | // get audio data from file 117 | bufferData = MyGetOpenALAudioData(fileURL, &size, &format, &freq, &duration); 118 | CFRelease(fileURL); 119 | 120 | // grab a buffer ID from openAL 121 | alGenBuffers(1, &bufferID); 122 | 123 | // load the awaiting data blob into the openAL buffer. 124 | // http://developer.apple.com/iphone/library/technotes/tn2008/tn2199.html 125 | // Use the alBufferDataStatic API, found in the oalStaticBufferExtension.h header file, 126 | // instead of the standard alBufferData function. This eliminates extra buffer copies by allowing your application to own 127 | // the audio data memory used by the buffer objects. 128 | alBufferDataStaticProc(bufferID, format, bufferData, size, freq); 129 | 130 | // grab a source ID from openAL, this will be the base source ID 131 | alGenSources(1, &sourceID); 132 | 133 | // attach the buffer to the source 134 | alSourcei(sourceID, AL_BUFFER, bufferID); 135 | 136 | if (loops) 137 | alSourcei(sourceID, AL_LOOPING, AL_TRUE); 138 | 139 | 140 | if((error = alGetError()) != AL_NO_ERROR) 141 | { 142 | debug(@"error loading sound: %x\n", error); 143 | return NO; 144 | } 145 | 146 | return YES; 147 | } 148 | 149 | #pragma mark - 150 | #pragma mark playback 151 | - (void) deleteTemporarySource 152 | { 153 | //dequeue a sourceID from the temporary sound queue 154 | NSUInteger tmpSourceID = [[temporarySounds objectAtIndex:0] unsignedIntegerValue]; 155 | [temporarySounds removeObjectAtIndex:0]; 156 | 157 | debug(@"Deleting temporary source: sourceID: %u, [temporarySounds count]:%u", tmpSourceID, [temporarySounds count]); 158 | //and delete the source to make it available again for another sound. 159 | alDeleteSources(1, &tmpSourceID); 160 | } 161 | 162 | - (BOOL) play 163 | { 164 | if([self isPlaying]) //see if the base source is busy... 165 | { 166 | //if so, create a new source 167 | NSUInteger tmpSourceID; 168 | alGenSources(1, &tmpSourceID); 169 | 170 | //attach the buffer to the source 171 | alSourcei(tmpSourceID, AL_BUFFER, bufferID); 172 | alSourcePlay(tmpSourceID); 173 | 174 | //add the sound id to the play queue so we can dispose of it later 175 | [temporarySounds addObject: [NSNumber numberWithUnsignedInteger:tmpSourceID]]; 176 | 177 | //a "callback" for when the sound is done playing +0.1 secs 178 | [self performSelector:@selector(deleteTemporarySource) 179 | withObject:nil 180 | afterDelay:(duration * pitch) + 0.1]; 181 | 182 | return ((error = alGetError()) != AL_NO_ERROR); 183 | } 184 | 185 | //if the base source isn't busy, just use that one... 186 | alSourcePlay(sourceID); 187 | return ((error = alGetError()) != AL_NO_ERROR); 188 | } 189 | 190 | - (BOOL) stop 191 | { 192 | alSourceStop(sourceID); 193 | return ((error = alGetError()) != AL_NO_ERROR); 194 | } 195 | 196 | - (BOOL) pause 197 | { 198 | alSourcePause(sourceID); 199 | return ((error = alGetError()) != AL_NO_ERROR); 200 | } 201 | 202 | - (BOOL) rewind 203 | { 204 | alSourceRewind(sourceID); 205 | return ((error = alGetError()) != AL_NO_ERROR); 206 | } 207 | 208 | // returns whether the BASE source is playing or not 209 | - (BOOL) isPlaying 210 | { 211 | ALenum state; 212 | alGetSourcei(sourceID, AL_SOURCE_STATE, &state); 213 | 214 | return (state == AL_PLAYING); 215 | } 216 | 217 | // returns YES if the base or any temporary sounds are playing... 218 | - (BOOL) isAnyPlaying 219 | { 220 | return [self isPlaying] || [temporarySounds count] > 0; 221 | } 222 | 223 | #pragma mark - 224 | #pragma mark properties 225 | - (ALfloat) volume 226 | { 227 | return volume; 228 | } 229 | 230 | - (void) setVolume:(ALfloat)newVolume 231 | { 232 | volume = MAX(MIN(newVolume, 1.0f), 0.0f); //cap to 0-1 233 | alSourcef(sourceID, AL_GAIN, volume); 234 | 235 | //now set the volume for any temporary sounds... 236 | 237 | for(NSNumber *tmpSourceID in temporarySounds) 238 | { 239 | //tmpSourceID is the source ID for the temporary sound 240 | alSourcef([tmpSourceID unsignedIntegerValue], AL_GAIN, volume); 241 | } 242 | } 243 | 244 | - (ALfloat) pitch 245 | { 246 | return pitch; 247 | } 248 | 249 | - (void) setPitch:(ALfloat)newPitch 250 | { 251 | pitch = newPitch; 252 | 253 | alSourcef(sourceID, AL_PITCH, pitch); 254 | 255 | for(NSNumber *tmpSourceID in temporarySounds) 256 | { 257 | //tmpSourceID is the source ID for the temporary sound 258 | alSourcef([tmpSourceID unsignedIntegerValue], AL_PITCH, pitch); 259 | } 260 | } 261 | @end 262 | -------------------------------------------------------------------------------- /Classes/CMOpenALSoundManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // CMOpenALSoundManager.h 3 | // 4 | // Created by Alex Restrepo on 5/19/09. 5 | // Copyright 2009 Colombiamug. All rights reserved. 6 | // 7 | // Portions of this code are adapted from Apple's oalTouch example and 8 | // http://www.gehacktes.net/2009/03/iphone-programming-part-6-multiple-sounds-with-openal/ 9 | // 10 | // This code is released under the creative commons attribution-share alike licence, meaning: 11 | // 12 | // Attribution - You must attribute the work in the manner specified by the author or licensor 13 | // (but not in any way that suggests that they endorse you or your use of the work). 14 | // In this case, simple credit somewhere in your app or documentation will suffice. 15 | // 16 | // Share Alike - If you alter, transform, or build upon this work, you may distribute the resulting 17 | // work only under the same, similar or a compatible license. 18 | // Simply put, if you improve upon it, share! 19 | // 20 | // http://creativecommons.org/licenses/by-sa/3.0/us/ 21 | 22 | #import 23 | #import 24 | #import 25 | #import 26 | #import 27 | 28 | #define USE_AS_SINGLETON 0 //Set this to 0 if you want to use this class as a regular class instead of as a singleton. 29 | 30 | @class CMOpenALSound; 31 | 32 | @interface CMOpenALSoundManager : NSObject 33 | { 34 | AVAudioPlayer *backgroundAudio; // background music 35 | 36 | NSMutableDictionary *soundDictionary; // stores our soundkeys 37 | NSArray *soundFileNames; // array that holds the filenames for the sounds, they will be referenced by index 38 | 39 | BOOL isiPodAudioPlaying; // ipod playing music? 40 | 41 | float backgroundMusicVolume; 42 | float soundEffectsVolume; 43 | 44 | BOOL interrupted; 45 | NSString *currentBackgroundAudioFile; 46 | } 47 | 48 | @property (nonatomic, retain) NSArray *soundFileNames; 49 | @property (nonatomic, readonly) BOOL isiPodAudioPlaying; 50 | @property (nonatomic) float backgroundMusicVolume; 51 | @property (nonatomic) float soundEffectsVolume; 52 | 53 | #if USE_AS_SINGLETON 54 | + (CMOpenALSoundManager *) sharedCMOpenALSoundManager; 55 | #endif 56 | 57 | - (void) purgeSounds; // purges all sounds from memory, in case of a memory warning... 58 | - (void) beginInterruption; // handle os sound interruptions 59 | - (void) endInterruption; 60 | 61 | - (void) playBackgroundMusic:(NSString *)file; //file is the filename to play (from your main bundle) 62 | - (void) playBackgroundMusic:(NSString *)file forcePlay:(BOOL)forcePlay; //if forcePlay is YES, iPod audio will be stopped. 63 | - (void) stopBackgroundMusic; 64 | - (void) pauseBackgroundMusic; 65 | - (void) resumeBackgroundMusic; 66 | 67 | - (void) playSoundWithID:(NSUInteger)soundID; //id is the index in the sound filename array 68 | - (void) stopSoundWithID:(NSUInteger)soundID; 69 | - (void) pauseSoundWithID:(NSUInteger)soundID; 70 | - (void) rewindSoundWithID:(NSUInteger)soundID; 71 | 72 | - (BOOL) isPlayingSoundWithID:(NSUInteger)soundID; 73 | - (BOOL) isBackGroundMusicPlaying; 74 | @end 75 | -------------------------------------------------------------------------------- /Classes/CMOpenALSoundManager.m: -------------------------------------------------------------------------------- 1 | // 2 | // CMOpenALSoundManager.m 3 | // 4 | // Created by Alex Restrepo on 5/19/09. 5 | // Copyright 2009 Colombiamug. All rights reserved. 6 | // 7 | // Portions of this code are adapted from Apple's oalTouch example and 8 | // http://www.gehacktes.net/2009/03/iphone-programming-part-6-multiple-sounds-with-openal/ 9 | // 10 | // This code is released under the creative commons attribution-share alike licence, meaning: 11 | // 12 | // Attribution - You must attribute the work in the manner specified by the author or licensor 13 | // (but not in any way that suggests that they endorse you or your use of the work). 14 | // In this case, simple credit somewhere in your app or documentation will suffice. 15 | // 16 | // Share Alike - If you alter, transform, or build upon this work, you may distribute the resulting 17 | // work only under the same, similar or a compatible license. 18 | // Simply put, if you improve upon it, share! 19 | // 20 | // http://creativecommons.org/licenses/by-sa/3.0/us/ 21 | 22 | #import "CMOpenALSoundManager.h" 23 | #import "CMOpenALSound.h" 24 | #import "SynthesizeSingleton.h" 25 | #import "DebugOutput.h" 26 | 27 | @interface CMOpenALSoundManager() 28 | @property (nonatomic, retain) NSMutableDictionary *soundDictionary; 29 | @property (nonatomic, retain) AVAudioPlayer *backgroundAudio; 30 | @property (nonatomic) BOOL interrupted; 31 | @property (nonatomic) BOOL isiPodAudioPlaying; 32 | @property (nonatomic, copy) NSString *currentBackgroundAudioFile; 33 | @end 34 | 35 | @interface CMOpenALSoundManager(private) 36 | - (NSString *) keyForSoundID:(NSUInteger)soundID; 37 | - (void) setupAudioCategorySilenceIpod:(BOOL)silenceIpod; 38 | - (void) shutdownOpenAL; 39 | - (BOOL) startupOpenAL; 40 | @end 41 | 42 | //audio interruption callback... 43 | void interruptionListenerCallback (void *inUserData, UInt32 interruptionState) 44 | { 45 | CMOpenALSoundManager *soundMgr = (CMOpenALSoundManager *) inUserData; 46 | 47 | if (interruptionState == kAudioSessionBeginInterruption) 48 | { 49 | debug(@"Start audio interruption"); 50 | [soundMgr beginInterruption]; 51 | soundMgr.interrupted = YES; 52 | } 53 | else if ((interruptionState == kAudioSessionEndInterruption) && soundMgr.interrupted) 54 | { 55 | debug(@"Stop audio interruption"); 56 | [soundMgr endInterruption]; 57 | soundMgr.interrupted = NO; 58 | } 59 | } 60 | 61 | @implementation CMOpenALSoundManager 62 | @synthesize soundDictionary, soundFileNames, backgroundAudio, isiPodAudioPlaying, interrupted, currentBackgroundAudioFile; 63 | 64 | #if USE_AS_SINGLETON 65 | SYNTHESIZE_SINGLETON_FOR_CLASS(CMOpenALSoundManager); 66 | #endif 67 | 68 | #pragma mark - 69 | #pragma mark init/dealloc 70 | - (id) init 71 | { 72 | self = [super init]; 73 | if (self != nil) 74 | { 75 | //create audio session. 76 | OSStatus status = AudioSessionInitialize(NULL, NULL, interruptionListenerCallback, self); 77 | if (status != kAudioSessionNoError) 78 | { 79 | debug(@"AudioSessionInitialize failed! %d", status); 80 | } 81 | 82 | self.soundDictionary = [NSMutableDictionary dictionary]; 83 | self.soundEffectsVolume = 1.0; 84 | self.backgroundMusicVolume = 1.0; 85 | 86 | //isiPodAudioPlaying = YES; 87 | [self endInterruption]; 88 | } 89 | return self; 90 | } 91 | 92 | // start up openAL 93 | -(BOOL) startupOpenAL 94 | { 95 | ALCcontext *context = NULL; 96 | ALCdevice *device = NULL; 97 | 98 | // Initialization 99 | device = alcOpenDevice(NULL); // select the "preferred device" 100 | if(!device) return NO; 101 | 102 | // use the device to make a context 103 | context = alcCreateContext(device, NULL); 104 | if(!context) return NO; 105 | 106 | // set my context to the currently active one 107 | alcMakeContextCurrent(context); 108 | 109 | debug(@"oal inited ok"); 110 | return YES; 111 | } 112 | 113 | - (void) dealloc 114 | { 115 | debug(@"CMOpenALSoundManager dealloc"); 116 | 117 | [self shutdownOpenAL]; 118 | 119 | [backgroundAudio release]; 120 | [soundFileNames release]; 121 | [soundDictionary release]; 122 | [currentBackgroundAudioFile release]; 123 | 124 | [super dealloc]; 125 | } 126 | 127 | - (void) shutdownOpenAL 128 | { 129 | //self.backgroundAudio = nil; 130 | //self.soundFileNames = nil; 131 | //self.soundDictionary = nil; 132 | 133 | ALCcontext *context = NULL; 134 | ALCdevice *device = NULL; 135 | 136 | //Get active context (there can only be one) 137 | context = alcGetCurrentContext(); 138 | 139 | //Get device for active context 140 | device = alcGetContextsDevice(context); 141 | 142 | //Release context 143 | alcDestroyContext(context); 144 | 145 | //Close device 146 | alcCloseDevice(device); 147 | } 148 | 149 | #pragma mark - 150 | #pragma mark audio session mgmt 151 | 152 | - (void) beginInterruption 153 | { 154 | debug(@"begin interruption"); 155 | [self stopBackgroundMusic]; 156 | [self purgeSounds]; 157 | [self shutdownOpenAL]; 158 | 159 | if(!self.isiPodAudioPlaying) 160 | { 161 | UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; 162 | AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory); 163 | AudioSessionSetActive(YES); 164 | } 165 | else 166 | { 167 | UInt32 sessionCategory = kAudioSessionCategory_UserInterfaceSoundEffects; 168 | AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory); 169 | AudioSessionSetActive(YES); 170 | } 171 | 172 | AudioSessionSetActive(NO); 173 | } 174 | 175 | - (void) endInterruption 176 | { 177 | debug(@"end interruption"); 178 | [self setupAudioCategorySilenceIpod: NO]; 179 | [self startupOpenAL]; 180 | 181 | AudioSessionSetActive(YES); 182 | } 183 | 184 | - (void) setupAudioCategorySilenceIpod:(BOOL)silenceIpod; 185 | { 186 | UInt32 audioIsAlreadyPlaying; 187 | UInt32 propertySize = sizeof(audioIsAlreadyPlaying); 188 | 189 | 190 | //query audio hw to see if ipod is playing... 191 | OSStatus err = AudioSessionGetProperty(kAudioSessionProperty_OtherAudioIsPlaying, &propertySize, &audioIsAlreadyPlaying); 192 | if(err) 193 | debug(@"AudioSessionGetProperty error:%i",err); 194 | 195 | debug(@"kAudioSessionProperty_OtherAudioIsPlaying = %@", audioIsAlreadyPlaying ? @"YES" : @"NO"); 196 | 197 | if(audioIsAlreadyPlaying && !silenceIpod) 198 | { 199 | self.isiPodAudioPlaying = YES; 200 | 201 | //register session as ambient sound so our effects mix with ipod audio 202 | UInt32 sessionCategory = kAudioSessionCategory_AmbientSound; 203 | AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory); 204 | } 205 | else 206 | { 207 | self.isiPodAudioPlaying = NO; 208 | 209 | //register session as solo ambient sound so the ipod is silenced, and we can use hardware codecs for background audio 210 | UInt32 sessionCategory = kAudioSessionCategory_SoloAmbientSound; 211 | AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory); 212 | } 213 | } 214 | 215 | #pragma mark - 216 | #pragma mark cleanup 217 | - (void) purgeSounds 218 | { 219 | //call this if you get a memory warning, to unload all sounds from memory 220 | [self.soundDictionary removeAllObjects]; 221 | 222 | //if there's a background audio that's not playing, remove that too... 223 | if(![backgroundAudio isPlaying]) 224 | { 225 | self.backgroundAudio = nil; 226 | self.currentBackgroundAudioFile = nil; 227 | } 228 | } 229 | 230 | #pragma mark - 231 | #pragma mark background music playback 232 | // plays a file as the background audio... 233 | - (void) playBackgroundMusic:(NSString *)file 234 | { 235 | [self playBackgroundMusic:file forcePlay:NO]; 236 | } 237 | 238 | - (void) playBackgroundMusic:(NSString *)file forcePlay:(BOOL)forcePlay 239 | { 240 | if(forcePlay) //if we want to kill other audio sources, like the iPod... 241 | { 242 | [backgroundAudio stop]; //if there's audio already playing... 243 | [self setupAudioCategorySilenceIpod:YES]; 244 | } 245 | 246 | if(isiPodAudioPlaying) //if other background audio is playing bail out... 247 | { 248 | debug(@"Sry, ipod is playing... can't play file %@",file); 249 | return; 250 | } 251 | 252 | if(self.backgroundAudio && [self.currentBackgroundAudioFile isEqualToString:file]) 253 | { 254 | [self.backgroundAudio play]; 255 | return; //already playing 256 | } 257 | 258 | NSString *soundFilePath = [[NSBundle mainBundle] pathForResource: [file stringByDeletingPathExtension] 259 | ofType: [file pathExtension]]; 260 | 261 | NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath]; 262 | 263 | NSError *error = nil; 264 | AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL 265 | error:&error]; 266 | 267 | [fileURL release]; 268 | 269 | if(error) 270 | { 271 | //TODO:chequear por errores 272 | debug(@"***** ERROR creando backgroundMusicPlayer file:%@", file); 273 | [player release]; 274 | return; 275 | } 276 | 277 | self.currentBackgroundAudioFile = file; 278 | [player setNumberOfLoops:-1]; //loop forever 279 | player.volume = backgroundMusicVolume; 280 | [player play]; 281 | 282 | self.backgroundAudio = player; 283 | [player release]; 284 | } 285 | 286 | - (void) stopBackgroundMusic 287 | { 288 | [backgroundAudio stop]; 289 | } 290 | 291 | - (void) pauseBackgroundMusic 292 | { 293 | [backgroundAudio pause]; 294 | } 295 | 296 | - (void) resumeBackgroundMusic 297 | { 298 | [backgroundAudio play]; 299 | } 300 | 301 | #pragma mark - 302 | #pragma mark effects playback 303 | // grab the filename (key) from the filenames array 304 | - (NSString *) keyForSoundID:(NSUInteger)soundID 305 | { 306 | if(soundID < 0 || soundID >= [soundFileNames count]) 307 | return nil; 308 | 309 | return [[soundFileNames objectAtIndex:soundID] lastPathComponent]; 310 | } 311 | 312 | - (void) playSoundWithID:(NSUInteger)soundID 313 | { 314 | //get sound key 315 | NSString *soundFile = [self keyForSoundID:soundID]; 316 | if(!soundFile) return; 317 | 318 | CMOpenALSound *sound = [soundDictionary objectForKey:soundFile]; 319 | 320 | if(!sound) 321 | { 322 | //create a new sound 323 | sound = [[CMOpenALSound alloc] initWithSoundFile:soundFile doesLoop:NO]; //this will return nil on failure 324 | 325 | if(!sound) //error 326 | return; 327 | 328 | [soundDictionary setObject:sound forKey:soundFile]; 329 | [sound release]; 330 | } 331 | 332 | [sound play]; 333 | sound.volume = self.soundEffectsVolume; 334 | } 335 | 336 | - (void) stopSoundWithID:(NSUInteger)soundID 337 | { 338 | NSString *soundFile = [self keyForSoundID:soundID]; 339 | if(!soundFile) return; 340 | 341 | CMOpenALSound *sound = [soundDictionary objectForKey:soundFile]; 342 | [sound stop]; 343 | } 344 | 345 | - (void) pauseSoundWithID:(NSUInteger)soundID 346 | { 347 | NSString *soundFile = [self keyForSoundID:soundID]; 348 | if(!soundFile) return; 349 | 350 | CMOpenALSound *sound = [soundDictionary objectForKey:soundFile]; 351 | [sound stop]; 352 | } 353 | 354 | - (void) rewindSoundWithID:(NSUInteger)soundID 355 | { 356 | NSString *soundFile = [self keyForSoundID:soundID]; 357 | if(!soundFile) return; 358 | 359 | CMOpenALSound *sound = [soundDictionary objectForKey:soundFile]; 360 | [sound rewind]; 361 | } 362 | 363 | - (BOOL) isPlayingSoundWithID:(NSUInteger)soundID 364 | { 365 | NSString *soundFile = [self keyForSoundID:soundID]; 366 | if(!soundFile) return NO; 367 | 368 | CMOpenALSound *sound = [soundDictionary objectForKey:soundFile]; 369 | return [sound isAnyPlaying]; 370 | } 371 | 372 | - (BOOL) isBackGroundMusicPlaying 373 | { 374 | return [backgroundAudio isPlaying]; 375 | } 376 | 377 | #pragma mark - 378 | #pragma mark properties 379 | - (float) backgroundMusicVolume 380 | { 381 | return backgroundMusicVolume; 382 | } 383 | 384 | - (void) setBackgroundMusicVolume:(float) newVolume 385 | { 386 | backgroundMusicVolume = newVolume; 387 | backgroundAudio.volume = newVolume; 388 | } 389 | 390 | - (float) soundEffectsVolume 391 | { 392 | return soundEffectsVolume; 393 | } 394 | 395 | - (void) setSoundEffectsVolume:(float) newVolume 396 | { 397 | soundEffectsVolume = newVolume; 398 | for(NSString *key in soundDictionary) 399 | { 400 | ((CMOpenALSound *)[soundDictionary objectForKey:key]).volume = newVolume; 401 | } 402 | } 403 | @end 404 | -------------------------------------------------------------------------------- /Classes/DebugOutput.h: -------------------------------------------------------------------------------- 1 | /************************************************************************ 2 | * DebugOutput.h 3 | * 4 | * Definitions for DebugOutput class 5 | * John Muchow 6 | * http://iphonedevelopertips.com/cocoa/filename-and-line-number-with-nslog-part-ii.html 7 | ************************************************************************/ 8 | 9 | // Show full path of filename? 10 | #define DEBUG_SHOW_FULLPATH NO 11 | 12 | // Enable debug (NSLog) wrapper code? 13 | #define DEBUG 1 14 | 15 | //Use NSLog or CFShow 16 | #define USE_NSLOG 0 17 | 18 | #if DEBUG 19 | #define debug(format,...) [[DebugOutput sharedDebug] output:__FILE__ lineNumber:__LINE__ input:(format), ##__VA_ARGS__] 20 | #else 21 | #define debug(format,...) 22 | #endif 23 | 24 | @interface DebugOutput : NSObject 25 | { 26 | } 27 | + (DebugOutput *) sharedDebug; 28 | -(void)output:(char*)fileName lineNumber:(int)lineNumber input:(NSString*)input, ...; 29 | @end 30 | -------------------------------------------------------------------------------- /Classes/DebugOutput.m: -------------------------------------------------------------------------------- 1 | /************************************************************************ 2 | * DebugOutput.m 3 | * 4 | * Singleton class for wrapping NSLog messages, adding functionality 5 | * for displaying filename and line numbers. Also includes configuration 6 | * options to "turn off" all debug (NSLog) messages 7 | ************************************************************************/ 8 | #import "DebugOutput.h" 9 | 10 | @implementation DebugOutput 11 | 12 | static DebugOutput *sharedDebugInstance = nil; 13 | 14 | /*---------------------------------------------------------------------*/ 15 | + (DebugOutput *) sharedDebug 16 | { 17 | @synchronized(self) 18 | { 19 | if (sharedDebugInstance == nil) 20 | { 21 | [[self alloc] init]; 22 | } 23 | } 24 | return sharedDebugInstance; 25 | } 26 | 27 | /*---------------------------------------------------------------------*/ 28 | + (id) allocWithZone:(NSZone *) zone 29 | { 30 | @synchronized(self) 31 | { 32 | if (sharedDebugInstance == nil) 33 | { 34 | sharedDebugInstance = [super allocWithZone:zone]; 35 | return sharedDebugInstance; 36 | } 37 | } 38 | return nil; 39 | } 40 | 41 | /*---------------------------------------------------------------------*/ 42 | - (id)copyWithZone:(NSZone *)zone 43 | { 44 | return self; 45 | } 46 | 47 | /*---------------------------------------------------------------------*/ 48 | - (id)retain 49 | { 50 | return self; 51 | } 52 | 53 | /*---------------------------------------------------------------------*/ 54 | - (oneway void)release 55 | { 56 | // No action required... 57 | } 58 | 59 | /*---------------------------------------------------------------------*/ 60 | - (unsigned)retainCount 61 | { 62 | return UINT_MAX; // An object that cannot be released 63 | } 64 | 65 | /*---------------------------------------------------------------------*/ 66 | - (id)autorelease 67 | { 68 | return self; 69 | } 70 | 71 | /*---------------------------------------------------------------------*/ 72 | -(void)output:(char*)fileName lineNumber:(int)lineNumber input:(NSString*)input, ... 73 | { 74 | va_list argList; 75 | NSString *filePath, *formatStr; 76 | 77 | // Build the path string 78 | filePath = [[NSString alloc] initWithBytes:fileName length:strlen(fileName) encoding:NSUTF8StringEncoding]; 79 | 80 | // Process arguments, resulting in a format string 81 | va_start(argList, input); 82 | formatStr = [[NSString alloc] initWithFormat:input arguments:argList]; 83 | va_end(argList); 84 | 85 | 86 | // Call NSLog, prepending the filename and line number 87 | #if USE_NSLOG 88 | NSLog(@"%s[%d]: %@",[((DEBUG_SHOW_FULLPATH) ? filePath : [filePath lastPathComponent]) UTF8String], lineNumber, formatStr); 89 | #else 90 | CFShow([NSString stringWithFormat: @"%s[%d]: %@",[((DEBUG_SHOW_FULLPATH) ? filePath : [filePath lastPathComponent]) UTF8String], lineNumber, formatStr]); 91 | #endif 92 | 93 | [filePath release]; 94 | [formatStr release]; 95 | } 96 | 97 | @end -------------------------------------------------------------------------------- /Classes/RootViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // RootViewController.h 3 | // AudioSample 4 | // 5 | // Created by Alex Restrepo on 9/14/09. 6 | // Copyright Brainchild 2009. All rights reserved. 7 | // 8 | 9 | @class CMOpenALSoundManager; 10 | @interface RootViewController : UITableViewController { 11 | CMOpenALSoundManager *soundMgr; 12 | } 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /Classes/RootViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // RootViewController.m 3 | // AudioSample 4 | // 5 | // Created by Alex Restrepo on 9/14/09. 6 | // Copyright Brainchild 2009. All rights reserved. 7 | // 8 | // This code is released under the creative commons attribution-share alike licence, meaning: 9 | // 10 | // Attribution - You must attribute the work in the manner specified by the author or licensor 11 | // (but not in any way that suggests that they endorse you or your use of the work). 12 | // In this case, simple credit somewhere in your app or documentation will suffice. 13 | // 14 | // Share Alike - If you alter, transform, or build upon this work, you may distribute the resulting 15 | // work only under the same, similar or a compatible license. 16 | // Simply put, if you improve upon it, share! 17 | // 18 | // http://creativecommons.org/licenses/by-sa/3.0/us/ 19 | 20 | #import "RootViewController.h" 21 | #import "CMOpenALSoundManager.h" 22 | 23 | enum mySoundIds { 24 | AUDIOEFFECT 25 | }; 26 | 27 | @interface RootViewController() 28 | @property (nonatomic, retain) CMOpenALSoundManager *soundMgr; 29 | @end 30 | 31 | @implementation RootViewController 32 | @synthesize soundMgr; 33 | 34 | - (void)viewDidLoad { 35 | [super viewDidLoad]; 36 | 37 | self.title = @"Audio Sample"; 38 | 39 | //start the audio manager... 40 | self.soundMgr = [[[CMOpenALSoundManager alloc] init] autorelease]; 41 | soundMgr.soundFileNames = [NSArray arrayWithObject:@"Start.caf"]; 42 | } 43 | 44 | 45 | - (void)viewWillAppear:(BOOL)animated { 46 | [super viewWillAppear:animated]; 47 | 48 | // start background music 49 | [soundMgr playBackgroundMusic:@"backgroundLoop.m4a"]; // you could use forcePlay: YES if you wanted to stop any other audio source (iPod) 50 | } 51 | 52 | 53 | #pragma mark Table view methods 54 | 55 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 56 | return 4; 57 | } 58 | 59 | // Customize the number of rows in the table view. 60 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 61 | return 1; 62 | } 63 | 64 | - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 65 | { 66 | if(section == 0) 67 | return @"Background Audio Volume"; 68 | else if(section == 1) 69 | return @"Effects volume"; 70 | 71 | else return nil; 72 | } 73 | 74 | // Customize the appearance of table view cells. 75 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 76 | 77 | static NSString *CellIdentifier = @"Cell"; 78 | 79 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 80 | if (cell == nil) { 81 | cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 82 | 83 | // create a slider for the first 2 sections only 84 | if(indexPath.section < 2) 85 | { 86 | UISlider *slider; 87 | slider = [[UISlider alloc] initWithFrame:CGRectMake(5.0, 0.0, cell.bounds.size.width - cell.indentationWidth * 2.0, cell.bounds.size.height)]; 88 | slider.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 89 | slider.minimumValueImage = [UIImage imageNamed:@"volumedown.png"]; 90 | slider.maximumValueImage = [UIImage imageNamed:@"volumeup.png"]; 91 | 92 | slider.maximumValue = 1.0; 93 | slider.minimumValue = 0.0; 94 | slider.value = 1.0; // in a real app you should read this value from the user defaults 95 | 96 | if(indexPath.section == 0) 97 | { 98 | [slider addTarget:self action:@selector(musicVolume:) forControlEvents:UIControlEventValueChanged]; 99 | slider.enabled = !soundMgr.isiPodAudioPlaying; // disable the slider if the ipod is playing... 100 | } 101 | else 102 | [slider addTarget:self action:@selector(effectsVolume:) forControlEvents:UIControlEventValueChanged]; 103 | 104 | 105 | [cell.contentView addSubview:slider]; 106 | [slider release]; 107 | } 108 | } 109 | 110 | // Configure the cell. 111 | if(indexPath.section == 2) 112 | { 113 | cell.textLabel.text = @"Play sound effect"; 114 | cell.textLabel.textAlignment = UITextAlignmentCenter; 115 | } 116 | else if(indexPath.section == 3) 117 | { 118 | cell.textLabel.text = @"Play/Pause background music"; 119 | cell.textLabel.textAlignment = UITextAlignmentCenter; 120 | } 121 | 122 | return cell; 123 | } 124 | 125 | - (void) musicVolume:(id)sender 126 | { 127 | soundMgr.backgroundMusicVolume = ((UISlider *)sender).value; 128 | } 129 | 130 | - (void) effectsVolume:(id)sender 131 | { 132 | soundMgr.soundEffectsVolume = ((UISlider *)sender).value; 133 | } 134 | 135 | 136 | // Override to support row selection in the table view. 137 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 138 | if(indexPath.section < 2) return; 139 | 140 | [tableView deselectRowAtIndexPath:indexPath animated:YES]; 141 | 142 | if (indexPath.section == 2) { 143 | // play our sound effect 144 | [soundMgr playSoundWithID:AUDIOEFFECT]; 145 | return; 146 | } 147 | 148 | if ([soundMgr isBackGroundMusicPlaying]) 149 | { 150 | [soundMgr pauseBackgroundMusic]; 151 | } 152 | else 153 | { 154 | [soundMgr resumeBackgroundMusic]; 155 | } 156 | 157 | } 158 | 159 | - (void)dealloc { 160 | [soundMgr release]; 161 | [super dealloc]; 162 | } 163 | 164 | 165 | @end 166 | 167 | -------------------------------------------------------------------------------- /Classes/SynthesizeSingleton.h: -------------------------------------------------------------------------------- 1 | // 2 | // SynthesizeSingleton.h 3 | // CocoaWithLove 4 | // 5 | // Created by Matt Gallagher on 20/10/08. 6 | // Copyright 2009 Matt Gallagher. All rights reserved. 7 | // http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html 8 | // 9 | // Permission is given to use this source code file without charge in any 10 | // project, commercial or otherwise, entirely at your risk, with the condition 11 | // that any redistribution (in part or whole) of source code must retain 12 | // this copyright and permission notice. Attribution in compiled projects is 13 | // appreciated but not required. 14 | // 15 | 16 | #define SYNTHESIZE_SINGLETON_FOR_CLASS(classname) \ 17 | \ 18 | static classname *shared##classname = nil; \ 19 | \ 20 | + (classname *)shared##classname \ 21 | { \ 22 | @synchronized(self) \ 23 | { \ 24 | if (shared##classname == nil) \ 25 | { \ 26 | shared##classname = [[self alloc] init]; \ 27 | } \ 28 | } \ 29 | \ 30 | return shared##classname; \ 31 | } \ 32 | \ 33 | + (id)allocWithZone:(NSZone *)zone \ 34 | { \ 35 | @synchronized(self) \ 36 | { \ 37 | if (shared##classname == nil) \ 38 | { \ 39 | shared##classname = [super allocWithZone:zone]; \ 40 | return shared##classname; \ 41 | } \ 42 | } \ 43 | \ 44 | return nil; \ 45 | } \ 46 | \ 47 | - (id)copyWithZone:(NSZone *)zone \ 48 | { \ 49 | return self; \ 50 | } \ 51 | \ 52 | - (id)retain \ 53 | { \ 54 | return self; \ 55 | } \ 56 | \ 57 | - (NSUInteger)retainCount \ 58 | { \ 59 | return NSUIntegerMax; \ 60 | } \ 61 | \ 62 | - (void)release \ 63 | { \ 64 | } \ 65 | \ 66 | - (id)autorelease \ 67 | { \ 68 | return self; \ 69 | } 70 | -------------------------------------------------------------------------------- /License: -------------------------------------------------------------------------------- 1 | `License` 2 | Copyright (c) 2012, Alex Restrepo - KZLabs 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | 8 | 1. Redistributions of source code must retain the above copyright notice, this 9 | list of conditions and the following disclaimer. 10 | 2. Redistributions in binary form must reproduce the above copyright notice, 11 | this list of conditions and the following disclaimer in the documentation 12 | and/or other materials provided with the distribution. 13 | 14 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 15 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 16 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 17 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 18 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 19 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 20 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 21 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 23 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 | -------------------------------------------------------------------------------- /MainWindow.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 784 5 | 10A394 6 | 732 7 | 1027.1 8 | 430.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 60 12 | 13 | 14 | YES 15 | 16 | 17 | 18 | YES 19 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 20 | 21 | 22 | YES 23 | 24 | YES 25 | 26 | 27 | YES 28 | 29 | 30 | 31 | YES 32 | 33 | IBFilesOwner 34 | 35 | 36 | IBFirstResponder 37 | 38 | 39 | 40 | 41 | 1316 42 | 43 | {320, 480} 44 | 45 | 1 46 | MSAxIDEAA 47 | 48 | NO 49 | NO 50 | 51 | 52 | 53 | 54 | 55 | 56 | 256 57 | {0, 0} 58 | NO 59 | YES 60 | YES 61 | 62 | 63 | YES 64 | 65 | 66 | 67 | 68 | 69 | RootViewController 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | YES 78 | 79 | 80 | delegate 81 | 82 | 83 | 84 | 4 85 | 86 | 87 | 88 | window 89 | 90 | 91 | 92 | 5 93 | 94 | 95 | 96 | navigationController 97 | 98 | 99 | 100 | 15 101 | 102 | 103 | 104 | 105 | YES 106 | 107 | 0 108 | 109 | 110 | 111 | 112 | 113 | 2 114 | 115 | 116 | YES 117 | 118 | 119 | 120 | 121 | -1 122 | 123 | 124 | File's Owner 125 | 126 | 127 | 3 128 | 129 | 130 | 131 | 132 | -2 133 | 134 | 135 | 136 | 137 | 9 138 | 139 | 140 | YES 141 | 142 | 143 | 144 | 145 | 146 | 147 | 11 148 | 149 | 150 | 151 | 152 | 13 153 | 154 | 155 | YES 156 | 157 | 158 | 159 | 160 | 161 | 14 162 | 163 | 164 | 165 | 166 | 167 | 168 | YES 169 | 170 | YES 171 | -1.CustomClassName 172 | -2.CustomClassName 173 | 11.IBPluginDependency 174 | 13.CustomClassName 175 | 13.IBPluginDependency 176 | 2.IBAttributePlaceholdersKey 177 | 2.IBEditorWindowLastContentRect 178 | 2.IBPluginDependency 179 | 3.CustomClassName 180 | 3.IBPluginDependency 181 | 9.IBEditorWindowLastContentRect 182 | 9.IBPluginDependency 183 | 184 | 185 | YES 186 | UIApplication 187 | UIResponder 188 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 189 | RootViewController 190 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 191 | 192 | YES 193 | 194 | 195 | YES 196 | 197 | 198 | {{673, 376}, {320, 480}} 199 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 200 | AudioSampleAppDelegate 201 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 202 | {{500, 343}, {320, 480}} 203 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 204 | 205 | 206 | 207 | YES 208 | 209 | 210 | YES 211 | 212 | 213 | 214 | 215 | YES 216 | 217 | 218 | YES 219 | 220 | 221 | 222 | 15 223 | 224 | 225 | 226 | YES 227 | 228 | RootViewController 229 | UITableViewController 230 | 231 | IBProjectSource 232 | Classes/RootViewController.h 233 | 234 | 235 | 236 | AudioSampleAppDelegate 237 | NSObject 238 | 239 | YES 240 | 241 | YES 242 | navigationController 243 | window 244 | 245 | 246 | YES 247 | UINavigationController 248 | UIWindow 249 | 250 | 251 | 252 | IBProjectSource 253 | Classes/AudioSampleAppDelegate.h 254 | 255 | 256 | 257 | 258 | 0 259 | 260 | com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 261 | 262 | 263 | YES 264 | AudioSample.xcodeproj 265 | 3 266 | 3.1 267 | 268 | 269 | -------------------------------------------------------------------------------- /Readme.markdown: -------------------------------------------------------------------------------- 1 | # Sound Engine 2 | ## An OpenAL based sound engine that allows you to play one background audio track, and multiple simultaneous sound effects. 3 | 4 | This sound engine was born out of a simple OpenAL tutorial, available [here](http://www.gehacktes.net/2009/03/iphone-programming-part-6-multiple-sounds-with-openal/). 5 | Since then it has been featured online in a couple of [different](http://www.raywenderlich.com/259/audio-101-for-iphone-developers-playing-audio-programmatically) [sites](http://www.musicalgeometry.com/?p=912). There's also an ARC conversion available [here](https://github.com/kernelpanick/SoundEngine). 6 | 7 | Current Version: 1.1 8 | 9 | Version History: 10 | 1.0 Initial Release 11 | 1.1 Fixed a bug with changing the pitch of multiple simultaneous sounds. 11/9/09 12 | 13 | ![](https://raw.github.com/alexrestrepo/SoundEngine/master/screen.png) 14 | 15 | `License` 16 | Copyright (c) 2012, Alex Restrepo - KZLabs 17 | All rights reserved. 18 | 19 | Redistribution and use in source and binary forms, with or without 20 | modification, are permitted provided that the following conditions are met: 21 | 22 | 1. Redistributions of source code must retain the above copyright notice, this 23 | list of conditions and the following disclaimer. 24 | 2. Redistributions in binary form must reproduce the above copyright notice, 25 | this list of conditions and the following disclaimer in the documentation 26 | and/or other materials provided with the distribution. 27 | 28 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 29 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 30 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 31 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 32 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 33 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 34 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 35 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 36 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 37 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /RootViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 784 5 | 9L30 6 | 680 7 | 949.54 8 | 353.00 9 | 10 | YES 11 | 12 | 13 | 14 | YES 15 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 16 | 17 | 18 | YES 19 | 20 | YES 21 | 22 | 23 | YES 24 | 25 | 26 | 27 | YES 28 | 29 | IBFilesOwner 30 | 31 | 32 | IBFirstResponder 33 | 34 | 35 | 36 | 274 37 | {320, 247} 38 | 39 | NO 40 | YES 41 | NO 42 | NO 43 | 1 44 | 1 45 | 0 46 | YES 47 | 4.400000e+01 48 | 1.000000e+01 49 | 1.000000e+01 50 | 51 | 52 | 53 | 54 | YES 55 | 56 | 57 | view 58 | 59 | 60 | 61 | 3 62 | 63 | 64 | 65 | dataSource 66 | 67 | 68 | 69 | 4 70 | 71 | 72 | 73 | delegate 74 | 75 | 76 | 77 | 5 78 | 79 | 80 | 81 | 82 | YES 83 | 84 | 0 85 | 86 | YES 87 | 88 | 89 | 90 | 91 | 92 | -1 93 | 94 | 95 | RmlsZSdzIE93bmVyA 96 | 97 | 98 | -2 99 | 100 | 101 | 102 | 103 | 2 104 | 105 | 106 | 107 | 108 | 109 | 110 | YES 111 | 112 | YES 113 | -1.CustomClassName 114 | -2.CustomClassName 115 | 2.IBEditorWindowLastContentRect 116 | 2.IBPluginDependency 117 | 118 | 119 | YES 120 | RootViewController 121 | UIResponder 122 | {{0, 598}, {320, 247}} 123 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 124 | 125 | 126 | 127 | YES 128 | 129 | YES 130 | 131 | 132 | YES 133 | 134 | 135 | 136 | 137 | YES 138 | 139 | YES 140 | 141 | 142 | YES 143 | 144 | 145 | 146 | 5 147 | 148 | 149 | 150 | YES 151 | 152 | RootViewController 153 | UITableViewController 154 | 155 | IBProjectSource 156 | Classes/RootViewController.h 157 | 158 | 159 | 160 | 161 | 0 162 | AudioSample.xcodeproj 163 | 3 164 | 3.1 165 | 166 | 167 | -------------------------------------------------------------------------------- /Start.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexrestrepo/SoundEngine/95539cb9e38afdbbe0a6c8020c25d34395586d20/Start.caf -------------------------------------------------------------------------------- /backgroundLoop.m4a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexrestrepo/SoundEngine/95539cb9e38afdbbe0a6c8020c25d34395586d20/backgroundLoop.m4a -------------------------------------------------------------------------------- /engine.caf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexrestrepo/SoundEngine/95539cb9e38afdbbe0a6c8020c25d34395586d20/engine.caf -------------------------------------------------------------------------------- /main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // AudioSample 4 | // 5 | // Created by Alex Restrepo on 9/14/09. 6 | // Copyright Brainchild 2009. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, char *argv[]) { 12 | 13 | NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 14 | int retVal = UIApplicationMain(argc, argv, nil, nil); 15 | [pool release]; 16 | return retVal; 17 | } 18 | -------------------------------------------------------------------------------- /screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexrestrepo/SoundEngine/95539cb9e38afdbbe0a6c8020c25d34395586d20/screen.png -------------------------------------------------------------------------------- /volumedown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexrestrepo/SoundEngine/95539cb9e38afdbbe0a6c8020c25d34395586d20/volumedown.png -------------------------------------------------------------------------------- /volumeup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexrestrepo/SoundEngine/95539cb9e38afdbbe0a6c8020c25d34395586d20/volumeup.png --------------------------------------------------------------------------------