Compare commits

...

32 Commits

Author SHA1 Message Date
Syed Haris Ali 34dc468f16 updated to 0.9.1 2015-07-05 21:49:56 -07:00
Syed Haris Ali 3bb1b914a2 tiny tweak 2015-07-05 21:46:24 -07:00
Syed Haris Ali 6d00378ab0 removed warning 2015-07-05 21:45:50 -07:00
Syed Haris Ali ac07210263 bug fixes, UI updates, and added inspectable attributes 2015-07-05 21:45:00 -07:00
Syed Haris Ali 5920e7a61e added inspectable attributes to gl plot 2015-07-05 21:04:52 -07:00
Syed Haris Ali 4ef91004ea updated podspec to 0.9.0 2015-07-05 20:42:04 -07:00
Syed Haris Ali 1c6213c9c6 Merge branch 'master' of https://github.com/syedhali/EZAudio 2015-07-05 20:09:06 -07:00
Syed Haris Ali 59bd612164 updated examples for OSX 2015-07-05 20:08:57 -07:00
Syed Haris Ali b89b2254f0 Merge pull request #178 from hakanw/audio_file_reached_end_delegate_method 2015-07-05 15:30:43 -07:00
Håkan Waara 086ce50a54 document new audioplayer delegate method and fix styling nit 2015-07-05 23:18:53 +02:00
Syed Haris Ali 6684a874aa added current device for OSX, updated OSX examples to new window style 2015-07-05 13:23:34 -07:00
Syed Haris Ali 0c7226b3b0 updated podspec and readme to 0.8.0 2015-07-04 13:07:57 -07:00
Syed Haris Ali 9516768b1c Merge pull request #182 from syedhali/recorder_rewriter
Rewrote EZRecorder
2015-07-04 12:56:37 -07:00
Syed Haris Ali cf9dafc961 updated recording OSX example 2015-07-04 12:54:46 -07:00
Syed Haris Ali a74b1cf612 made current time readonly 2015-07-04 11:38:47 -07:00
Syed Haris Ali 1e7975e6cc little bit more cleanup 2015-07-04 11:33:41 -07:00
Syed Haris Ali cdd1372e30 added a ton of documentation 2015-07-03 21:29:44 -07:00
Syed Haris Ali 9f9c352f43 cleaned up header 2015-07-03 20:48:06 -07:00
Syed Haris Ali 9aab703069 updated recording example 2015-07-03 20:46:33 -07:00
Syed Haris Ali 3706a21e83 updated recorder to have API similar to EZAudioFile 2015-07-03 20:46:15 -07:00
Syed Haris Ali effa122525 updated client format doc 2015-07-03 20:44:54 -07:00
Syed Haris Ali 825e22e135 added play state delegate methods to mic 2015-07-03 20:40:49 -07:00
Syed Haris Ali 33c9ca84a2 added new initializers and class initializers 2015-07-03 18:31:41 -07:00
Syed Haris Ali 1a74a7def5 updating recorder to use same kind of API as EZAudioFile 2015-07-03 17:14:24 -07:00
Syed Haris Ali dcaadd43ce updated README 2015-07-03 10:49:08 -07:00
Syed Haris Ali 03db74e842 bumped version to 0.7.2 2015-07-03 10:44:56 -07:00
Syed Haris Ali ec19d44d86 Merge pull request #181 from syedhali/bug_fixes
Bug fixes
2015-07-03 10:43:37 -07:00
Syed Haris Ali 1e23f95dc2 added proper graph disposal 2015-07-03 10:41:58 -07:00
Syed Haris Ali 4d0b40d730 fixed crash in EZMicrophone due to running setup twice 2015-07-03 10:37:00 -07:00
Syed Haris Ali 732cf79963 Updated with The Amazing Audio Engine stuff 2015-07-02 12:36:15 -07:00
Syed Haris Ali 7e84f8744f Fixed typo 2015-07-02 12:25:08 -07:00
Håkan Waara 4f31db3d0e implement delegate method to find out when an audio file reached end, and also which file. 2015-07-02 11:59:02 +02:00
59 changed files with 3948 additions and 1718 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
Pod::Spec.new do |s| Pod::Spec.new do |s|
s.name = "EZAudio" s.name = "EZAudio"
s.version = "0.7.1" s.version = "0.9.1"
s.summary = "A simple, intuitive audio framework for iOS and OSX useful for anyone doing audio processing and/or audio-based visualizations." s.summary = "A simple, intuitive audio framework for iOS and OSX useful for anyone doing audio processing and/or audio-based visualizations."
s.homepage = "https://github.com/syedhali/EZAudio" s.homepage = "https://github.com/syedhali/EZAudio"
s.screenshots = "https://s3-us-west-1.amazonaws.com/ezaudio-media/EZAudioSummary.png" s.screenshots = "https://s3-us-west-1.amazonaws.com/ezaudio-media/EZAudioSummary.png"
+16 -4
View File
@@ -25,22 +25,34 @@
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
//------------------------------------------------------------------------------
#pragma mark - Core Components #pragma mark - Core Components
//------------------------------------------------------------------------------
#import "EZAudioDevice.h"
#import "EZAudioFile.h" #import "EZAudioFile.h"
#import "EZAudioFloatData.h"
#import "EZMicrophone.h" #import "EZMicrophone.h"
#import "EZOutput.h" #import "EZOutput.h"
#import "EZRecorder.h" #import "EZRecorder.h"
#import "EZAudioUtilities.h"
#pragma mark - Extended Components
#import "EZAudioPlayer.h" #import "EZAudioPlayer.h"
//------------------------------------------------------------------------------
#pragma mark - Interface Components #pragma mark - Interface Components
//------------------------------------------------------------------------------
#import "EZPlot.h" #import "EZPlot.h"
#import "EZAudioDisplayLink.h"
#import "EZAudioPlot.h" #import "EZAudioPlot.h"
#import "EZAudioPlotGL.h" #import "EZAudioPlotGL.h"
//------------------------------------------------------------------------------
#pragma mark - Utility Components
//------------------------------------------------------------------------------
#import "EZAudioFloatConverter.h"
#import "EZAudioFloatData.h"
#import "EZAudioUtilities.h"
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
/** /**
+16 -14
View File
@@ -27,6 +27,22 @@
// @name Getting The Devices // @name Getting The Devices
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
/**
Provides the current EZAudioDevice that is being used to pull input.
@return An EZAudioDevice instance representing the currently selected input device.
*/
+ (EZAudioDevice *)currentInputDevice;
//------------------------------------------------------------------------------
/**
Provides the current EZAudioDevice that is being used to output audio.
@return An EZAudioDevice instance representing the currently selected ouotput device.
*/
+ (EZAudioDevice *)currentOutputDevice;
//------------------------------------------------------------------------------
/** /**
Enumerates all the available input devices and returns the result in an NSArray of EZAudioDevice instances. Enumerates all the available input devices and returns the result in an NSArray of EZAudioDevice instances.
@return An NSArray containing EZAudioDevice instances, one for each available input device. @return An NSArray containing EZAudioDevice instances, one for each available input device.
@@ -43,20 +59,6 @@
#if TARGET_OS_IPHONE #if TARGET_OS_IPHONE
/**
Provides the current EZAudioDevice that is being used to pull input.
- iOS only
@return An EZAudioDevice instance representing the currently selected input device.
*/
+ (EZAudioDevice *)currentInputDevice;
/**
Provides the current EZAudioDevice that is being used to output audio.
- iOS only
@return An EZAudioDevice instance representing the currently selected ouotput device.
*/
+ (EZAudioDevice *)currentOutputDevice;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
/** /**
+43 -5
View File
@@ -217,11 +217,11 @@
AudioObjectPropertyAddress address = [self addressForPropertySelector:kAudioHardwarePropertyDevices]; AudioObjectPropertyAddress address = [self addressForPropertySelector:kAudioHardwarePropertyDevices];
UInt32 devicesDataSize; UInt32 devicesDataSize;
[EZAudioUtilities checkResult:AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, [EZAudioUtilities checkResult:AudioObjectGetPropertyDataSize(kAudioObjectSystemObject,
&address, &address,
0, 0,
NULL, NULL,
&devicesDataSize) &devicesDataSize)
operation:"Failed to get data size"]; operation:"Failed to get data size"];
// enumerate devices // enumerate devices
NSInteger count = devicesDataSize / sizeof(AudioDeviceID); NSInteger count = devicesDataSize / sizeof(AudioDeviceID);
@@ -271,6 +271,44 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
+ (EZAudioDevice *)deviceWithPropertySelector:(AudioObjectPropertySelector)propertySelector
{
AudioDeviceID deviceID;
UInt32 propSize = sizeof(AudioDeviceID);
AudioObjectPropertyAddress address = [self addressForPropertySelector:propertySelector];
[EZAudioUtilities checkResult:AudioObjectGetPropertyData(kAudioObjectSystemObject,
&address,
0,
NULL,
&propSize,
&deviceID)
operation:"Failed to get device device on OSX"];
EZAudioDevice *device = [[EZAudioDevice alloc] init];
device.deviceID = deviceID;
device.manufacturer = [self manufacturerForDeviceID:deviceID];
device.name = [self namePropertyForDeviceID:deviceID];
device.UID = [self UIDPropertyForDeviceID:deviceID];
device.inputChannelCount = [self channelCountForScope:kAudioObjectPropertyScopeInput forDeviceID:deviceID];
device.outputChannelCount = [self channelCountForScope:kAudioObjectPropertyScopeOutput forDeviceID:deviceID];
return device;
}
//------------------------------------------------------------------------------
+ (EZAudioDevice *)currentInputDevice
{
return [self deviceWithPropertySelector:kAudioHardwarePropertyDefaultInputDevice];
}
//------------------------------------------------------------------------------
+ (EZAudioDevice *)currentOutputDevice
{
return [self deviceWithPropertySelector:kAudioHardwarePropertyDefaultOutputDevice];
}
//------------------------------------------------------------------------------
+ (NSArray *)inputDevices + (NSArray *)inputDevices
{ {
__block NSMutableArray *devices = [NSMutableArray array]; __block NSMutableArray *devices = [NSMutableArray array];
+15 -3
View File
@@ -65,12 +65,23 @@ typedef void (^EZAudioWaveformDataCompletionBlock)(float **waveformData, int len
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
/**
Occurs when the audio file's internal seek position has been updated by the EZAudioFile functions `readFrames:audioBufferList:bufferSize:eof:` or `audioFile:updatedPosition:`. As of 0.8.0 this is the preferred method of listening for position updates on the audio file since a user may want the pull the currentTime, formattedCurrentTime, or the frame index from the EZAudioFile instance provided.
@param audioFile The instance of the EZAudio in which the change occured.
*/
- (void)audioFileUpdatedPosition:(EZAudioFile *)audioFile;
//------------------------------------------------------------------------------
/** /**
Occurs when the audio file's internal seek position has been updated by the EZAudioFile functions `readFrames:audioBufferList:bufferSize:eof:` or `audioFile:updatedPosition:`. Occurs when the audio file's internal seek position has been updated by the EZAudioFile functions `readFrames:audioBufferList:bufferSize:eof:` or `audioFile:updatedPosition:`.
@param audioFile The instance of the EZAudio in which the change occured @param audioFile The instance of the EZAudio in which the change occured
@param framePosition The new frame index as a 64-bit signed integer @param framePosition The new frame index as a 64-bit signed integer
@deprecated This property is deprecated starting in version 0.8.0.
@note Please use `audioFileUpdatedPosition:` property instead.
*/ */
- (void)audioFile:(EZAudioFile *)audioFile updatedPosition:(SInt64)framePosition; - (void)audioFile:(EZAudioFile *)audioFile
updatedPosition:(SInt64)framePosition __attribute__((deprecated));
@end @end
@@ -85,6 +96,7 @@ typedef void (^EZAudioWaveformDataCompletionBlock)(float **waveformData, int len
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#pragma mark - Properties #pragma mark - Properties
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
/** /**
A EZAudioFileDelegate for the audio file that is used to return events such as new seek positions within the file and the read audio data as a float array. A EZAudioFileDelegate for the audio file that is used to return events such as new seek positions within the file and the read audio data as a float array.
*/ */
@@ -232,7 +244,7 @@ typedef void (^EZAudioWaveformDataCompletionBlock)(float **waveformData, int len
*/ */
/** /**
Provides the AudioStreamBasicDescription structure used within the app. The file's format will be converted to this format and then sent back as either a float array or a `AudioBufferList` pointer. For instance, the file on disk could be a 22.5 kHz, float format, but we might have an audio processing graph that has a 44.1 kHz, signed integer format that we'd like to interact with. The client format lets us set that 44.1 kHz format on the audio file to properly read samples from it with any interpolation or format conversion that must take place done automatically within the EZAudioFile `readFrames:audioBufferList:bufferSize:eof:` method. Default is stereo, non-interleaved, 44.1 kHz. Provides the common AudioStreamBasicDescription that will be used for in-app interaction. The file's format will be converted to this format and then sent back as either a float array or a `AudioBufferList` pointer. For instance, the file on disk could be a 22.5 kHz, float format, but we might have an audio processing graph that has a 44.1 kHz, signed integer format that we'd like to interact with. The client format lets us set that 44.1 kHz format on the audio file to properly read samples from it with any interpolation or format conversion that must take place done automatically within the EZAudioFile `readFrames:audioBufferList:bufferSize:eof:` method. Default is stereo, non-interleaved, 44.1 kHz.
@warning This must be a linear PCM format! @warning This must be a linear PCM format!
@return An AudioStreamBasicDescription structure describing the format of the audio file. @return An AudioStreamBasicDescription structure describing the format of the audio file.
*/ */
@@ -299,7 +311,7 @@ typedef void (^EZAudioWaveformDataCompletionBlock)(float **waveformData, int len
@note Please use `duration` property instead. @note Please use `duration` property instead.
@return The total duration of the audio file as a Float32. @return The total duration of the audio file as a Float32.
*/ */
@property (readonly) NSTimeInterval totalDuration __attribute__((deprecated));; @property (readonly) NSTimeInterval totalDuration __attribute__((deprecated));
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
+30 -5
View File
@@ -313,11 +313,24 @@ typedef struct
*bufferSize = frames; *bufferSize = frames;
*eof = frames == 0; *eof = frames == 0;
// notify delegate //
// Notify delegate
//
if ([self.delegate respondsToSelector:@selector(audioFileUpdatedPosition:)])
{
[self.delegate audioFileUpdatedPosition:self];
}
//
// Deprecated, but supported until 1.0
//
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
if ([self.delegate respondsToSelector:@selector(audioFile:updatedPosition:)]) if ([self.delegate respondsToSelector:@selector(audioFile:updatedPosition:)])
{ {
[self.delegate audioFile:self updatedPosition:self.frameIndex]; [self.delegate audioFile:self updatedPosition:[self frameIndex]];
} }
#pragma GCC diagnostic pop
if ([self.delegate respondsToSelector:@selector(audioFile:readAudio:withBufferSize:withNumberOfChannels:)]) if ([self.delegate respondsToSelector:@selector(audioFile:readAudio:withBufferSize:withNumberOfChannels:)])
{ {
@@ -351,12 +364,24 @@ typedef struct
pthread_mutex_unlock(&_lock); pthread_mutex_unlock(&_lock);
// notify delegate //
// Notify delegate
//
if ([self.delegate respondsToSelector:@selector(audioFileUpdatedPosition:)])
{
[self.delegate audioFileUpdatedPosition:self];
}
//
// Deprecated, but supported until 1.0
//
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
if ([self.delegate respondsToSelector:@selector(audioFile:updatedPosition:)]) if ([self.delegate respondsToSelector:@selector(audioFile:updatedPosition:)])
{ {
[self.delegate audioFile:self [self.delegate audioFile:self updatedPosition:[self frameIndex]];
updatedPosition:self.frameIndex];
} }
#pragma GCC diagnostic pop
} }
} }
+9
View File
@@ -109,6 +109,15 @@ FOUNDATION_EXPORT NSString * const EZAudioPlayerDidSeekNotification;
updatedPosition:(SInt64)framePosition updatedPosition:(SInt64)framePosition
inAudioFile:(EZAudioFile *)audioFile; inAudioFile:(EZAudioFile *)audioFile;
/**
Triggered by EZAudioPlayer's internal EZAudioFile's EZAudioFileDelegate callback and notifies the delegate that the end of the file has been reached.
@param audioPlayer The instance of the EZAudioPlayer that triggered the event
@param audioFile The instance of the EZAudioFile that the event was triggered from
*/
- (void)audioPlayer:(EZAudioPlayer *)audioPlayer
reachedEndOfAudioFile:(EZAudioFile *)audioFile;
@end @end
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
+6 -2
View File
@@ -372,6 +372,10 @@ NSString * const EZAudioPlayerDidSeekNotification = @"EZAudioPlayerDidSeekNotifi
audioBufferList:audioBufferList audioBufferList:audioBufferList
bufferSize:&bufferSize bufferSize:&bufferSize
eof:&eof]; eof:&eof];
if (eof && [self.delegate respondsToSelector:@selector(audioPlayer:reachedEndOfAudioFile:)])
{
[self.delegate audioPlayer:self reachedEndOfAudioFile:self.audioFile];
}
if (eof && self.shouldLoop) if (eof && self.shouldLoop)
{ {
[self seekToFrame:0]; [self seekToFrame:0];
@@ -391,12 +395,12 @@ NSString * const EZAudioPlayerDidSeekNotification = @"EZAudioPlayerDidSeekNotifi
#pragma mark - EZAudioFileDelegate #pragma mark - EZAudioFileDelegate
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
- (void)audioFile:(EZAudioFile *)audioFile updatedPosition:(SInt64)framePosition - (void)audioFileUpdatedPosition:(EZAudioFile *)audioFile
{ {
if ([self.delegate respondsToSelector:@selector(audioPlayer:updatedPosition:inAudioFile:)]) if ([self.delegate respondsToSelector:@selector(audioPlayer:updatedPosition:inAudioFile:)])
{ {
[self.delegate audioPlayer:self [self.delegate audioPlayer:self
updatedPosition:framePosition updatedPosition:[audioFile frameIndex]
inAudioFile:audioFile]; inAudioFile:audioFile];
} }
} }
+7
View File
@@ -156,6 +156,13 @@ FOUNDATION_EXPORT UInt32 const EZAudioPlotDefaultMaxHistoryBufferLength;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
/**
Called after the view has been created. Subclasses should use to add any additional methods needed instead of overriding the init methods.
*/
- (void)setupPlot;
//------------------------------------------------------------------------------
/** /**
Provides the default number of points that will be used to initialize the graph's points data structure that holds. Essentially the plot starts off as a flat line of this many points. Default is 100. Provides the default number of points that will be used to initialize the graph's points data structure that holds. Essentially the plot starts off as a flat line of this many points. Default is 100.
@return An int describing the initial number of points the plot should have when flat lined. @return An int describing the initial number of points the plot should have when flat lined.
+14
View File
@@ -151,11 +151,25 @@ UInt32 const EZAudioPlotDefaultMaxHistoryBufferLength = 8192;
self.backgroundColor = nil; self.backgroundColor = nil;
[self.layer insertSublayer:self.waveformLayer atIndex:0]; [self.layer insertSublayer:self.waveformLayer atIndex:0];
//
// Allow subclass to initialize plot
//
[self setupPlot];
self.points = calloc(EZAudioPlotDefaultMaxHistoryBufferLength, sizeof(CGPoint)); self.points = calloc(EZAudioPlotDefaultMaxHistoryBufferLength, sizeof(CGPoint));
self.pointCount = [self initialPointCount]; self.pointCount = [self initialPointCount];
[self redraw]; [self redraw];
} }
//------------------------------------------------------------------------------
- (void)setupPlot
{
//
// Override in subclass
//
}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#pragma mark - Setup #pragma mark - Setup
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
+35 -5
View File
@@ -64,21 +64,29 @@ typedef struct
The default background color of the plot. For iOS the color is specified as a UIColor while for OSX the color is an NSColor. The default value on both platforms is a sweet looking green. The default background color of the plot. For iOS the color is specified as a UIColor while for OSX the color is an NSColor. The default value on both platforms is a sweet looking green.
@warning On OSX, if you set the background to a value where the alpha component is 0 then the EZAudioPlotGL will automatically set its superview to be layer-backed. @warning On OSX, if you set the background to a value where the alpha component is 0 then the EZAudioPlotGL will automatically set its superview to be layer-backed.
*/ */
@property (nonatomic, strong) id backgroundColor; #if TARGET_OS_IPHONE
@property (nonatomic, strong) IBInspectable UIColor *backgroundColor;
#elif TARGET_OS_MAC
@property (nonatomic, strong) IBInspectable NSColor *backgroundColor;
#endif
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
/** /**
The default color of the plot's data (i.e. waveform, y-axis values). For iOS the color is specified as a UIColor while for OSX the color is an NSColor. The default value on both platforms is white. The default color of the plot's data (i.e. waveform, y-axis values). For iOS the color is specified as a UIColor while for OSX the color is an NSColor. The default value on both platforms is white.
*/ */
@property (nonatomic, strong) id color; #if TARGET_OS_IPHONE
@property (nonatomic, strong) IBInspectable UIColor *color;
#elif TARGET_OS_MAC
@property (nonatomic, strong) IBInspectable NSColor *color;
#endif
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
/** /**
The plot's gain value, which controls the scale of the y-axis values. The default value of the gain is 1.0f and should always be greater than 0.0f. The plot's gain value, which controls the scale of the y-axis values. The default value of the gain is 1.0f and should always be greater than 0.0f.
*/ */
@property (nonatomic, assign) float gain; @property (nonatomic, assign) IBInspectable float gain;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@@ -92,14 +100,14 @@ typedef struct
/** /**
A BOOL indicating whether or not to fill in the graph. A value of YES will make a filled graph (filling in the space between the x-axis and the y-value), while a value of NO will create a stroked graph (connecting the points along the y-axis). Default is NO. A BOOL indicating whether or not to fill in the graph. A value of YES will make a filled graph (filling in the space between the x-axis and the y-value), while a value of NO will create a stroked graph (connecting the points along the y-axis). Default is NO.
*/ */
@property (nonatomic, assign) BOOL shouldFill; @property (nonatomic, assign) IBInspectable BOOL shouldFill;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
/** /**
A boolean indicating whether the graph should be rotated along the x-axis to give a mirrored reflection. This is typical for audio plots to produce the classic waveform look. A value of YES will produce a mirrored reflection of the y-values about the x-axis, while a value of NO will only plot the y-values. Default is NO. A boolean indicating whether the graph should be rotated along the x-axis to give a mirrored reflection. This is typical for audio plots to produce the classic waveform look. A value of YES will produce a mirrored reflection of the y-values about the x-axis, while a value of NO will only plot the y-values. Default is NO.
*/ */
@property (nonatomic, assign) BOOL shouldMirror; @property (nonatomic, assign) IBInspectable BOOL shouldMirror;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#pragma mark - Updating The Plot #pragma mark - Updating The Plot
@@ -198,6 +206,28 @@ typedef struct
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
/**
Called during the OpenGL run loop to constantly update the drawing 60 fps. Callers can use this force update the screen while subclasses can override this for complete control over their rendering. However, subclasses are more encouraged to use the `redrawWithPoints:pointCount:baseEffect:vertexBufferObject:vertexArrayBuffer:interpolated:mirrored:gain:`
*/
- (void)redraw;
//------------------------------------------------------------------------------
/**
Called after the view has been created. Subclasses should use to add any additional methods needed instead of overriding the init methods.
*/
- (void)setup;
//------------------------------------------------------------------------------
/**
Main method used to copy the sample data from the source buffer and update the
plot. Subclasses can overwrite this method for custom behavior.
@param data A float array of the sample data. Subclasses should copy this data to a separate array to avoid threading issues.
@param length The length of the float array as an int.
*/
- (void)setSampleData:(float *)data length:(int)length;
///----------------------------------------------------------- ///-----------------------------------------------------------
/// @name Subclass Methods /// @name Subclass Methods
///----------------------------------------------------------- ///-----------------------------------------------------------
+15
View File
@@ -182,6 +182,11 @@ typedef struct
self.color = [NSColor colorWithCalibratedRed:1.0f green:1.0f blue:1.0f alpha:1.0f]; self.color = [NSColor colorWithCalibratedRed:1.0f green:1.0f blue:1.0f alpha:1.0f];
#endif #endif
//
// Allow subclass to initialize plot
//
[self setupPlot];
// //
// Create the display link // Create the display link
// //
@@ -191,6 +196,15 @@ typedef struct
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
- (void)setupPlot
{
//
// Override in subclass
//
}
//------------------------------------------------------------------------------
- (void)setupOpenGL - (void)setupOpenGL
{ {
self.baseEffect = [[GLKBaseEffect alloc] init]; self.baseEffect = [[GLKBaseEffect alloc] init];
@@ -247,6 +261,7 @@ typedef struct
#if !TARGET_OS_IPHONE #if !TARGET_OS_IPHONE
[self.openGLContext unlock]; [self.openGLContext unlock];
#endif #endif
self.frame = self.frame;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
+1 -1
View File
@@ -150,7 +150,7 @@ BOOL __shouldExitOnCheckResultFail = YES;
NULL, NULL,
&propSize, &propSize,
&asbd) &asbd)
operation:"Failed to fill out the rest of the m4a AudioStreamBasicDescription"]; operation:"Failed to fill out the rest of the iLBC AudioStreamBasicDescription"];
return asbd; return asbd;
} }
+9
View File
@@ -54,6 +54,15 @@
/// @name Audio Data Description /// @name Audio Data Description
///----------------------------------------------------------- ///-----------------------------------------------------------
/**
Called anytime the EZMicrophone starts or stops.
@param output The instance of the EZMicrophone that triggered the event.
@param isPlaying A BOOL indicating whether the EZMicrophone instance is playing or not.
*/
- (void)microphone:(EZMicrophone *)microphone changedPlayingState:(BOOL)isPlaying;
//------------------------------------------------------------------------------
/** /**
Called anytime the input device changes on an `EZMicrophone` instance. Called anytime the input device changes on an `EZMicrophone` instance.
@param microphone The instance of the EZMicrophone that triggered the event. @param microphone The instance of the EZMicrophone that triggered the event.
+27 -17
View File
@@ -70,7 +70,8 @@ static OSStatus EZAudioMicrophoneCallback(void *inRefCon,
- (void)dealloc - (void)dealloc
{ {
[[NSNotificationCenter defaultCenter] removeObserver:self]; [[NSNotificationCenter defaultCenter] removeObserver:self];
[EZAudioUtilities checkResult:AudioUnitUninitialize(self.info->audioUnit) operation:"Failed to unintialize audio unit for microphone"]; [EZAudioUtilities checkResult:AudioUnitUninitialize(self.info->audioUnit)
operation:"Failed to unintialize audio unit for microphone"];
[EZAudioUtilities freeBufferList:self.info->audioBufferList]; [EZAudioUtilities freeBufferList:self.info->audioBufferList];
[EZAudioUtilities freeFloatBuffers:self.info->floatData [EZAudioUtilities freeFloatBuffers:self.info->floatData
numberOfChannels:self.info->streamFormat.mChannelsPerFrame]; numberOfChannels:self.info->streamFormat.mChannelsPerFrame];
@@ -116,11 +117,7 @@ static OSStatus EZAudioMicrophoneCallback(void *inRefCon,
self = [self initWithMicrophoneDelegate:delegate]; self = [self initWithMicrophoneDelegate:delegate];
if(self) if(self)
{ {
self.info = (EZMicrophoneInfo *)malloc(sizeof(EZMicrophoneInfo)); [self setAudioStreamBasicDescription:audioStreamBasicDescription];
memset(self.info, 0, sizeof(EZMicrophoneInfo));
self.info->streamFormat = audioStreamBasicDescription;
_delegate = delegate;
[self setup];
} }
return self; return self;
} }
@@ -239,13 +236,8 @@ static OSStatus EZAudioMicrophoneCallback(void *inRefCon,
&flag, &flag,
sizeof(flag)) sizeof(flag))
operation:"Couldn't enable input on remote IO unit."]; operation:"Couldn't enable input on remote IO unit."];
EZAudioDevice *currentInputDevice = [EZAudioDevice currentInputDevice];
[self setDevice:currentInputDevice];
#elif TARGET_OS_MAC
NSArray *inputDevices = [EZAudioDevice inputDevices];
EZAudioDevice *defaultMicrophone = [inputDevices lastObject];
[self setDevice:defaultMicrophone];
#endif #endif
[self setDevice:[EZAudioDevice currentInputDevice]];
UInt32 propSize = sizeof(self.info->inputFormat); UInt32 propSize = sizeof(self.info->inputFormat);
[EZAudioUtilities checkResult:AudioUnitGetProperty(self.info->audioUnit, [EZAudioUtilities checkResult:AudioUnitGetProperty(self.info->audioUnit,
@@ -260,11 +252,7 @@ static OSStatus EZAudioMicrophoneCallback(void *inRefCon,
NSAssert(self.info->inputFormat.mSampleRate, @"Expected AVAudioSession sample rate to be greater than 0.0. Did you setup the audio session?"); NSAssert(self.info->inputFormat.mSampleRate, @"Expected AVAudioSession sample rate to be greater than 0.0. Did you setup the audio session?");
#elif TARGET_OS_MAC #elif TARGET_OS_MAC
#endif #endif
if (self.info->streamFormat.mSampleRate == 0.0) [self setAudioStreamBasicDescription:[self defaultStreamFormat]];
{
self.info->streamFormat = [self defaultStreamFormat];
}
[self setAudioStreamBasicDescription:self.info->streamFormat];
// render callback // render callback
AURenderCallbackStruct renderCallbackStruct; AURenderCallbackStruct renderCallbackStruct;
@@ -349,16 +337,38 @@ static OSStatus EZAudioMicrophoneCallback(void *inRefCon,
-(void)startFetchingAudio -(void)startFetchingAudio
{ {
//
// Start output unit
//
[EZAudioUtilities checkResult:AudioOutputUnitStart(self.info->audioUnit) [EZAudioUtilities checkResult:AudioOutputUnitStart(self.info->audioUnit)
operation:"Failed to start microphone audio unit"]; operation:"Failed to start microphone audio unit"];
//
// Notify delegate
//
if ([self.delegate respondsToSelector:@selector(microphone:changedPlayingState:)])
{
[self.delegate microphone:self changedPlayingState:YES];
}
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
-(void)stopFetchingAudio -(void)stopFetchingAudio
{ {
//
// Stop output unit
//
[EZAudioUtilities checkResult:AudioOutputUnitStop(self.info->audioUnit) [EZAudioUtilities checkResult:AudioOutputUnitStop(self.info->audioUnit)
operation:"Failed to stop microphone audio unit"]; operation:"Failed to stop microphone audio unit"];
//
// Notify delegate
//
if ([self.delegate respondsToSelector:@selector(microphone:changedPlayingState:)])
{
[self.delegate microphone:self changedPlayingState:NO];
}
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
+5 -8
View File
@@ -108,8 +108,8 @@ OSStatus EZOutputGraphRenderCallback(void *inRefCon,
operation:"Failed to stop graph"]; operation:"Failed to stop graph"];
[EZAudioUtilities checkResult:AUGraphClose(self.info->graph) [EZAudioUtilities checkResult:AUGraphClose(self.info->graph)
operation:"Failed to close graph"]; operation:"Failed to close graph"];
[EZAudioUtilities checkResult:AUGraphUninitialize(self.info->graph) [EZAudioUtilities checkResult:DisposeAUGraph(self.info->graph)
operation:"Failed to uninitialize graph"]; operation:"Failed to dispose of graph"];
free(self.info); free(self.info);
} }
@@ -314,14 +314,11 @@ OSStatus EZOutputGraphRenderCallback(void *inRefCon,
[self setClientFormat:[self defaultClientFormat]]; [self setClientFormat:[self defaultClientFormat]];
[self setInputFormat:[self defaultInputFormat]]; [self setInputFormat:[self defaultInputFormat]];
#if TARGET_OS_IPHONE //
// Use the default device
//
EZAudioDevice *currentOutputDevice = [EZAudioDevice currentOutputDevice]; EZAudioDevice *currentOutputDevice = [EZAudioDevice currentOutputDevice];
[self setDevice:currentOutputDevice]; [self setDevice:currentOutputDevice];
#elif TARGET_OS_MAC
NSArray *outputDevices = [EZAudioDevice outputDevices];
EZAudioDevice *defaultOutput = [outputDevices firstObject];
[self setDevice:defaultOutput];
#endif
// //
// Set maximum frames per slice to 4096 to allow playback during // Set maximum frames per slice to 4096 to allow playback during
+15 -8
View File
@@ -75,32 +75,40 @@ typedef NS_ENUM(NSInteger, EZPlotType)
/** /**
The default background color of the plot. For iOS the color is specified as a UIColor while for OSX the color is an NSColor. The default value on both platforms is black. The default background color of the plot. For iOS the color is specified as a UIColor while for OSX the color is an NSColor. The default value on both platforms is black.
*/ */
@property (nonatomic,strong) id backgroundColor; #if TARGET_OS_IPHONE
@property (nonatomic, strong) IBInspectable UIColor *backgroundColor;
#elif TARGET_OS_MAC
@property (nonatomic, strong) IBInspectable NSColor *backgroundColor;
#endif
/** /**
The default color of the plot's data (i.e. waveform, y-axis values). For iOS the color is specified as a UIColor while for OSX the color is an NSColor. The default value on both platforms is red. The default color of the plot's data (i.e. waveform, y-axis values). For iOS the color is specified as a UIColor while for OSX the color is an NSColor. The default value on both platforms is red.
*/ */
@property (nonatomic,strong) id color; #if TARGET_OS_IPHONE
@property (nonatomic, strong) IBInspectable UIColor *color;
#elif TARGET_OS_MAC
@property (nonatomic, strong) IBInspectable NSColor *color;
#endif
/** /**
The plot's gain value, which controls the scale of the y-axis values. The default value of the gain is 1.0f and should always be greater than 0.0f. The plot's gain value, which controls the scale of the y-axis values. The default value of the gain is 1.0f and should always be greater than 0.0f.
*/ */
@property (nonatomic,assign,setter=setGain:) float gain; @property (nonatomic, assign) IBInspectable float gain;
/** /**
The type of plot as specified by the `EZPlotType` enumeration (i.e. a buffer or rolling plot type). The type of plot as specified by the `EZPlotType` enumeration (i.e. a buffer or rolling plot type).
*/ */
@property (nonatomic,assign,setter=setPlotType:) EZPlotType plotType; @property (nonatomic, assign) IBInspectable EZPlotType plotType;
/** /**
A boolean indicating whether or not to fill in the graph. A value of YES will make a filled graph (filling in the space between the x-axis and the y-value), while a value of NO will create a stroked graph (connecting the points along the y-axis). A boolean indicating whether or not to fill in the graph. A value of YES will make a filled graph (filling in the space between the x-axis and the y-value), while a value of NO will create a stroked graph (connecting the points along the y-axis).
*/ */
@property (nonatomic,assign,setter=setShouldFill:) BOOL shouldFill; @property (nonatomic, assign) IBInspectable BOOL shouldFill;
/** /**
A boolean indicating whether the graph should be rotated along the x-axis to give a mirrored reflection. This is typical for audio plots to produce the classic waveform look. A value of YES will produce a mirrored reflection of the y-values about the x-axis, while a value of NO will only plot the y-values. A boolean indicating whether the graph should be rotated along the x-axis to give a mirrored reflection. This is typical for audio plots to produce the classic waveform look. A value of YES will produce a mirrored reflection of the y-values about the x-axis, while a value of NO will only plot the y-values.
*/ */
@property (nonatomic,assign,setter=setShouldMirror:) BOOL shouldMirror; @property (nonatomic, assign) IBInspectable BOOL shouldMirror;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#pragma mark - Clearing #pragma mark - Clearing
@@ -129,7 +137,6 @@ typedef NS_ENUM(NSInteger, EZPlotType)
@param bufferSize The size of the float array that will be mapped to the y-axis. @param bufferSize The size of the float array that will be mapped to the y-axis.
@warning The bufferSize is expected to be the same, constant value once initial triggered. For plots using OpenGL a vertex buffer object will be allocated with a maximum buffersize of (2 * the initial given buffer size) to account for any interpolation necessary for filling in the graph. Updates use the glBufferSubData(...) function, which will crash if the buffersize exceeds the initial maximum allocated size. @warning The bufferSize is expected to be the same, constant value once initial triggered. For plots using OpenGL a vertex buffer object will be allocated with a maximum buffersize of (2 * the initial given buffer size) to account for any interpolation necessary for filling in the graph. Updates use the glBufferSubData(...) function, which will crash if the buffersize exceeds the initial maximum allocated size.
*/ */
-(void)updateBuffer:(float *)buffer -(void)updateBuffer:(float *)buffer withBufferSize:(UInt32)bufferSize;
withBufferSize:(UInt32)bufferSize;
@end @end
+257 -16
View File
@@ -26,6 +26,12 @@
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#import <AudioToolbox/AudioToolbox.h> #import <AudioToolbox/AudioToolbox.h>
@class EZRecorder;
//------------------------------------------------------------------------------
#pragma mark - Data Structures
//------------------------------------------------------------------------------
/** /**
To ensure valid recording formats are used when recording to a file the EZRecorderFileType describes the most common file types that a file can be encoded in. Each of these types can be used to output recordings as such: To ensure valid recording formats are used when recording to a file the EZRecorderFileType describes the most common file types that a file can be encoded in. Each of these types can be used to output recordings as such:
@@ -50,57 +56,290 @@ typedef NS_ENUM(NSInteger, EZRecorderFileType)
EZRecorderFileTypeWAV EZRecorderFileTypeWAV
}; };
//------------------------------------------------------------------------------
#pragma mark - EZRecorderDelegate
//------------------------------------------------------------------------------
/**
The EZRecorderDelegate for the EZRecorder provides a receiver for write events, `recorderUpdatedCurrentTime:`, and the close event, `recorderDidClose:`.
*/
@protocol EZRecorderDelegate <NSObject>
@optional
/**
Triggers when the EZRecorder is explicitly closed with the `closeAudioFile` method.
@param recorder The EZRecorder instance that triggered the action
*/
- (void)recorderDidClose:(EZRecorder *)recorder;
/**
Triggers after the EZRecorder has successfully written audio data from the `appendDataFromBufferList:withBufferSize:` method.
@param recorder The EZRecorder instance that triggered the action
*/
- (void)recorderUpdatedCurrentTime:(EZRecorder *)recorder;
@end
//------------------------------------------------------------------------------
#pragma mark - EZRecorder
//------------------------------------------------------------------------------
/** /**
The EZRecorder provides a flexible way to create an audio file and append raw audio data to it. The EZRecorder will convert the incoming audio on the fly to the destination format so no conversion is needed between this and any other component. Right now the only supported output format is 'caf'. Each output file should have its own EZRecorder instance (think 1 EZRecorder = 1 audio file). The EZRecorder provides a flexible way to create an audio file and append raw audio data to it. The EZRecorder will convert the incoming audio on the fly to the destination format so no conversion is needed between this and any other component. Right now the only supported output format is 'caf'. Each output file should have its own EZRecorder instance (think 1 EZRecorder = 1 audio file).
*/ */
@interface EZRecorder : NSObject @interface EZRecorder : NSObject
//------------------------------------------------------------------------------
#pragma mark - Properties
//------------------------------------------------------------------------------
/**
An EZRecorderDelegate to listen for the write and close events.
*/
@property (nonatomic, weak) id<EZRecorderDelegate> delegate;
//------------------------------------------------------------------------------
#pragma mark - Initializers #pragma mark - Initializers
//------------------------------------------------------------------------------
///----------------------------------------------------------- ///-----------------------------------------------------------
/// @name Initializers /// @name Initializers
///----------------------------------------------------------- ///-----------------------------------------------------------
/**
Creates an instance of the EZRecorder with a file path URL to write out the file to, a client format describing the in-application common format (see `clientFormat` for more info), and a file type (see `EZRecorderFileType`) that will automatically create an internal `fileFormat` and audio file type hint.
@param url An NSURL representing the file path the output file should be written
@param clientFormat An AudioStreamBasicDescription describing the in-applciation common format (always linear PCM)
@param fileType A constant described by the EZRecorderFileType that corresponds to the type of destination file that should be written. For instance, an AAC file written using an '.m4a' extension would correspond to EZRecorderFileTypeM4A. See EZRecorderFileType for all the constants and mapping combinations.
@return A newly created EZRecorder instance.
*/
- (instancetype)initWithURL:(NSURL *)url
clientFormat:(AudioStreamBasicDescription)clientFormat
fileType:(EZRecorderFileType)fileType;
//------------------------------------------------------------------------------
/**
Creates an instance of the EZRecorder with a file path URL to write out the file to, a client format describing the in-application common format (see `clientFormat` for more info), and a file type (see `EZRecorderFileType`) that will automatically create an internal `fileFormat` and audio file type hint, as well as a delegate to respond to the recorder's write and close events.
@param url An NSURL representing the file path the output file should be written
@param clientFormat An AudioStreamBasicDescription describing the in-applciation common format (always linear PCM)
@param fileType A constant described by the EZRecorderFileType that corresponds to the type of destination file that should be written. For instance, an AAC file written using an '.m4a' extension would correspond to EZRecorderFileTypeM4A. See EZRecorderFileType for all the constants and mapping combinations.
@param delegate An EZRecorderDelegate to listen for the recorder's write and close events.
@return A newly created EZRecorder instance.
*/
- (instancetype)initWithURL:(NSURL *)url
clientFormat:(AudioStreamBasicDescription)clientFormat
fileType:(EZRecorderFileType)fileType
delegate:(id<EZRecorderDelegate>)delegate;
//------------------------------------------------------------------------------
/**
Creates an instance of the EZRecorder with a file path URL to write out the file to, a client format describing the in-application common format (see `clientFormat` for more info), a file format describing the destination format on disk (see `fileFormat` for more info), and an audio file type (an AudioFileTypeID for Core Audio, not a EZRecorderFileType).
@param url An NSURL representing the file path the output file should be written
@param clientFormat An AudioStreamBasicDescription describing the in-applciation common format (always linear PCM)
@param fileFormat An AudioStreamBasicDescription describing the format of the audio being written to disk (MP3, AAC, WAV, etc)
@param audioFileTypeID An AudioFileTypeID that matches your fileFormat (i.e. kAudioFileM4AType for an M4A format)
@return A newly created EZRecorder instance.
*/
- (instancetype)initWithURL:(NSURL *)url
clientFormat:(AudioStreamBasicDescription)clientFormat
fileFormat:(AudioStreamBasicDescription)fileFormat
audioFileTypeID:(AudioFileTypeID)audioFileTypeID;
//------------------------------------------------------------------------------
/**
Creates an instance of the EZRecorder with a file path URL to write out the file to, a client format describing the in-application common format (see `clientFormat` for more info), a file format describing the destination format on disk (see `fileFormat` for more info), an audio file type (an AudioFileTypeID for Core Audio, not a EZRecorderFileType), and delegate to respond to the recorder's write and close events.
@param url An NSURL representing the file path the output file should be written
@param clientFormat An AudioStreamBasicDescription describing the in-applciation common format (always linear PCM)
@param fileFormat An AudioStreamBasicDescription describing the format of the audio being written to disk (MP3, AAC, WAV, etc)
@param audioFileTypeID An AudioFileTypeID that matches your fileFormat (i.e. kAudioFileM4AType for an M4A format)
@param delegate An EZRecorderDelegate to listen for the recorder's write and close events.
@return A newly created EZRecorder instance.
*/
- (instancetype)initWithURL:(NSURL *)url
clientFormat:(AudioStreamBasicDescription)clientFormat
fileFormat:(AudioStreamBasicDescription)fileFormat
audioFileTypeID:(AudioFileTypeID)audioFileTypeID
delegate:(id<EZRecorderDelegate>)delegate;
//------------------------------------------------------------------------------
/** /**
Creates a new instance of an EZRecorder using a destination file path URL and the source format of the incoming audio. Creates a new instance of an EZRecorder using a destination file path URL and the source format of the incoming audio.
@param url An NSURL specifying the file path location of where the audio file should be written to. @param url An NSURL specifying the file path location of where the audio file should be written to.
@param sourceFormat The AudioStreamBasicDescription for the incoming audio that will be written to the file. @param sourceFormat The AudioStreamBasicDescription for the incoming audio that will be written to the file.
@param destinationFileType A constant described by the EZRecorderFileType that corresponds to the type of destination file that should be written. For instance, an AAC file written using an '.m4a' extension would correspond to EZRecorderFileTypeM4A. See EZRecorderFileType for all the constants and mapping combinations. @param destinationFileType A constant described by the EZRecorderFileType that corresponds to the type of destination file that should be written. For instance, an AAC file written using an '.m4a' extension would correspond to EZRecorderFileTypeM4A. See EZRecorderFileType for all the constants and mapping combinations.
@deprecated This property is deprecated starting in version 0.8.0.
@note Please use `initWithURL:clientFormat:fileType:` initializer instead.
@return The newly created EZRecorder instance. @return The newly created EZRecorder instance.
*/ */
-(EZRecorder*)initWithDestinationURL:(NSURL*)url - (instancetype)initWithDestinationURL:(NSURL*)url
sourceFormat:(AudioStreamBasicDescription)sourceFormat sourceFormat:(AudioStreamBasicDescription)sourceFormat
destinationFileType:(EZRecorderFileType)destinationFileType; destinationFileType:(EZRecorderFileType)destinationFileType __attribute__((deprecated));
//------------------------------------------------------------------------------
#pragma mark - Class Initializers #pragma mark - Class Initializers
//------------------------------------------------------------------------------
///----------------------------------------------------------- ///-----------------------------------------------------------
/// @name Class Initializers /// @name Class Initializers
///----------------------------------------------------------- ///-----------------------------------------------------------
/**
Class method to create an instance of the EZRecorder with a file path URL to write out the file to, a client format describing the in-application common format (see `clientFormat` for more info), and a file type (see `EZRecorderFileType`) that will automatically create an internal `fileFormat` and audio file type hint.
@param url An NSURL representing the file path the output file should be written
@param clientFormat An AudioStreamBasicDescription describing the in-applciation common format (always linear PCM)
@param fileType A constant described by the EZRecorderFileType that corresponds to the type of destination file that should be written. For instance, an AAC file written using an '.m4a' extension would correspond to EZRecorderFileTypeM4A. See EZRecorderFileType for all the constants and mapping combinations.
@return A newly created EZRecorder instance.
*/
+ (instancetype)recorderWithURL:(NSURL *)url
clientFormat:(AudioStreamBasicDescription)clientFormat
fileType:(EZRecorderFileType)fileType;
//------------------------------------------------------------------------------
/**
Class method to create an instance of the EZRecorder with a file path URL to write out the file to, a client format describing the in-application common format (see `clientFormat` for more info), and a file type (see `EZRecorderFileType`) that will automatically create an internal `fileFormat` and audio file type hint, as well as a delegate to respond to the recorder's write and close events.
@param url An NSURL representing the file path the output file should be written
@param clientFormat An AudioStreamBasicDescription describing the in-applciation common format (always linear PCM)
@param fileType A constant described by the EZRecorderFileType that corresponds to the type of destination file that should be written. For instance, an AAC file written using an '.m4a' extension would correspond to EZRecorderFileTypeM4A. See EZRecorderFileType for all the constants and mapping combinations.
@param delegate An EZRecorderDelegate to listen for the recorder's write and close events.
@return A newly created EZRecorder instance.
*/
+ (instancetype)recorderWithURL:(NSURL *)url
clientFormat:(AudioStreamBasicDescription)clientFormat
fileType:(EZRecorderFileType)fileType
delegate:(id<EZRecorderDelegate>)delegate;
//------------------------------------------------------------------------------
/**
Class method to create an instance of the EZRecorder with a file path URL to write out the file to, a client format describing the in-application common format (see `clientFormat` for more info), a file format describing the destination format on disk (see `fileFormat` for more info), and an audio file type (an AudioFileTypeID for Core Audio, not a EZRecorderFileType).
@param url An NSURL representing the file path the output file should be written
@param clientFormat An AudioStreamBasicDescription describing the in-applciation common format (always linear PCM)
@param fileFormat An AudioStreamBasicDescription describing the format of the audio being written to disk (MP3, AAC, WAV, etc)
@param audioFileTypeID An AudioFileTypeID that matches your fileFormat (i.e. kAudioFileM4AType for an M4A format)
@return A newly created EZRecorder instance.
*/
+ (instancetype)recorderWithURL:(NSURL *)url
clientFormat:(AudioStreamBasicDescription)clientFormat
fileFormat:(AudioStreamBasicDescription)fileFormat
audioFileTypeID:(AudioFileTypeID)audioFileTypeID;
//------------------------------------------------------------------------------
/**
Class method to create an instance of the EZRecorder with a file path URL to write out the file to, a client format describing the in-application common format (see `clientFormat` for more info), a file format describing the destination format on disk (see `fileFormat` for more info), an audio file type (an AudioFileTypeID for Core Audio, not a EZRecorderFileType), and delegate to respond to the recorder's write and close events.
@param url An NSURL representing the file path the output file should be written
@param clientFormat An AudioStreamBasicDescription describing the in-applciation common format (always linear PCM)
@param fileFormat An AudioStreamBasicDescription describing the format of the audio being written to disk (MP3, AAC, WAV, etc)
@param audioFileTypeID An AudioFileTypeID that matches your fileFormat (i.e. kAudioFileM4AType for an M4A format)
@param delegate An EZRecorderDelegate to listen for the recorder's write and close events.
@return A newly created EZRecorder instance.
*/
+ (instancetype)recorderWithURL:(NSURL *)url
clientFormat:(AudioStreamBasicDescription)clientFormat
fileFormat:(AudioStreamBasicDescription)fileFormat
audioFileTypeID:(AudioFileTypeID)audioFileTypeID
delegate:(id<EZRecorderDelegate>)delegate;
//------------------------------------------------------------------------------
/** /**
Class method to create a new instance of an EZRecorder using a destination file path URL and the source format of the incoming audio. Class method to create a new instance of an EZRecorder using a destination file path URL and the source format of the incoming audio.
@param url An NSURL specifying the file path location of where the audio file should be written to. @param url An NSURL specifying the file path location of where the audio file should be written to.
@param sourceFormat The AudioStreamBasicDescription for the incoming audio that will be written to the file. @param sourceFormat The AudioStreamBasicDescription for the incoming audio that will be written to the file (also called the `clientFormat`).
@param destinationFileType A constant described by the EZRecorderFileType that corresponds to the type of destination file that should be written. For instance, an AAC file written using an '.m4a' extension would correspond to EZRecorderFileTypeM4A. See EZRecorderFileType for all the constants and mapping combinations. @param destinationFileType A constant described by the EZRecorderFileType that corresponds to the type of destination file that should be written. For instance, an AAC file written using an '.m4a' extension would correspond to EZRecorderFileTypeM4A. See EZRecorderFileType for all the constants and mapping combinations.
@return The newly created EZRecorder instance. @return The newly created EZRecorder instance.
*/ */
+(EZRecorder*)recorderWithDestinationURL:(NSURL*)url + (instancetype)recorderWithDestinationURL:(NSURL*)url
sourceFormat:(AudioStreamBasicDescription)sourceFormat sourceFormat:(AudioStreamBasicDescription)sourceFormat
destinationFileType:(EZRecorderFileType)destinationFileType; destinationFileType:(EZRecorderFileType)destinationFileType __attribute__((deprecated));
//------------------------------------------------------------------------------
#pragma mark - Properties
//------------------------------------------------------------------------------
#pragma mark - Getters
///----------------------------------------------------------- ///-----------------------------------------------------------
/// @name Getting The Recorder's Properties /// @name Getting The Recorder's Properties
///----------------------------------------------------------- ///-----------------------------------------------------------
/**
Provides the common AudioStreamBasicDescription that will be used for in-app interaction. The recorder's format will be converted from this format to the `fileFormat`. For instance, the file on disk could be a 22.5 kHz, float format, but we might have an audio processing graph that has a 44.1 kHz, signed integer format that we'd like to interact with. The client format lets us set that 44.1 kHz format on the recorder to properly write samples from the graph out to the file in the desired destination format.
@warning This must be a linear PCM format!
@return An AudioStreamBasicDescription structure describing the format of the audio file.
*/
@property (readwrite) AudioStreamBasicDescription clientFormat;
//------------------------------------------------------------------------------
/**
Provides the current write offset in the audio file as an NSTimeInterval (i.e. in seconds). When setting this it will determine the correct frame offset and perform a `seekToFrame` to the new time offset.
@warning Make sure the new current time offset is less than the `duration` or you will receive an invalid seek assertion.
*/
@property (readonly) NSTimeInterval currentTime;
//------------------------------------------------------------------------------
/**
Provides the duration of the audio file in seconds.
*/
@property (readonly) NSTimeInterval duration;
//------------------------------------------------------------------------------
/**
Provides the AudioStreamBasicDescription structure containing the format of the recorder's audio file.
@return An AudioStreamBasicDescription structure describing the format of the audio file.
*/
@property (readonly) AudioStreamBasicDescription fileFormat;
//------------------------------------------------------------------------------
/**
Provides the current time as an NSString with the time format MM:SS.
*/
@property (readonly) NSString *formattedCurrentTime;
//------------------------------------------------------------------------------
/**
Provides the duration as an NSString with the time format MM:SS.
*/
@property (readonly) NSString *formattedDuration;
//------------------------------------------------------------------------------
/**
Provides the frame index (a.k.a the write positon) within the audio file as SInt64. This can be helpful when seeking through the audio file.
@return The current frame index within the audio file as a SInt64.
*/
@property (readonly) SInt64 frameIndex;
//------------------------------------------------------------------------------
/**
Provides the total frame count of the recorder's audio file in the file format.
@return The total number of frames in the recorder in the AudioStreamBasicDescription representing the file format as a SInt64.
*/
@property (readonly) SInt64 totalFrames;
//------------------------------------------------------------------------------
/** /**
Provides the file path that's currently being used by the recorder. Provides the file path that's currently being used by the recorder.
@return The NSURL representing the file path of the audio file path being used for recording. @return The NSURL representing the file path of the recorder path being used for recording.
*/ */
-(NSURL*)url; - (NSURL *)url;
//------------------------------------------------------------------------------
#pragma mark - Events #pragma mark - Events
//------------------------------------------------------------------------------
///----------------------------------------------------------- ///-----------------------------------------------------------
/// @name Appending Data To The Audio File /// @name Appending Data To The Recorder
///----------------------------------------------------------- ///-----------------------------------------------------------
/** /**
@@ -108,16 +347,18 @@ typedef NS_ENUM(NSInteger, EZRecorderFileType)
@param bufferList The AudioBufferList holding the audio data to append @param bufferList The AudioBufferList holding the audio data to append
@param bufferSize The size of each of the buffers in the buffer list. @param bufferSize The size of each of the buffers in the buffer list.
*/ */
-(void)appendDataFromBufferList:(AudioBufferList*)bufferList - (void)appendDataFromBufferList:(AudioBufferList *)bufferList
withBufferSize:(UInt32)bufferSize; withBufferSize:(UInt32)bufferSize;
//------------------------------------------------------------------------------
///----------------------------------------------------------- ///-----------------------------------------------------------
/// @name Closing The Audio File /// @name Closing The Recorder
///----------------------------------------------------------- ///-----------------------------------------------------------
/** /**
Finishes writes to the audio file and closes it. Finishes writes to the recorder's audio file and closes it.
*/ */
-(void)closeAudioFile; - (void)closeAudioFile;
@end @end
+327 -63
View File
@@ -26,57 +26,202 @@
#import "EZRecorder.h" #import "EZRecorder.h"
#import "EZAudioUtilities.h" #import "EZAudioUtilities.h"
@interface EZRecorder (){ //------------------------------------------------------------------------------
ExtAudioFileRef _destinationFile; #pragma mark - Data Structures
AudioFileTypeID _destinationFileTypeID; //------------------------------------------------------------------------------
CFURLRef _destinationFileURL;
AudioStreamBasicDescription _destinationFormat;
AudioStreamBasicDescription _sourceFormat;
}
typedef struct
{
AudioFileTypeID audioFileTypeID;
ExtAudioFileRef extAudioFileRef;
AudioStreamBasicDescription clientFormat;
BOOL closed;
CFURLRef fileURL;
AudioStreamBasicDescription fileFormat;
} EZRecorderInfo;
//------------------------------------------------------------------------------
#pragma mark - EZRecorder (Interface Extension)
//------------------------------------------------------------------------------
@interface EZRecorder ()
@property (nonatomic, assign) EZRecorderInfo *info;
@end @end
//------------------------------------------------------------------------------
#pragma mark - EZRecorder (Implementation)
//------------------------------------------------------------------------------
@implementation EZRecorder @implementation EZRecorder
#pragma mark - Initializers //------------------------------------------------------------------------------
-(EZRecorder*)initWithDestinationURL:(NSURL*)url #pragma mark - Dealloc
sourceFormat:(AudioStreamBasicDescription)sourceFormat //------------------------------------------------------------------------------
destinationFileType:(EZRecorderFileType)destinationFileType
- (void)dealloc
{ {
if (!self.info->closed)
{
[self closeAudioFile];
}
free(self.info);
}
//------------------------------------------------------------------------------
#pragma mark - Initializers
//------------------------------------------------------------------------------
- (instancetype)initWithURL:(NSURL *)url
clientFormat:(AudioStreamBasicDescription)clientFormat
fileType:(EZRecorderFileType)fileType
{
return [self initWithURL:url
clientFormat:clientFormat
fileType:fileType
delegate:nil];
}
//------------------------------------------------------------------------------
- (instancetype)initWithURL:(NSURL *)url
clientFormat:(AudioStreamBasicDescription)clientFormat
fileType:(EZRecorderFileType)fileType
delegate:(id<EZRecorderDelegate>)delegate
{
AudioStreamBasicDescription fileFormat = [EZRecorder formatForFileType:fileType
withSourceFormat:clientFormat];
AudioFileTypeID audioFileTypeID = [EZRecorder fileTypeIdForFileType:fileType
withSourceFormat:clientFormat];
return [self initWithURL:url
clientFormat:clientFormat
fileFormat:fileFormat
audioFileTypeID:audioFileTypeID
delegate:delegate];
}
//------------------------------------------------------------------------------
- (instancetype)initWithURL:(NSURL *)url
clientFormat:(AudioStreamBasicDescription)clientFormat
fileFormat:(AudioStreamBasicDescription)fileFormat
audioFileTypeID:(AudioFileTypeID)audioFileTypeID
{
return [self initWithURL:url
clientFormat:clientFormat
fileFormat:fileFormat
audioFileTypeID:audioFileTypeID
delegate:nil];
}
//------------------------------------------------------------------------------
- (instancetype)initWithURL:(NSURL *)url
clientFormat:(AudioStreamBasicDescription)clientFormat
fileFormat:(AudioStreamBasicDescription)fileFormat
audioFileTypeID:(AudioFileTypeID)audioFileTypeID
delegate:(id<EZRecorderDelegate>)delegate
{
self = [super init]; self = [super init];
if (self) if (self)
{ {
// Set defaults // Set defaults
_destinationFile = NULL; self.info = (EZRecorderInfo *)calloc(1, sizeof(EZRecorderInfo));
_destinationFileURL = (__bridge CFURLRef)url; self.info->audioFileTypeID = audioFileTypeID;
_sourceFormat = sourceFormat; self.info->fileURL = (__bridge CFURLRef)url;
_destinationFormat = [EZRecorder recorderFormatForFileType:destinationFileType self.info->clientFormat = clientFormat;
withSourceFormat:_sourceFormat]; self.info->fileFormat = fileFormat;
_destinationFileTypeID = [EZRecorder recorderFileTypeIdForFileType:destinationFileType self.delegate = delegate;
withSourceFormat:_sourceFormat]; [self setup];
// Initializer the recorder instance
[self _initializeRecorder];
} }
return self; return self;
} }
//------------------------------------------------------------------------------
- (instancetype)initWithDestinationURL:(NSURL*)url
sourceFormat:(AudioStreamBasicDescription)sourceFormat
destinationFileType:(EZRecorderFileType)destinationFileType
{
return [self initWithURL:url
clientFormat:sourceFormat
fileType:destinationFileType];
}
//------------------------------------------------------------------------------
#pragma mark - Class Initializers #pragma mark - Class Initializers
+(EZRecorder*)recorderWithDestinationURL:(NSURL*)url //------------------------------------------------------------------------------
sourceFormat:(AudioStreamBasicDescription)sourceFormat
destinationFileType:(EZRecorderFileType)destinationFileType + (instancetype)recorderWithURL:(NSURL *)url
clientFormat:(AudioStreamBasicDescription)clientFormat
fileType:(EZRecorderFileType)fileType
{
return [[self alloc] initWithURL:url
clientFormat:clientFormat
fileType:fileType];
}
//------------------------------------------------------------------------------
+ (instancetype)recorderWithURL:(NSURL *)url
clientFormat:(AudioStreamBasicDescription)clientFormat
fileType:(EZRecorderFileType)fileType
delegate:(id<EZRecorderDelegate>)delegate
{
return [[self alloc] initWithURL:url
clientFormat:clientFormat
fileType:fileType
delegate:delegate];
}
//------------------------------------------------------------------------------
+ (instancetype)recorderWithURL:(NSURL *)url
clientFormat:(AudioStreamBasicDescription)clientFormat
fileFormat:(AudioStreamBasicDescription)fileFormat
audioFileTypeID:(AudioFileTypeID)audioFileTypeID
{
return [[self alloc] initWithURL:url
clientFormat:clientFormat
fileFormat:fileFormat
audioFileTypeID:audioFileTypeID];
}
//------------------------------------------------------------------------------
+ (instancetype)recorderWithURL:(NSURL *)url
clientFormat:(AudioStreamBasicDescription)clientFormat
fileFormat:(AudioStreamBasicDescription)fileFormat
audioFileTypeID:(AudioFileTypeID)audioFileTypeID
delegate:(id<EZRecorderDelegate>)delegate
{
return [[self alloc] initWithURL:url
clientFormat:clientFormat
fileFormat:fileFormat
audioFileTypeID:audioFileTypeID
delegate:delegate];
}
//------------------------------------------------------------------------------
+ (instancetype)recorderWithDestinationURL:(NSURL*)url
sourceFormat:(AudioStreamBasicDescription)sourceFormat
destinationFileType:(EZRecorderFileType)destinationFileType
{ {
return [[EZRecorder alloc] initWithDestinationURL:url return [[EZRecorder alloc] initWithDestinationURL:url
sourceFormat:sourceFormat sourceFormat:sourceFormat
destinationFileType:destinationFileType]; destinationFileType:destinationFileType];
} }
#pragma mark - Private Configuration //------------------------------------------------------------------------------
+(AudioStreamBasicDescription)recorderFormatForFileType:(EZRecorderFileType)fileType #pragma mark - Class Methods
withSourceFormat:(AudioStreamBasicDescription)sourceFormat //------------------------------------------------------------------------------
+ (AudioStreamBasicDescription)formatForFileType:(EZRecorderFileType)fileType
withSourceFormat:(AudioStreamBasicDescription)sourceFormat
{ {
AudioStreamBasicDescription asbd; AudioStreamBasicDescription asbd;
switch ( fileType) switch (fileType)
{ {
case EZRecorderFileTypeAIFF: case EZRecorderFileTypeAIFF:
asbd = [EZAudioUtilities AIFFFormatWithNumberOfChannels:sourceFormat.mChannelsPerFrame asbd = [EZAudioUtilities AIFFFormatWithNumberOfChannels:sourceFormat.mChannelsPerFrame
@@ -98,11 +243,13 @@
return asbd; return asbd;
} }
+(AudioFileTypeID)recorderFileTypeIdForFileType:(EZRecorderFileType)fileType //------------------------------------------------------------------------------
withSourceFormat:(AudioStreamBasicDescription)sourceFormat
+ (AudioFileTypeID)fileTypeIdForFileType:(EZRecorderFileType)fileType
withSourceFormat:(AudioStreamBasicDescription)sourceFormat
{ {
AudioFileTypeID audioFileTypeID; AudioFileTypeID audioFileTypeID;
switch ( fileType) switch (fileType)
{ {
case EZRecorderFileTypeAIFF: case EZRecorderFileTypeAIFF:
audioFileTypeID = kAudioFileAIFFType; audioFileTypeID = kAudioFileAIFFType;
@@ -123,70 +270,187 @@
return audioFileTypeID; return audioFileTypeID;
} }
-(void)_initializeRecorder //------------------------------------------------------------------------------
- (void)setup
{ {
// Finish filling out the destination format description // Finish filling out the destination format description
UInt32 propSize = sizeof(_destinationFormat); UInt32 propSize = sizeof(self.info->fileFormat);
[EZAudioUtilities checkResult:AudioFormatGetProperty(kAudioFormatProperty_FormatInfo, [EZAudioUtilities checkResult:AudioFormatGetProperty(kAudioFormatProperty_FormatInfo,
0, 0,
NULL, NULL,
&propSize, &propSize,
&_destinationFormat) &self.info->fileFormat)
operation:"Failed to fill out rest of destination format"]; operation:"Failed to fill out rest of destination format"];
//
// Create the audio file // Create the audio file
[EZAudioUtilities checkResult:ExtAudioFileCreateWithURL(_destinationFileURL, //
_destinationFileTypeID, [EZAudioUtilities checkResult:ExtAudioFileCreateWithURL(self.info->fileURL,
&_destinationFormat, self.info->audioFileTypeID,
&self.info->fileFormat,
NULL, NULL,
kAudioFileFlags_EraseFile, kAudioFileFlags_EraseFile,
&_destinationFile) &self.info->extAudioFileRef)
operation:"Failed to create audio file"]; operation:"Failed to create audio file"];
// Set the client format (which should be equal to the source format) //
[EZAudioUtilities checkResult:ExtAudioFileSetProperty(_destinationFile, // Set the client format
kExtAudioFileProperty_ClientDataFormat, //
sizeof(_sourceFormat), [self setClientFormat:self.info->clientFormat];
&_sourceFormat)
operation:"Failed to set client format on recorded audio file"];
} }
//------------------------------------------------------------------------------
#pragma mark - Events #pragma mark - Events
-(void)appendDataFromBufferList:(AudioBufferList *)bufferList //------------------------------------------------------------------------------
withBufferSize:(UInt32)bufferSize
- (void)appendDataFromBufferList:(AudioBufferList *)bufferList
withBufferSize:(UInt32)bufferSize
{ {
if (_destinationFile) //
// Make sure the audio file is not closed
//
NSAssert(!self.info->closed, @"Cannot append data when EZRecorder has been closed. You must create a new instance.;");
//
// Perform the write
//
[EZAudioUtilities checkResult:ExtAudioFileWrite(self.info->extAudioFileRef,
bufferSize,
bufferList)
operation:"Failed to write audio data to recorded audio file"];
//
// Notify delegate
//
if ([self.delegate respondsToSelector:@selector(recorderUpdatedCurrentTime:)])
{ {
[EZAudioUtilities checkResult:ExtAudioFileWriteAsync(_destinationFile, [self.delegate recorderUpdatedCurrentTime:self];
bufferSize,
bufferList)
operation:"Failed to write audio data to recorded audio file"];
} }
} }
-(void)closeAudioFile //------------------------------------------------------------------------------
- (void)closeAudioFile
{ {
if (_destinationFile) if (!self.info->closed)
{ {
// Dispose of the audio file reference //
[EZAudioUtilities checkResult:ExtAudioFileDispose(_destinationFile) // Close, audio file can no longer be written to
//
[EZAudioUtilities checkResult:ExtAudioFileDispose(self.info->extAudioFileRef)
operation:"Failed to close audio file"]; operation:"Failed to close audio file"];
self.info->closed = YES;
// Null out the file reference //
_destinationFile = NULL; // Notify delegate
//
if ([self.delegate respondsToSelector:@selector(recorderDidClose:)])
{
[self.delegate recorderDidClose:self];
}
} }
} }
-(NSURL *)url //------------------------------------------------------------------------------
#pragma mark - Getters
//------------------------------------------------------------------------------
- (AudioStreamBasicDescription)clientFormat
{ {
return (__bridge NSURL*)_destinationFileURL; return self.info->clientFormat;
} }
#pragma mark - Dealloc //-----------------------------------------------------------------------------
-(void)dealloc
- (NSTimeInterval)currentTime
{ {
[self closeAudioFile]; NSTimeInterval currentTime = 0.0;
NSTimeInterval duration = [self duration];
if (duration != 0.0)
{
currentTime = (NSTimeInterval)[EZAudioUtilities MAP:(float)[self frameIndex]
leftMin:0.0f
leftMax:(float)[self totalFrames]
rightMin:0.0f
rightMax:duration];
}
return currentTime;
}
//------------------------------------------------------------------------------
- (NSTimeInterval)duration
{
NSTimeInterval frames = (NSTimeInterval)[self totalFrames];
return (NSTimeInterval) frames / self.info->fileFormat.mSampleRate;
}
//------------------------------------------------------------------------------
- (AudioStreamBasicDescription)fileFormat
{
return self.info->fileFormat;
}
//------------------------------------------------------------------------------
- (NSString *)formattedCurrentTime
{
return [EZAudioUtilities displayTimeStringFromSeconds:[self currentTime]];
}
//------------------------------------------------------------------------------
- (NSString *)formattedDuration
{
return [EZAudioUtilities displayTimeStringFromSeconds:[self duration]];
}
//------------------------------------------------------------------------------
- (SInt64)frameIndex
{
SInt64 frameIndex;
[EZAudioUtilities checkResult:ExtAudioFileTell(self.info->extAudioFileRef,
&frameIndex)
operation:"Failed to get frame index"];
return frameIndex;
}
//------------------------------------------------------------------------------
- (SInt64)totalFrames
{
SInt64 totalFrames;
UInt32 propSize = sizeof(SInt64);
[EZAudioUtilities checkResult:ExtAudioFileGetProperty(self.info->extAudioFileRef,
kExtAudioFileProperty_FileLengthFrames,
&propSize,
&totalFrames)
operation:"Recorder failed to get total frames."];
return totalFrames;
}
//------------------------------------------------------------------------------
- (NSURL *)url
{
return (__bridge NSURL*)self.info->fileURL;
}
//------------------------------------------------------------------------------
#pragma mark - Setters
//------------------------------------------------------------------------------
- (void)setClientFormat:(AudioStreamBasicDescription)clientFormat
{
[EZAudioUtilities checkResult:ExtAudioFileSetProperty(self.info->extAudioFileRef,
kExtAudioFileProperty_ClientDataFormat,
sizeof(clientFormat),
&clientFormat)
operation:"Failed to set client format on recorded audio file"];
self.info->clientFormat = clientFormat;
} }
@end @end
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7702" systemVersion="14C109" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<deployment identifier="macosx"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7702"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7706"/>
</dependencies> </dependencies>
<objects> <objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication"> <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
@@ -648,7 +648,8 @@
</items> </items>
</menu> </menu>
<window title="EZAudioCoreGraphicsWaveformExample" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="371"> <window title="EZAudioCoreGraphicsWaveformExample" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="371">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/> <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES" fullSizeContentView="YES"/>
<windowCollectionBehavior key="collectionBehavior" fullScreenPrimary="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="335" y="390" width="480" height="360"/> <rect key="contentRect" x="335" y="390" width="480" height="360"/>
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="877"/> <rect key="screenRect" x="0.0" y="0.0" width="1440" height="877"/>
@@ -57,6 +57,11 @@
*/ */
@property (nonatomic, weak) IBOutlet NSPopUpButton *microphoneInputChannelPopUpButton; @property (nonatomic, weak) IBOutlet NSPopUpButton *microphoneInputChannelPopUpButton;
/**
The checkbox button used to turn the microphone off/on
*/
@property (nonatomic, weak) IBOutlet NSButton *microphoneSwitch;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#pragma mark - Actions #pragma mark - Actions
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@@ -240,4 +240,25 @@ withNumberOfChannels:(UInt32)numberOfChannels
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
- (void)microphone:(EZMicrophone *)microphone changedPlayingState:(BOOL)isPlaying
{
NSString *title = isPlaying ? @"Microphone On" : @"Microphone Off";
[self setTitle:title forButton:self.microphoneSwitch];
}
//------------------------------------------------------------------------------
#pragma mark - Utility
//------------------------------------------------------------------------------
- (void)setTitle:(NSString *)title forButton:(NSButton *)button
{
NSDictionary *attributes = @{ NSForegroundColorAttributeName : [NSColor whiteColor] };
NSAttributedString *attributedTitle = [[NSAttributedString alloc] initWithString:title
attributes:attributes];
button.attributedTitle = attributedTitle;
button.attributedAlternateTitle = attributedTitle;
}
//------------------------------------------------------------------------------
@end @end
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7702" systemVersion="14C109" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<deployment version="1070" identifier="macosx"/> <deployment version="1070" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7702"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7706"/>
</dependencies> </dependencies>
<objects> <objects>
<customObject id="-2" userLabel="File's Owner" customClass="CoreGraphicsWaveformViewController"> <customObject id="-2" userLabel="File's Owner" customClass="CoreGraphicsWaveformViewController">
@@ -10,6 +10,7 @@
<outlet property="audioPlot" destination="wpL-Ou-GSb" id="OME-Hf-I27"/> <outlet property="audioPlot" destination="wpL-Ou-GSb" id="OME-Hf-I27"/>
<outlet property="microphoneInputChannelPopUpButton" destination="Yi6-fS-Cob" id="pLg-4c-klV"/> <outlet property="microphoneInputChannelPopUpButton" destination="Yi6-fS-Cob" id="pLg-4c-klV"/>
<outlet property="microphoneInputPopUpButton" destination="SjR-qx-mWV" id="NuN-SS-ESg"/> <outlet property="microphoneInputPopUpButton" destination="SjR-qx-mWV" id="NuN-SS-ESg"/>
<outlet property="microphoneSwitch" destination="kAI-gs-c31" id="ADZ-Fg-aCN"/>
<outlet property="view" destination="wpL-Ou-GSb" id="oxJ-iT-SKO"/> <outlet property="view" destination="wpL-Ou-GSb" id="oxJ-iT-SKO"/>
</connections> </connections>
</customObject> </customObject>
@@ -83,7 +84,7 @@
<rect key="frame" x="18" y="43" width="36" height="17"/> <rect key="frame" x="18" y="43" width="36" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Input" id="Png-Pk-fMc"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Input" id="Png-Pk-fMc">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
@@ -91,7 +92,7 @@
<rect key="frame" x="204" y="43" width="55" height="17"/> <rect key="frame" x="204" y="43" width="55" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Channel" id="lkh-zp-WCY"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Channel" id="lkh-zp-WCY">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
@@ -111,7 +112,7 @@
<constraint firstItem="SjR-qx-mWV" firstAttribute="top" secondItem="fi6-Uh-bvr" secondAttribute="bottom" constant="5" id="qkS-wp-O0d"/> <constraint firstItem="SjR-qx-mWV" firstAttribute="top" secondItem="fi6-Uh-bvr" secondAttribute="bottom" constant="5" id="qkS-wp-O0d"/>
<constraint firstAttribute="trailing" secondItem="HTa-6n-EPo" secondAttribute="trailing" constant="20" id="rGZ-5W-ZDN"/> <constraint firstAttribute="trailing" secondItem="HTa-6n-EPo" secondAttribute="trailing" constant="20" id="rGZ-5W-ZDN"/>
</constraints> </constraints>
<point key="canvasLocation" x="178" y="314"/> <point key="canvasLocation" x="226" y="324"/>
</customView> </customView>
</objects> </objects>
</document> </document>
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5053" systemVersion="13C64" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5053"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7706"/>
</dependencies> </dependencies>
<objects> <objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication"> <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
@@ -10,7 +11,7 @@
</connections> </connections>
</customObject> </customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application"/> <customObject id="-3" userLabel="Application" customClass="NSObject"/>
<menu title="AMainMenu" systemMenu="main" id="29"> <menu title="AMainMenu" systemMenu="main" id="29">
<items> <items>
<menuItem title="EZAudioFFTExample" id="56"> <menuItem title="EZAudioFFTExample" id="56">
@@ -647,10 +648,10 @@
</items> </items>
</menu> </menu>
<window title="EZAudioFFTExample" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="371"> <window title="EZAudioFFTExample" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="371">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/> <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES" fullSizeContentView="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="335" y="390" width="480" height="360"/> <rect key="contentRect" x="335" y="390" width="480" height="360"/>
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="878"/> <rect key="screenRect" x="0.0" y="0.0" width="1440" height="877"/>
<view key="contentView" id="372"> <view key="contentView" id="372">
<rect key="frame" x="0.0" y="0.0" width="480" height="360"/> <rect key="frame" x="0.0" y="0.0" width="480" height="360"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
@@ -1,100 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="4439" systemVersion="13A451" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4439"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7706"/>
</dependencies> </dependencies>
<objects> <objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication"> <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
<connections> <connections>
<action selector="orderFrontStandardAboutPanel:" destination="58" id="142"/>
<outlet property="delegate" destination="494" id="495"/> <outlet property="delegate" destination="494" id="495"/>
</connections> </connections>
</customObject> </customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"> <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<connections> <customObject id="-3" userLabel="Application" customClass="NSObject"/>
<action selector="alignCenter:" destination="499" id="518"/>
<action selector="alignJustified:" destination="500" id="523"/>
<action selector="alignLeft:" destination="498" id="524"/>
<action selector="alignRight:" destination="501" id="521"/>
<action selector="arrangeInFront:" destination="5" id="39"/>
<action selector="capitalizeWord:" destination="466" id="467"/>
<action selector="centerSelectionInVisibleArea:" destination="210" id="245"/>
<action selector="checkSpelling:" destination="201" id="225"/>
<action selector="clearRecentDocuments:" destination="126" id="127"/>
<action selector="copy:" destination="197" id="224"/>
<action selector="copyFont:" destination="403" id="428"/>
<action selector="copyRuler:" destination="506" id="522"/>
<action selector="cut:" destination="199" id="228"/>
<action selector="delete:" destination="202" id="235"/>
<action selector="hide:" destination="134" id="367"/>
<action selector="hideOtherApplications:" destination="145" id="368"/>
<action selector="loosenKerning:" destination="419" id="435"/>
<action selector="lowerBaseline:" destination="410" id="427"/>
<action selector="lowercaseWord:" destination="465" id="468"/>
<action selector="makeBaseWritingDirectionLeftToRight:" destination="511" id="526"/>
<action selector="makeBaseWritingDirectionNatural:" destination="510" id="525"/>
<action selector="makeBaseWritingDirectionRightToLeft:" destination="512" id="527"/>
<action selector="makeTextWritingDirectionLeftToRight:" destination="516" id="529"/>
<action selector="makeTextWritingDirectionNatural:" destination="515" id="528"/>
<action selector="makeTextWritingDirectionRightToLeft:" destination="517" id="530"/>
<action selector="newDocument:" destination="82" id="373"/>
<action selector="openDocument:" destination="72" id="374"/>
<action selector="orderFrontColorPanel:" destination="401" id="433"/>
<action selector="orderFrontSubstitutionsPanel:" destination="457" id="458"/>
<action selector="paste:" destination="203" id="226"/>
<action selector="pasteAsPlainText:" destination="485" id="486"/>
<action selector="pasteFont:" destination="404" id="436"/>
<action selector="pasteRuler:" destination="507" id="519"/>
<action selector="performClose:" destination="73" id="193"/>
<action selector="performFindPanelAction:" destination="209" id="241"/>
<action selector="performFindPanelAction:" destination="208" id="487"/>
<action selector="performFindPanelAction:" destination="213" id="488"/>
<action selector="performFindPanelAction:" destination="221" id="489"/>
<action selector="performFindPanelAction:" destination="534" id="535"/>
<action selector="performMiniaturize:" destination="23" id="37"/>
<action selector="performZoom:" destination="239" id="240"/>
<action selector="print:" destination="78" id="86"/>
<action selector="raiseBaseline:" destination="409" id="426"/>
<action selector="redo:" destination="215" id="231"/>
<action selector="revertDocumentToSaved:" destination="112" id="364"/>
<action selector="runPageLayout:" destination="77" id="87"/>
<action selector="runToolbarCustomizationPalette:" destination="298" id="365"/>
<action selector="saveDocument:" destination="75" id="362"/>
<action selector="selectAll:" destination="198" id="232"/>
<action selector="showGuessPanel:" destination="204" id="230"/>
<action selector="showHelp:" destination="492" id="493"/>
<action selector="startSpeaking:" destination="196" id="233"/>
<action selector="stopSpeaking:" destination="195" id="227"/>
<action selector="subscript:" destination="408" id="429"/>
<action selector="superscript:" destination="407" id="430"/>
<action selector="tightenKerning:" destination="418" id="431"/>
<action selector="toggleAutomaticDashSubstitution:" destination="460" id="461"/>
<action selector="toggleAutomaticLinkDetection:" destination="354" id="357"/>
<action selector="toggleAutomaticQuoteSubstitution:" destination="351" id="356"/>
<action selector="toggleAutomaticSpellingCorrection:" destination="454" id="456"/>
<action selector="toggleAutomaticTextReplacement:" destination="462" id="463"/>
<action selector="toggleContinuousSpellChecking:" destination="219" id="222"/>
<action selector="toggleGrammarChecking:" destination="346" id="347"/>
<action selector="toggleRuler:" destination="505" id="520"/>
<action selector="toggleSmartInsertDelete:" destination="350" id="355"/>
<action selector="toggleToolbarShown:" destination="297" id="366"/>
<action selector="turnOffKerning:" destination="417" id="441"/>
<action selector="turnOffLigatures:" destination="413" id="440"/>
<action selector="underline:" destination="392" id="432"/>
<action selector="undo:" destination="207" id="223"/>
<action selector="unhideAllApplications:" destination="150" id="370"/>
<action selector="unscript:" destination="406" id="437"/>
<action selector="uppercaseWord:" destination="452" id="464"/>
<action selector="useAllLigatures:" destination="414" id="434"/>
<action selector="useStandardKerning:" destination="416" id="438"/>
<action selector="useStandardLigatures:" destination="412" id="439"/>
</connections>
</customObject>
<customObject id="-3" userLabel="Application">
<connections>
<action selector="terminate:" destination="136" id="449"/>
</connections>
</customObject>
<menu title="AMainMenu" systemMenu="main" id="29"> <menu title="AMainMenu" systemMenu="main" id="29">
<items> <items>
<menuItem title="EZAudioOpenGLWaveformExample" id="56"> <menuItem title="EZAudioOpenGLWaveformExample" id="56">
@@ -102,6 +19,9 @@
<items> <items>
<menuItem title="About EZAudioOpenGLWaveformExample" id="58"> <menuItem title="About EZAudioOpenGLWaveformExample" id="58">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="-2" id="142"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="236"> <menuItem isSeparatorItem="YES" id="236">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
@@ -116,95 +36,211 @@
<menuItem isSeparatorItem="YES" id="144"> <menuItem isSeparatorItem="YES" id="144">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Hide EZAudioOpenGLWaveformExample" keyEquivalent="h" id="134"/> <menuItem title="Hide EZAudioOpenGLWaveformExample" keyEquivalent="h" id="134">
<connections>
<action selector="hide:" target="-1" id="367"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="145"> <menuItem title="Hide Others" keyEquivalent="h" id="145">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="-1" id="368"/>
</connections>
</menuItem>
<menuItem title="Show All" id="150">
<connections>
<action selector="unhideAllApplications:" target="-1" id="370"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Show All" id="150"/>
<menuItem isSeparatorItem="YES" id="149"> <menuItem isSeparatorItem="YES" id="149">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Quit EZAudioOpenGLWaveformExample" keyEquivalent="q" id="136"/> <menuItem title="Quit EZAudioOpenGLWaveformExample" keyEquivalent="q" id="136">
<connections>
<action selector="terminate:" target="-3" id="449"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem title="File" id="83"> <menuItem title="File" id="83">
<menu key="submenu" title="File" id="81"> <menu key="submenu" title="File" id="81">
<items> <items>
<menuItem title="New" keyEquivalent="n" id="82"/> <menuItem title="New" keyEquivalent="n" id="82">
<menuItem title="Open…" keyEquivalent="o" id="72"/> <connections>
<action selector="newDocument:" target="-1" id="373"/>
</connections>
</menuItem>
<menuItem title="Open…" keyEquivalent="o" id="72">
<connections>
<action selector="openDocument:" target="-1" id="374"/>
</connections>
</menuItem>
<menuItem title="Open Recent" id="124"> <menuItem title="Open Recent" id="124">
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="125"> <menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="125">
<items> <items>
<menuItem title="Clear Menu" id="126"/> <menuItem title="Clear Menu" id="126">
<connections>
<action selector="clearRecentDocuments:" target="-1" id="127"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="79"> <menuItem isSeparatorItem="YES" id="79">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Close" keyEquivalent="w" id="73"/> <menuItem title="Close" keyEquivalent="w" id="73">
<menuItem title="Save…" keyEquivalent="s" id="75"/> <connections>
<action selector="performClose:" target="-1" id="193"/>
</connections>
</menuItem>
<menuItem title="Save…" keyEquivalent="s" id="75">
<connections>
<action selector="saveDocument:" target="-1" id="362"/>
</connections>
</menuItem>
<menuItem title="Revert to Saved" id="112"> <menuItem title="Revert to Saved" id="112">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="revertDocumentToSaved:" target="-1" id="364"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="74"> <menuItem isSeparatorItem="YES" id="74">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Page Setup..." keyEquivalent="P" id="77"> <menuItem title="Page Setup..." keyEquivalent="P" id="77">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="runPageLayout:" target="-1" id="87"/>
</connections>
</menuItem>
<menuItem title="Print…" keyEquivalent="p" id="78">
<connections>
<action selector="print:" target="-1" id="86"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Print…" keyEquivalent="p" id="78"/>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem title="Edit" id="217"> <menuItem title="Edit" id="217">
<menu key="submenu" title="Edit" id="205"> <menu key="submenu" title="Edit" id="205">
<items> <items>
<menuItem title="Undo" keyEquivalent="z" id="207"/> <menuItem title="Undo" keyEquivalent="z" id="207">
<connections>
<action selector="undo:" target="-1" id="223"/>
</connections>
</menuItem>
<menuItem title="Redo" keyEquivalent="Z" id="215"> <menuItem title="Redo" keyEquivalent="Z" id="215">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="redo:" target="-1" id="231"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="206"> <menuItem isSeparatorItem="YES" id="206">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Cut" keyEquivalent="x" id="199"/> <menuItem title="Cut" keyEquivalent="x" id="199">
<menuItem title="Copy" keyEquivalent="c" id="197"/> <connections>
<menuItem title="Paste" keyEquivalent="v" id="203"/> <action selector="cut:" target="-1" id="228"/>
</connections>
</menuItem>
<menuItem title="Copy" keyEquivalent="c" id="197">
<connections>
<action selector="copy:" target="-1" id="224"/>
</connections>
</menuItem>
<menuItem title="Paste" keyEquivalent="v" id="203">
<connections>
<action selector="paste:" target="-1" id="226"/>
</connections>
</menuItem>
<menuItem title="Paste and Match Style" keyEquivalent="V" id="485"> <menuItem title="Paste and Match Style" keyEquivalent="V" id="485">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteAsPlainText:" target="-1" id="486"/>
</connections>
</menuItem>
<menuItem title="Delete" id="202">
<connections>
<action selector="delete:" target="-1" id="235"/>
</connections>
</menuItem>
<menuItem title="Select All" keyEquivalent="a" id="198">
<connections>
<action selector="selectAll:" target="-1" id="232"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Delete" id="202"/>
<menuItem title="Select All" keyEquivalent="a" id="198"/>
<menuItem isSeparatorItem="YES" id="214"> <menuItem isSeparatorItem="YES" id="214">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Find" id="218"> <menuItem title="Find" id="218">
<menu key="submenu" title="Find" id="220"> <menu key="submenu" title="Find" id="220">
<items> <items>
<menuItem title="Find…" tag="1" keyEquivalent="f" id="209"/> <menuItem title="Find…" tag="1" keyEquivalent="f" id="209">
<connections>
<action selector="performFindPanelAction:" target="-1" id="241"/>
</connections>
</menuItem>
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="534"> <menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="534">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="-1" id="535"/>
</connections>
</menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="208">
<connections>
<action selector="performFindPanelAction:" target="-1" id="487"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="208"/>
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="213"> <menuItem title="Find Previous" tag="3" keyEquivalent="G" id="213">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="-1" id="488"/>
</connections>
</menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="221">
<connections>
<action selector="performFindPanelAction:" target="-1" id="489"/>
</connections>
</menuItem>
<menuItem title="Jump to Selection" keyEquivalent="j" id="210">
<connections>
<action selector="centerSelectionInVisibleArea:" target="-1" id="245"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="221"/>
<menuItem title="Jump to Selection" keyEquivalent="j" id="210"/>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem title="Spelling and Grammar" id="216"> <menuItem title="Spelling and Grammar" id="216">
<menu key="submenu" title="Spelling and Grammar" id="200"> <menu key="submenu" title="Spelling and Grammar" id="200">
<items> <items>
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="204"/> <menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="204">
<menuItem title="Check Document Now" keyEquivalent=";" id="201"/> <connections>
<action selector="showGuessPanel:" target="-1" id="230"/>
</connections>
</menuItem>
<menuItem title="Check Document Now" keyEquivalent=";" id="201">
<connections>
<action selector="checkSpelling:" target="-1" id="225"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="453"/> <menuItem isSeparatorItem="YES" id="453"/>
<menuItem title="Check Spelling While Typing" id="219"/> <menuItem title="Check Spelling While Typing" id="219">
<menuItem title="Check Grammar With Spelling" id="346"/> <connections>
<action selector="toggleContinuousSpellChecking:" target="-1" id="222"/>
</connections>
</menuItem>
<menuItem title="Check Grammar With Spelling" id="346">
<connections>
<action selector="toggleGrammarChecking:" target="-1" id="347"/>
</connections>
</menuItem>
<menuItem title="Correct Spelling Automatically" id="454"> <menuItem title="Correct Spelling Automatically" id="454">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticSpellingCorrection:" target="-1" id="456"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -214,18 +250,38 @@
<items> <items>
<menuItem title="Show Substitutions" id="457"> <menuItem title="Show Substitutions" id="457">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontSubstitutionsPanel:" target="-1" id="458"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="459"/> <menuItem isSeparatorItem="YES" id="459"/>
<menuItem title="Smart Copy/Paste" tag="1" keyEquivalent="f" id="350"/> <menuItem title="Smart Copy/Paste" tag="1" keyEquivalent="f" id="350">
<menuItem title="Smart Quotes" tag="2" keyEquivalent="g" id="351"/> <connections>
<action selector="toggleSmartInsertDelete:" target="-1" id="355"/>
</connections>
</menuItem>
<menuItem title="Smart Quotes" tag="2" keyEquivalent="g" id="351">
<connections>
<action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="356"/>
</connections>
</menuItem>
<menuItem title="Smart Dashes" id="460"> <menuItem title="Smart Dashes" id="460">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDashSubstitution:" target="-1" id="461"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Smart Links" tag="3" keyEquivalent="G" id="354"> <menuItem title="Smart Links" tag="3" keyEquivalent="G" id="354">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="toggleAutomaticLinkDetection:" target="-1" id="357"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Text Replacement" id="462"> <menuItem title="Text Replacement" id="462">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticTextReplacement:" target="-1" id="463"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -236,12 +292,21 @@
<items> <items>
<menuItem title="Make Upper Case" id="452"> <menuItem title="Make Upper Case" id="452">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="uppercaseWord:" target="-1" id="464"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Make Lower Case" id="465"> <menuItem title="Make Lower Case" id="465">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowercaseWord:" target="-1" id="468"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Capitalize" id="466"> <menuItem title="Capitalize" id="466">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="capitalizeWord:" target="-1" id="467"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -249,8 +314,16 @@
<menuItem title="Speech" id="211"> <menuItem title="Speech" id="211">
<menu key="submenu" title="Speech" id="212"> <menu key="submenu" title="Speech" id="212">
<items> <items>
<menuItem title="Start Speaking" id="196"/> <menuItem title="Start Speaking" id="196">
<menuItem title="Stop Speaking" id="195"/> <connections>
<action selector="startSpeaking:" target="-1" id="233"/>
</connections>
</menuItem>
<menuItem title="Stop Speaking" id="195">
<connections>
<action selector="stopSpeaking:" target="-1" id="227"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
@@ -265,13 +338,37 @@
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Font" systemMenu="font" id="388"> <menu key="submenu" title="Font" systemMenu="font" id="388">
<items> <items>
<menuItem title="Show Fonts" keyEquivalent="t" id="389"/> <menuItem title="Show Fonts" keyEquivalent="t" id="389">
<menuItem title="Bold" tag="2" keyEquivalent="b" id="390"/> <connections>
<menuItem title="Italic" tag="1" keyEquivalent="i" id="391"/> <action selector="orderFrontFontPanel:" target="420" id="424"/>
<menuItem title="Underline" keyEquivalent="u" id="392"/> </connections>
</menuItem>
<menuItem title="Bold" tag="2" keyEquivalent="b" id="390">
<connections>
<action selector="addFontTrait:" target="420" id="421"/>
</connections>
</menuItem>
<menuItem title="Italic" tag="1" keyEquivalent="i" id="391">
<connections>
<action selector="addFontTrait:" target="420" id="422"/>
</connections>
</menuItem>
<menuItem title="Underline" keyEquivalent="u" id="392">
<connections>
<action selector="underline:" target="-1" id="432"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="393"/> <menuItem isSeparatorItem="YES" id="393"/>
<menuItem title="Bigger" tag="3" keyEquivalent="+" id="394"/> <menuItem title="Bigger" tag="3" keyEquivalent="+" id="394">
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="395"/> <connections>
<action selector="modifyFont:" target="420" id="425"/>
</connections>
</menuItem>
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="395">
<connections>
<action selector="modifyFont:" target="420" id="423"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="396"/> <menuItem isSeparatorItem="YES" id="396"/>
<menuItem title="Kern" id="397"> <menuItem title="Kern" id="397">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
@@ -279,15 +376,27 @@
<items> <items>
<menuItem title="Use Default" id="416"> <menuItem title="Use Default" id="416">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardKerning:" target="-1" id="438"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Use None" id="417"> <menuItem title="Use None" id="417">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffKerning:" target="-1" id="441"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Tighten" id="418"> <menuItem title="Tighten" id="418">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="tightenKerning:" target="-1" id="431"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Loosen" id="419"> <menuItem title="Loosen" id="419">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="loosenKerning:" target="-1" id="435"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -298,12 +407,21 @@
<items> <items>
<menuItem title="Use Default" id="412"> <menuItem title="Use Default" id="412">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardLigatures:" target="-1" id="439"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Use None" id="413"> <menuItem title="Use None" id="413">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffLigatures:" target="-1" id="440"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Use All" id="414"> <menuItem title="Use All" id="414">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useAllLigatures:" target="-1" id="434"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -314,30 +432,55 @@
<items> <items>
<menuItem title="Use Default" id="406"> <menuItem title="Use Default" id="406">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unscript:" target="-1" id="437"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Superscript" id="407"> <menuItem title="Superscript" id="407">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="superscript:" target="-1" id="430"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Subscript" id="408"> <menuItem title="Subscript" id="408">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="subscript:" target="-1" id="429"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Raise" id="409"> <menuItem title="Raise" id="409">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="raiseBaseline:" target="-1" id="426"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Lower" id="410"> <menuItem title="Lower" id="410">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowerBaseline:" target="-1" id="427"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="400"/> <menuItem isSeparatorItem="YES" id="400"/>
<menuItem title="Show Colors" keyEquivalent="C" id="401"/> <menuItem title="Show Colors" keyEquivalent="C" id="401">
<connections>
<action selector="orderFrontColorPanel:" target="-1" id="433"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="402"/> <menuItem isSeparatorItem="YES" id="402"/>
<menuItem title="Copy Style" keyEquivalent="c" id="403"> <menuItem title="Copy Style" keyEquivalent="c" id="403">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="copyFont:" target="-1" id="428"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Paste Style" keyEquivalent="v" id="404"> <menuItem title="Paste Style" keyEquivalent="v" id="404">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteFont:" target="-1" id="436"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -346,12 +489,27 @@
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Text" id="497"> <menu key="submenu" title="Text" id="497">
<items> <items>
<menuItem title="Align Left" keyEquivalent="{" id="498"/> <menuItem title="Align Left" keyEquivalent="{" id="498">
<menuItem title="Center" keyEquivalent="|" id="499"/> <connections>
<action selector="alignLeft:" target="-1" id="524"/>
</connections>
</menuItem>
<menuItem title="Center" keyEquivalent="|" id="499">
<connections>
<action selector="alignCenter:" target="-1" id="518"/>
</connections>
</menuItem>
<menuItem title="Justify" id="500"> <menuItem title="Justify" id="500">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="alignJustified:" target="-1" id="523"/>
</connections>
</menuItem>
<menuItem title="Align Right" keyEquivalent="}" id="501">
<connections>
<action selector="alignRight:" target="-1" id="521"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Align Right" keyEquivalent="}" id="501"/>
<menuItem isSeparatorItem="YES" id="502"/> <menuItem isSeparatorItem="YES" id="502"/>
<menuItem title="Writing Direction" id="503"> <menuItem title="Writing Direction" id="503">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
@@ -363,14 +521,23 @@
<menuItem id="510"> <menuItem id="510">
<string key="title"> Default</string> <string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionNatural:" target="-1" id="525"/>
</connections>
</menuItem> </menuItem>
<menuItem id="511"> <menuItem id="511">
<string key="title"> Left to Right</string> <string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionLeftToRight:" target="-1" id="526"/>
</connections>
</menuItem> </menuItem>
<menuItem id="512"> <menuItem id="512">
<string key="title"> Right to Left</string> <string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionRightToLeft:" target="-1" id="527"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="513"/> <menuItem isSeparatorItem="YES" id="513"/>
<menuItem title="Selection" enabled="NO" id="514"> <menuItem title="Selection" enabled="NO" id="514">
@@ -379,14 +546,23 @@
<menuItem id="515"> <menuItem id="515">
<string key="title"> Default</string> <string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionNatural:" target="-1" id="528"/>
</connections>
</menuItem> </menuItem>
<menuItem id="516"> <menuItem id="516">
<string key="title"> Left to Right</string> <string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionLeftToRight:" target="-1" id="529"/>
</connections>
</menuItem> </menuItem>
<menuItem id="517"> <menuItem id="517">
<string key="title"> Right to Left</string> <string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionRightToLeft:" target="-1" id="530"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -394,12 +570,21 @@
<menuItem isSeparatorItem="YES" id="504"/> <menuItem isSeparatorItem="YES" id="504"/>
<menuItem title="Show Ruler" id="505"> <menuItem title="Show Ruler" id="505">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleRuler:" target="-1" id="520"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Copy Ruler" keyEquivalent="c" id="506"> <menuItem title="Copy Ruler" keyEquivalent="c" id="506">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="copyRuler:" target="-1" id="522"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Paste Ruler" keyEquivalent="v" id="507"> <menuItem title="Paste Ruler" keyEquivalent="v" id="507">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="pasteRuler:" target="-1" id="519"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -412,20 +597,39 @@
<items> <items>
<menuItem title="Show Toolbar" keyEquivalent="t" id="297"> <menuItem title="Show Toolbar" keyEquivalent="t" id="297">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="toggleToolbarShown:" target="-1" id="366"/>
</connections>
</menuItem>
<menuItem title="Customize Toolbar…" id="298">
<connections>
<action selector="runToolbarCustomizationPalette:" target="-1" id="365"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Customize Toolbar…" id="298"/>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem title="Window" id="19"> <menuItem title="Window" id="19">
<menu key="submenu" title="Window" systemMenu="window" id="24"> <menu key="submenu" title="Window" systemMenu="window" id="24">
<items> <items>
<menuItem title="Minimize" keyEquivalent="m" id="23"/> <menuItem title="Minimize" keyEquivalent="m" id="23">
<menuItem title="Zoom" id="239"/> <connections>
<action selector="performMiniaturize:" target="-1" id="37"/>
</connections>
</menuItem>
<menuItem title="Zoom" id="239">
<connections>
<action selector="performZoom:" target="-1" id="240"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="92"> <menuItem isSeparatorItem="YES" id="92">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Bring All to Front" id="5"/> <menuItem title="Bring All to Front" id="5">
<connections>
<action selector="arrangeInFront:" target="-1" id="39"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
@@ -433,17 +637,22 @@
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="491"> <menu key="submenu" title="Help" systemMenu="help" id="491">
<items> <items>
<menuItem title="EZAudioOpenGLWaveformExample Help" keyEquivalent="?" id="492"/> <menuItem title="EZAudioOpenGLWaveformExample Help" keyEquivalent="?" id="492">
<connections>
<action selector="showHelp:" target="-1" id="493"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
<window title="EZAudioOpenGLWaveformExample" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="371"> <window title="EZAudioOpenGLWaveformExample" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="371">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/> <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES" fullSizeContentView="YES"/>
<windowCollectionBehavior key="collectionBehavior" fullScreenPrimary="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="335" y="390" width="480" height="360"/> <rect key="contentRect" x="335" y="390" width="480" height="360"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1418"/> <rect key="screenRect" x="0.0" y="0.0" width="1440" height="877"/>
<view key="contentView" id="372"> <view key="contentView" id="372">
<rect key="frame" x="0.0" y="0.0" width="480" height="360"/> <rect key="frame" x="0.0" y="0.0" width="480" height="360"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
@@ -454,14 +663,6 @@
<outlet property="window" destination="371" id="532"/> <outlet property="window" destination="371" id="532"/>
</connections> </connections>
</customObject> </customObject>
<customObject id="420" customClass="NSFontManager"> <customObject id="420" customClass="NSFontManager"/>
<connections>
<action selector="addFontTrait:" destination="390" id="421"/>
<action selector="addFontTrait:" destination="391" id="422"/>
<action selector="modifyFont:" destination="395" id="423"/>
<action selector="modifyFont:" destination="394" id="425"/>
<action selector="orderFrontFontPanel:" destination="389" id="424"/>
</connections>
</customObject>
</objects> </objects>
</document> </document>
@@ -61,6 +61,11 @@
*/ */
@property (nonatomic, weak) IBOutlet NSPopUpButton *microphoneInputChannelPopUpButton; @property (nonatomic, weak) IBOutlet NSPopUpButton *microphoneInputChannelPopUpButton;
/**
The checkbox button used to turn the microphone off/on
*/
@property (nonatomic, weak) IBOutlet NSButton *microphoneSwitch;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#pragma mark - Actions #pragma mark - Actions
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@@ -226,8 +226,7 @@ withNumberOfChannels:(UInt32)numberOfChannels
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
- (void)microphone:(EZMicrophone *)microphone - (void)microphone:(EZMicrophone *)microphone changedDevice:(EZAudioDevice *)device
changedDevice:(EZAudioDevice *)device
{ {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
// //
@@ -246,4 +245,25 @@ withNumberOfChannels:(UInt32)numberOfChannels
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
- (void)microphone:(EZMicrophone *)microphone changedPlayingState:(BOOL)isPlaying
{
NSString *title = isPlaying ? @"Microphone On" : @"Microphone Off";
[self setTitle:title forButton:self.microphoneSwitch];
}
//------------------------------------------------------------------------------
#pragma mark - Utility
//------------------------------------------------------------------------------
- (void)setTitle:(NSString *)title forButton:(NSButton *)button
{
NSDictionary *attributes = @{ NSForegroundColorAttributeName : [NSColor whiteColor] };
NSAttributedString *attributedTitle = [[NSAttributedString alloc] initWithString:title
attributes:attributes];
button.attributedTitle = attributedTitle;
button.attributedAlternateTitle = attributedTitle;
}
//------------------------------------------------------------------------------
@end @end
@@ -10,6 +10,7 @@
<outlet property="audioPlot" destination="foT-nv-032" id="Baw-Le-z98"/> <outlet property="audioPlot" destination="foT-nv-032" id="Baw-Le-z98"/>
<outlet property="microphoneInputChannelPopUpButton" destination="Usd-lp-n8s" id="FbQ-hj-24k"/> <outlet property="microphoneInputChannelPopUpButton" destination="Usd-lp-n8s" id="FbQ-hj-24k"/>
<outlet property="microphoneInputPopUpButton" destination="wBG-jf-wVy" id="thS-Ur-IMj"/> <outlet property="microphoneInputPopUpButton" destination="wBG-jf-wVy" id="thS-Ur-IMj"/>
<outlet property="microphoneSwitch" destination="TbW-ha-PgJ" id="wEZ-dt-f7t"/>
<outlet property="view" destination="hFn-jA-9Se" id="cfu-I4-qhQ"/> <outlet property="view" destination="hFn-jA-9Se" id="cfu-I4-qhQ"/>
</connections> </connections>
</customObject> </customObject>
@@ -19,104 +20,107 @@
<rect key="frame" x="0.0" y="0.0" width="480" height="272"/> <rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews> <subviews>
<button translatesAutoresizingMaskIntoConstraints="NO" id="TbW-ha-PgJ">
<rect key="frame" x="339" y="44" width="123" height="18"/>
<constraints>
<constraint firstAttribute="width" constant="119" id="xPL-Un-c5O"/>
</constraints>
<buttonCell key="cell" type="check" title="Microphone On" bezelStyle="regularSquare" imagePosition="right" state="on" inset="2" id="DaM-FV-gba">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="toggleMicrophone:" target="-2" id="Zb5-tE-lf2"/>
</connections>
</button>
<segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="UPI-59-15v">
<rect key="frame" x="335" y="15" width="127" height="24"/>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="VRd-fb-9nH">
<font key="font" metaFont="system"/>
<segments>
<segment label="Buffer" selected="YES"/>
<segment label="Rolling" tag="1"/>
</segments>
</segmentedCell>
<connections>
<action selector="changePlotType:" target="-2" id="BMJ-vA-3ce"/>
</connections>
</segmentedControl>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="wBG-jf-wVy" userLabel="microphoneInputPopUpButton">
<rect key="frame" x="18" y="14" width="180" height="26"/>
<constraints>
<constraint firstAttribute="width" constant="175" id="aMw-9p-rHt"/>
</constraints>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="cAL-rs-h1w" id="H5k-ea-wV5">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="15c-sS-jR2">
<items>
<menuItem title="Item 1" state="on" id="cAL-rs-h1w"/>
<menuItem title="Item 2" id="LTz-i3-N0M"/>
<menuItem title="Item 3" id="twD-3N-rcl"/>
</items>
</menu>
</popUpButtonCell>
</popUpButton>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Usd-lp-n8s" userLabel="microphoneInputChannelPopUpButton">
<rect key="frame" x="204" y="14" width="79" height="26"/>
<constraints>
<constraint firstAttribute="width" constant="74" id="oDB-ke-aGz"/>
</constraints>
<popUpButtonCell key="cell" type="push" title="1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="Oit-zz-O9w" id="Eyb-QQ-0bg">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="IPB-NH-My1">
<items>
<menuItem title="1" state="on" id="Oit-zz-O9w"/>
<menuItem title="Item 2" id="v3y-Nn-80j"/>
<menuItem title="Item 3" id="IHk-VR-fPC"/>
</items>
</menu>
</popUpButtonCell>
</popUpButton>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="AuX-d2-dD9">
<rect key="frame" x="18" y="43" width="36" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Input" id="Fq3-tX-8aU">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="PMV-Zt-Wg6">
<rect key="frame" x="204" y="43" width="55" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Channel" id="PTE-g2-mTV">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="foT-nv-032" customClass="EZAudioPlotGL"> <customView translatesAutoresizingMaskIntoConstraints="NO" id="foT-nv-032" customClass="EZAudioPlotGL">
<rect key="frame" x="0.0" y="77" width="480" height="195"/> <rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
<subviews>
<button translatesAutoresizingMaskIntoConstraints="NO" id="TbW-ha-PgJ">
<rect key="frame" x="339" y="47" width="123" height="18"/>
<constraints>
<constraint firstAttribute="width" constant="119" id="xPL-Un-c5O"/>
</constraints>
<buttonCell key="cell" type="check" title="Microphone On" bezelStyle="regularSquare" imagePosition="right" state="on" inset="2" id="DaM-FV-gba">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="toggleMicrophone:" target="-2" id="Zb5-tE-lf2"/>
</connections>
</button>
<segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="UPI-59-15v">
<rect key="frame" x="335" y="18" width="127" height="24"/>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="VRd-fb-9nH">
<font key="font" metaFont="system"/>
<segments>
<segment label="Buffer" selected="YES"/>
<segment label="Rolling" tag="1"/>
</segments>
</segmentedCell>
<connections>
<action selector="changePlotType:" target="-2" id="BMJ-vA-3ce"/>
</connections>
</segmentedControl>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="wBG-jf-wVy" userLabel="microphoneInputPopUpButton">
<rect key="frame" x="18" y="17" width="180" height="26"/>
<constraints>
<constraint firstAttribute="width" constant="175" id="aMw-9p-rHt"/>
</constraints>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="cAL-rs-h1w" id="H5k-ea-wV5">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="15c-sS-jR2">
<items>
<menuItem title="Item 1" state="on" id="cAL-rs-h1w"/>
<menuItem title="Item 2" id="LTz-i3-N0M"/>
<menuItem title="Item 3" id="twD-3N-rcl"/>
</items>
</menu>
</popUpButtonCell>
</popUpButton>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Usd-lp-n8s" userLabel="microphoneInputChannelPopUpButton">
<rect key="frame" x="204" y="17" width="79" height="26"/>
<constraints>
<constraint firstAttribute="width" constant="74" id="oDB-ke-aGz"/>
</constraints>
<popUpButtonCell key="cell" type="push" title="1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="Oit-zz-O9w" id="Eyb-QQ-0bg">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="IPB-NH-My1">
<items>
<menuItem title="1" state="on" id="Oit-zz-O9w"/>
<menuItem title="Item 2" id="v3y-Nn-80j"/>
<menuItem title="Item 3" id="IHk-VR-fPC"/>
</items>
</menu>
</popUpButtonCell>
</popUpButton>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="AuX-d2-dD9">
<rect key="frame" x="18" y="46" width="36" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Input" id="Fq3-tX-8aU">
<font key="font" metaFont="system"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="PMV-Zt-Wg6">
<rect key="frame" x="204" y="46" width="55" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Channel" id="PTE-g2-mTV">
<font key="font" metaFont="system"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="AuX-d2-dD9" firstAttribute="leading" secondItem="foT-nv-032" secondAttribute="leading" constant="20" id="251-JP-6Sa"/>
<constraint firstItem="PMV-Zt-Wg6" firstAttribute="leading" secondItem="AuX-d2-dD9" secondAttribute="trailing" constant="154" id="2EP-1U-pH4"/>
<constraint firstAttribute="bottom" secondItem="wBG-jf-wVy" secondAttribute="bottom" constant="20" id="3kE-rV-Xyk"/>
<constraint firstItem="wBG-jf-wVy" firstAttribute="leading" secondItem="foT-nv-032" secondAttribute="leading" constant="20" id="5BJ-zk-KIK"/>
<constraint firstItem="wBG-jf-wVy" firstAttribute="top" secondItem="AuX-d2-dD9" secondAttribute="bottom" constant="5" id="GPm-pn-f3f"/>
<constraint firstAttribute="bottom" secondItem="UPI-59-15v" secondAttribute="bottom" constant="20" id="NIO-kU-qxG"/>
<constraint firstItem="UPI-59-15v" firstAttribute="top" secondItem="TbW-ha-PgJ" secondAttribute="bottom" constant="8" id="TZN-2g-Vnf"/>
<constraint firstAttribute="trailing" secondItem="TbW-ha-PgJ" secondAttribute="trailing" constant="20" id="mg0-av-TaM"/>
<constraint firstItem="Usd-lp-n8s" firstAttribute="top" secondItem="PMV-Zt-Wg6" secondAttribute="bottom" constant="5" id="nD0-WN-DIk"/>
<constraint firstAttribute="trailing" secondItem="UPI-59-15v" secondAttribute="trailing" constant="20" id="rW1-1W-2K8"/>
<constraint firstItem="Usd-lp-n8s" firstAttribute="leading" secondItem="wBG-jf-wVy" secondAttribute="trailing" constant="11" id="uWS-Ht-6JY"/>
<constraint firstAttribute="bottom" secondItem="Usd-lp-n8s" secondAttribute="bottom" constant="20" id="yZL-HJ-0px"/>
</constraints>
</customView> </customView>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstAttribute="bottom" secondItem="wBG-jf-wVy" secondAttribute="bottom" constant="17" id="39Q-dq-Ifx"/>
<constraint firstAttribute="trailing" secondItem="foT-nv-032" secondAttribute="trailing" id="4QC-HO-oMa"/> <constraint firstAttribute="trailing" secondItem="foT-nv-032" secondAttribute="trailing" id="4QC-HO-oMa"/>
<constraint firstItem="foT-nv-032" firstAttribute="top" secondItem="hFn-jA-9Se" secondAttribute="top" id="5zo-Yc-OKX"/> <constraint firstItem="foT-nv-032" firstAttribute="top" secondItem="hFn-jA-9Se" secondAttribute="top" id="5zo-Yc-OKX"/>
<constraint firstItem="UPI-59-15v" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Usd-lp-n8s" secondAttribute="trailing" constant="11" id="AXw-KY-VEi"/> <constraint firstAttribute="bottom" secondItem="foT-nv-032" secondAttribute="bottom" id="VKs-UL-eU4"/>
<constraint firstItem="Usd-lp-n8s" firstAttribute="top" secondItem="PMV-Zt-Wg6" secondAttribute="bottom" constant="5" id="GZn-x5-gDa"/>
<constraint firstAttribute="trailing" secondItem="UPI-59-15v" secondAttribute="trailing" constant="20" id="Ihi-YB-8cN"/>
<constraint firstItem="AuX-d2-dD9" firstAttribute="leading" secondItem="hFn-jA-9Se" secondAttribute="leading" constant="20" id="RFU-gK-hRd"/>
<constraint firstItem="TbW-ha-PgJ" firstAttribute="top" secondItem="foT-nv-032" secondAttribute="bottom" constant="17" id="aWO-qE-S52"/>
<constraint firstAttribute="bottom" secondItem="UPI-59-15v" secondAttribute="bottom" constant="17" id="biy-0r-WsW"/>
<constraint firstItem="wBG-jf-wVy" firstAttribute="top" secondItem="AuX-d2-dD9" secondAttribute="bottom" constant="5" id="fEE-bx-NVl"/>
<constraint firstItem="UPI-59-15v" firstAttribute="top" secondItem="TbW-ha-PgJ" secondAttribute="bottom" constant="8" id="gMX-Q1-9Ly"/>
<constraint firstAttribute="trailing" secondItem="TbW-ha-PgJ" secondAttribute="trailing" constant="20" id="gek-Wl-IPz"/>
<constraint firstItem="Usd-lp-n8s" firstAttribute="leading" secondItem="wBG-jf-wVy" secondAttribute="trailing" constant="11" id="gqi-4E-1Wf"/>
<constraint firstItem="Usd-lp-n8s" firstAttribute="leading" secondItem="PMV-Zt-Wg6" secondAttribute="leading" id="lT3-RX-en8"/>
<constraint firstItem="foT-nv-032" firstAttribute="leading" secondItem="hFn-jA-9Se" secondAttribute="leading" id="o4A-j4-xiR"/> <constraint firstItem="foT-nv-032" firstAttribute="leading" secondItem="hFn-jA-9Se" secondAttribute="leading" id="o4A-j4-xiR"/>
<constraint firstItem="wBG-jf-wVy" firstAttribute="leading" secondItem="hFn-jA-9Se" secondAttribute="leading" constant="20" id="uyC-v9-bP1"/>
<constraint firstAttribute="bottom" secondItem="Usd-lp-n8s" secondAttribute="bottom" constant="17" id="yk6-Fm-gXu"/>
</constraints> </constraints>
</customView> </customView>
</objects> </objects>
@@ -1,100 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="4439" systemVersion="13A451" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4439"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7706"/>
</dependencies> </dependencies>
<objects> <objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication"> <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
<connections> <connections>
<action selector="orderFrontStandardAboutPanel:" destination="58" id="142"/>
<outlet property="delegate" destination="494" id="495"/> <outlet property="delegate" destination="494" id="495"/>
</connections> </connections>
</customObject> </customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"> <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<connections> <customObject id="-3" userLabel="Application" customClass="NSObject"/>
<action selector="alignCenter:" destination="499" id="518"/>
<action selector="alignJustified:" destination="500" id="523"/>
<action selector="alignLeft:" destination="498" id="524"/>
<action selector="alignRight:" destination="501" id="521"/>
<action selector="arrangeInFront:" destination="5" id="39"/>
<action selector="capitalizeWord:" destination="466" id="467"/>
<action selector="centerSelectionInVisibleArea:" destination="210" id="245"/>
<action selector="checkSpelling:" destination="201" id="225"/>
<action selector="clearRecentDocuments:" destination="126" id="127"/>
<action selector="copy:" destination="197" id="224"/>
<action selector="copyFont:" destination="403" id="428"/>
<action selector="copyRuler:" destination="506" id="522"/>
<action selector="cut:" destination="199" id="228"/>
<action selector="delete:" destination="202" id="235"/>
<action selector="hide:" destination="134" id="367"/>
<action selector="hideOtherApplications:" destination="145" id="368"/>
<action selector="loosenKerning:" destination="419" id="435"/>
<action selector="lowerBaseline:" destination="410" id="427"/>
<action selector="lowercaseWord:" destination="465" id="468"/>
<action selector="makeBaseWritingDirectionLeftToRight:" destination="511" id="526"/>
<action selector="makeBaseWritingDirectionNatural:" destination="510" id="525"/>
<action selector="makeBaseWritingDirectionRightToLeft:" destination="512" id="527"/>
<action selector="makeTextWritingDirectionLeftToRight:" destination="516" id="529"/>
<action selector="makeTextWritingDirectionNatural:" destination="515" id="528"/>
<action selector="makeTextWritingDirectionRightToLeft:" destination="517" id="530"/>
<action selector="newDocument:" destination="82" id="373"/>
<action selector="openDocument:" destination="72" id="374"/>
<action selector="orderFrontColorPanel:" destination="401" id="433"/>
<action selector="orderFrontSubstitutionsPanel:" destination="457" id="458"/>
<action selector="paste:" destination="203" id="226"/>
<action selector="pasteAsPlainText:" destination="485" id="486"/>
<action selector="pasteFont:" destination="404" id="436"/>
<action selector="pasteRuler:" destination="507" id="519"/>
<action selector="performClose:" destination="73" id="193"/>
<action selector="performFindPanelAction:" destination="209" id="241"/>
<action selector="performFindPanelAction:" destination="208" id="487"/>
<action selector="performFindPanelAction:" destination="213" id="488"/>
<action selector="performFindPanelAction:" destination="221" id="489"/>
<action selector="performFindPanelAction:" destination="534" id="535"/>
<action selector="performMiniaturize:" destination="23" id="37"/>
<action selector="performZoom:" destination="239" id="240"/>
<action selector="print:" destination="78" id="86"/>
<action selector="raiseBaseline:" destination="409" id="426"/>
<action selector="redo:" destination="215" id="231"/>
<action selector="revertDocumentToSaved:" destination="112" id="364"/>
<action selector="runPageLayout:" destination="77" id="87"/>
<action selector="runToolbarCustomizationPalette:" destination="298" id="365"/>
<action selector="saveDocument:" destination="75" id="362"/>
<action selector="selectAll:" destination="198" id="232"/>
<action selector="showGuessPanel:" destination="204" id="230"/>
<action selector="showHelp:" destination="492" id="493"/>
<action selector="startSpeaking:" destination="196" id="233"/>
<action selector="stopSpeaking:" destination="195" id="227"/>
<action selector="subscript:" destination="408" id="429"/>
<action selector="superscript:" destination="407" id="430"/>
<action selector="tightenKerning:" destination="418" id="431"/>
<action selector="toggleAutomaticDashSubstitution:" destination="460" id="461"/>
<action selector="toggleAutomaticLinkDetection:" destination="354" id="357"/>
<action selector="toggleAutomaticQuoteSubstitution:" destination="351" id="356"/>
<action selector="toggleAutomaticSpellingCorrection:" destination="454" id="456"/>
<action selector="toggleAutomaticTextReplacement:" destination="462" id="463"/>
<action selector="toggleContinuousSpellChecking:" destination="219" id="222"/>
<action selector="toggleGrammarChecking:" destination="346" id="347"/>
<action selector="toggleRuler:" destination="505" id="520"/>
<action selector="toggleSmartInsertDelete:" destination="350" id="355"/>
<action selector="toggleToolbarShown:" destination="297" id="366"/>
<action selector="turnOffKerning:" destination="417" id="441"/>
<action selector="turnOffLigatures:" destination="413" id="440"/>
<action selector="underline:" destination="392" id="432"/>
<action selector="undo:" destination="207" id="223"/>
<action selector="unhideAllApplications:" destination="150" id="370"/>
<action selector="unscript:" destination="406" id="437"/>
<action selector="uppercaseWord:" destination="452" id="464"/>
<action selector="useAllLigatures:" destination="414" id="434"/>
<action selector="useStandardKerning:" destination="416" id="438"/>
<action selector="useStandardLigatures:" destination="412" id="439"/>
</connections>
</customObject>
<customObject id="-3" userLabel="Application">
<connections>
<action selector="terminate:" destination="136" id="449"/>
</connections>
</customObject>
<menu title="AMainMenu" systemMenu="main" id="29"> <menu title="AMainMenu" systemMenu="main" id="29">
<items> <items>
<menuItem title="EZAudioPassThroughExample" id="56"> <menuItem title="EZAudioPassThroughExample" id="56">
@@ -102,6 +19,9 @@
<items> <items>
<menuItem title="About EZAudioPassThroughExample" id="58"> <menuItem title="About EZAudioPassThroughExample" id="58">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="-2" id="142"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="236"> <menuItem isSeparatorItem="YES" id="236">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
@@ -116,95 +36,211 @@
<menuItem isSeparatorItem="YES" id="144"> <menuItem isSeparatorItem="YES" id="144">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Hide EZAudioPassThroughExample" keyEquivalent="h" id="134"/> <menuItem title="Hide EZAudioPassThroughExample" keyEquivalent="h" id="134">
<connections>
<action selector="hide:" target="-1" id="367"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="145"> <menuItem title="Hide Others" keyEquivalent="h" id="145">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="-1" id="368"/>
</connections>
</menuItem>
<menuItem title="Show All" id="150">
<connections>
<action selector="unhideAllApplications:" target="-1" id="370"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Show All" id="150"/>
<menuItem isSeparatorItem="YES" id="149"> <menuItem isSeparatorItem="YES" id="149">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Quit EZAudioPassThroughExample" keyEquivalent="q" id="136"/> <menuItem title="Quit EZAudioPassThroughExample" keyEquivalent="q" id="136">
<connections>
<action selector="terminate:" target="-3" id="449"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem title="File" id="83"> <menuItem title="File" id="83">
<menu key="submenu" title="File" id="81"> <menu key="submenu" title="File" id="81">
<items> <items>
<menuItem title="New" keyEquivalent="n" id="82"/> <menuItem title="New" keyEquivalent="n" id="82">
<menuItem title="Open…" keyEquivalent="o" id="72"/> <connections>
<action selector="newDocument:" target="-1" id="373"/>
</connections>
</menuItem>
<menuItem title="Open…" keyEquivalent="o" id="72">
<connections>
<action selector="openDocument:" target="-1" id="374"/>
</connections>
</menuItem>
<menuItem title="Open Recent" id="124"> <menuItem title="Open Recent" id="124">
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="125"> <menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="125">
<items> <items>
<menuItem title="Clear Menu" id="126"/> <menuItem title="Clear Menu" id="126">
<connections>
<action selector="clearRecentDocuments:" target="-1" id="127"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="79"> <menuItem isSeparatorItem="YES" id="79">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Close" keyEquivalent="w" id="73"/> <menuItem title="Close" keyEquivalent="w" id="73">
<menuItem title="Save…" keyEquivalent="s" id="75"/> <connections>
<action selector="performClose:" target="-1" id="193"/>
</connections>
</menuItem>
<menuItem title="Save…" keyEquivalent="s" id="75">
<connections>
<action selector="saveDocument:" target="-1" id="362"/>
</connections>
</menuItem>
<menuItem title="Revert to Saved" id="112"> <menuItem title="Revert to Saved" id="112">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="revertDocumentToSaved:" target="-1" id="364"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="74"> <menuItem isSeparatorItem="YES" id="74">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Page Setup..." keyEquivalent="P" id="77"> <menuItem title="Page Setup..." keyEquivalent="P" id="77">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="runPageLayout:" target="-1" id="87"/>
</connections>
</menuItem>
<menuItem title="Print…" keyEquivalent="p" id="78">
<connections>
<action selector="print:" target="-1" id="86"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Print…" keyEquivalent="p" id="78"/>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem title="Edit" id="217"> <menuItem title="Edit" id="217">
<menu key="submenu" title="Edit" id="205"> <menu key="submenu" title="Edit" id="205">
<items> <items>
<menuItem title="Undo" keyEquivalent="z" id="207"/> <menuItem title="Undo" keyEquivalent="z" id="207">
<connections>
<action selector="undo:" target="-1" id="223"/>
</connections>
</menuItem>
<menuItem title="Redo" keyEquivalent="Z" id="215"> <menuItem title="Redo" keyEquivalent="Z" id="215">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="redo:" target="-1" id="231"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="206"> <menuItem isSeparatorItem="YES" id="206">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Cut" keyEquivalent="x" id="199"/> <menuItem title="Cut" keyEquivalent="x" id="199">
<menuItem title="Copy" keyEquivalent="c" id="197"/> <connections>
<menuItem title="Paste" keyEquivalent="v" id="203"/> <action selector="cut:" target="-1" id="228"/>
</connections>
</menuItem>
<menuItem title="Copy" keyEquivalent="c" id="197">
<connections>
<action selector="copy:" target="-1" id="224"/>
</connections>
</menuItem>
<menuItem title="Paste" keyEquivalent="v" id="203">
<connections>
<action selector="paste:" target="-1" id="226"/>
</connections>
</menuItem>
<menuItem title="Paste and Match Style" keyEquivalent="V" id="485"> <menuItem title="Paste and Match Style" keyEquivalent="V" id="485">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteAsPlainText:" target="-1" id="486"/>
</connections>
</menuItem>
<menuItem title="Delete" id="202">
<connections>
<action selector="delete:" target="-1" id="235"/>
</connections>
</menuItem>
<menuItem title="Select All" keyEquivalent="a" id="198">
<connections>
<action selector="selectAll:" target="-1" id="232"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Delete" id="202"/>
<menuItem title="Select All" keyEquivalent="a" id="198"/>
<menuItem isSeparatorItem="YES" id="214"> <menuItem isSeparatorItem="YES" id="214">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Find" id="218"> <menuItem title="Find" id="218">
<menu key="submenu" title="Find" id="220"> <menu key="submenu" title="Find" id="220">
<items> <items>
<menuItem title="Find…" tag="1" keyEquivalent="f" id="209"/> <menuItem title="Find…" tag="1" keyEquivalent="f" id="209">
<connections>
<action selector="performFindPanelAction:" target="-1" id="241"/>
</connections>
</menuItem>
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="534"> <menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="534">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="-1" id="535"/>
</connections>
</menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="208">
<connections>
<action selector="performFindPanelAction:" target="-1" id="487"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="208"/>
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="213"> <menuItem title="Find Previous" tag="3" keyEquivalent="G" id="213">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="-1" id="488"/>
</connections>
</menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="221">
<connections>
<action selector="performFindPanelAction:" target="-1" id="489"/>
</connections>
</menuItem>
<menuItem title="Jump to Selection" keyEquivalent="j" id="210">
<connections>
<action selector="centerSelectionInVisibleArea:" target="-1" id="245"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="221"/>
<menuItem title="Jump to Selection" keyEquivalent="j" id="210"/>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem title="Spelling and Grammar" id="216"> <menuItem title="Spelling and Grammar" id="216">
<menu key="submenu" title="Spelling and Grammar" id="200"> <menu key="submenu" title="Spelling and Grammar" id="200">
<items> <items>
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="204"/> <menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="204">
<menuItem title="Check Document Now" keyEquivalent=";" id="201"/> <connections>
<action selector="showGuessPanel:" target="-1" id="230"/>
</connections>
</menuItem>
<menuItem title="Check Document Now" keyEquivalent=";" id="201">
<connections>
<action selector="checkSpelling:" target="-1" id="225"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="453"/> <menuItem isSeparatorItem="YES" id="453"/>
<menuItem title="Check Spelling While Typing" id="219"/> <menuItem title="Check Spelling While Typing" id="219">
<menuItem title="Check Grammar With Spelling" id="346"/> <connections>
<action selector="toggleContinuousSpellChecking:" target="-1" id="222"/>
</connections>
</menuItem>
<menuItem title="Check Grammar With Spelling" id="346">
<connections>
<action selector="toggleGrammarChecking:" target="-1" id="347"/>
</connections>
</menuItem>
<menuItem title="Correct Spelling Automatically" id="454"> <menuItem title="Correct Spelling Automatically" id="454">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticSpellingCorrection:" target="-1" id="456"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -214,18 +250,38 @@
<items> <items>
<menuItem title="Show Substitutions" id="457"> <menuItem title="Show Substitutions" id="457">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontSubstitutionsPanel:" target="-1" id="458"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="459"/> <menuItem isSeparatorItem="YES" id="459"/>
<menuItem title="Smart Copy/Paste" tag="1" keyEquivalent="f" id="350"/> <menuItem title="Smart Copy/Paste" tag="1" keyEquivalent="f" id="350">
<menuItem title="Smart Quotes" tag="2" keyEquivalent="g" id="351"/> <connections>
<action selector="toggleSmartInsertDelete:" target="-1" id="355"/>
</connections>
</menuItem>
<menuItem title="Smart Quotes" tag="2" keyEquivalent="g" id="351">
<connections>
<action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="356"/>
</connections>
</menuItem>
<menuItem title="Smart Dashes" id="460"> <menuItem title="Smart Dashes" id="460">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDashSubstitution:" target="-1" id="461"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Smart Links" tag="3" keyEquivalent="G" id="354"> <menuItem title="Smart Links" tag="3" keyEquivalent="G" id="354">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="toggleAutomaticLinkDetection:" target="-1" id="357"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Text Replacement" id="462"> <menuItem title="Text Replacement" id="462">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticTextReplacement:" target="-1" id="463"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -236,12 +292,21 @@
<items> <items>
<menuItem title="Make Upper Case" id="452"> <menuItem title="Make Upper Case" id="452">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="uppercaseWord:" target="-1" id="464"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Make Lower Case" id="465"> <menuItem title="Make Lower Case" id="465">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowercaseWord:" target="-1" id="468"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Capitalize" id="466"> <menuItem title="Capitalize" id="466">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="capitalizeWord:" target="-1" id="467"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -249,8 +314,16 @@
<menuItem title="Speech" id="211"> <menuItem title="Speech" id="211">
<menu key="submenu" title="Speech" id="212"> <menu key="submenu" title="Speech" id="212">
<items> <items>
<menuItem title="Start Speaking" id="196"/> <menuItem title="Start Speaking" id="196">
<menuItem title="Stop Speaking" id="195"/> <connections>
<action selector="startSpeaking:" target="-1" id="233"/>
</connections>
</menuItem>
<menuItem title="Stop Speaking" id="195">
<connections>
<action selector="stopSpeaking:" target="-1" id="227"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
@@ -265,13 +338,37 @@
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Font" systemMenu="font" id="388"> <menu key="submenu" title="Font" systemMenu="font" id="388">
<items> <items>
<menuItem title="Show Fonts" keyEquivalent="t" id="389"/> <menuItem title="Show Fonts" keyEquivalent="t" id="389">
<menuItem title="Bold" tag="2" keyEquivalent="b" id="390"/> <connections>
<menuItem title="Italic" tag="1" keyEquivalent="i" id="391"/> <action selector="orderFrontFontPanel:" target="420" id="424"/>
<menuItem title="Underline" keyEquivalent="u" id="392"/> </connections>
</menuItem>
<menuItem title="Bold" tag="2" keyEquivalent="b" id="390">
<connections>
<action selector="addFontTrait:" target="420" id="421"/>
</connections>
</menuItem>
<menuItem title="Italic" tag="1" keyEquivalent="i" id="391">
<connections>
<action selector="addFontTrait:" target="420" id="422"/>
</connections>
</menuItem>
<menuItem title="Underline" keyEquivalent="u" id="392">
<connections>
<action selector="underline:" target="-1" id="432"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="393"/> <menuItem isSeparatorItem="YES" id="393"/>
<menuItem title="Bigger" tag="3" keyEquivalent="+" id="394"/> <menuItem title="Bigger" tag="3" keyEquivalent="+" id="394">
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="395"/> <connections>
<action selector="modifyFont:" target="420" id="425"/>
</connections>
</menuItem>
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="395">
<connections>
<action selector="modifyFont:" target="420" id="423"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="396"/> <menuItem isSeparatorItem="YES" id="396"/>
<menuItem title="Kern" id="397"> <menuItem title="Kern" id="397">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
@@ -279,15 +376,27 @@
<items> <items>
<menuItem title="Use Default" id="416"> <menuItem title="Use Default" id="416">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardKerning:" target="-1" id="438"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Use None" id="417"> <menuItem title="Use None" id="417">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffKerning:" target="-1" id="441"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Tighten" id="418"> <menuItem title="Tighten" id="418">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="tightenKerning:" target="-1" id="431"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Loosen" id="419"> <menuItem title="Loosen" id="419">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="loosenKerning:" target="-1" id="435"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -298,12 +407,21 @@
<items> <items>
<menuItem title="Use Default" id="412"> <menuItem title="Use Default" id="412">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardLigatures:" target="-1" id="439"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Use None" id="413"> <menuItem title="Use None" id="413">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffLigatures:" target="-1" id="440"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Use All" id="414"> <menuItem title="Use All" id="414">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useAllLigatures:" target="-1" id="434"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -314,30 +432,55 @@
<items> <items>
<menuItem title="Use Default" id="406"> <menuItem title="Use Default" id="406">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unscript:" target="-1" id="437"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Superscript" id="407"> <menuItem title="Superscript" id="407">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="superscript:" target="-1" id="430"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Subscript" id="408"> <menuItem title="Subscript" id="408">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="subscript:" target="-1" id="429"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Raise" id="409"> <menuItem title="Raise" id="409">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="raiseBaseline:" target="-1" id="426"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Lower" id="410"> <menuItem title="Lower" id="410">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowerBaseline:" target="-1" id="427"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="400"/> <menuItem isSeparatorItem="YES" id="400"/>
<menuItem title="Show Colors" keyEquivalent="C" id="401"/> <menuItem title="Show Colors" keyEquivalent="C" id="401">
<connections>
<action selector="orderFrontColorPanel:" target="-1" id="433"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="402"/> <menuItem isSeparatorItem="YES" id="402"/>
<menuItem title="Copy Style" keyEquivalent="c" id="403"> <menuItem title="Copy Style" keyEquivalent="c" id="403">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="copyFont:" target="-1" id="428"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Paste Style" keyEquivalent="v" id="404"> <menuItem title="Paste Style" keyEquivalent="v" id="404">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteFont:" target="-1" id="436"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -346,12 +489,27 @@
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Text" id="497"> <menu key="submenu" title="Text" id="497">
<items> <items>
<menuItem title="Align Left" keyEquivalent="{" id="498"/> <menuItem title="Align Left" keyEquivalent="{" id="498">
<menuItem title="Center" keyEquivalent="|" id="499"/> <connections>
<action selector="alignLeft:" target="-1" id="524"/>
</connections>
</menuItem>
<menuItem title="Center" keyEquivalent="|" id="499">
<connections>
<action selector="alignCenter:" target="-1" id="518"/>
</connections>
</menuItem>
<menuItem title="Justify" id="500"> <menuItem title="Justify" id="500">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="alignJustified:" target="-1" id="523"/>
</connections>
</menuItem>
<menuItem title="Align Right" keyEquivalent="}" id="501">
<connections>
<action selector="alignRight:" target="-1" id="521"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Align Right" keyEquivalent="}" id="501"/>
<menuItem isSeparatorItem="YES" id="502"/> <menuItem isSeparatorItem="YES" id="502"/>
<menuItem title="Writing Direction" id="503"> <menuItem title="Writing Direction" id="503">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
@@ -363,14 +521,23 @@
<menuItem id="510"> <menuItem id="510">
<string key="title"> Default</string> <string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionNatural:" target="-1" id="525"/>
</connections>
</menuItem> </menuItem>
<menuItem id="511"> <menuItem id="511">
<string key="title"> Left to Right</string> <string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionLeftToRight:" target="-1" id="526"/>
</connections>
</menuItem> </menuItem>
<menuItem id="512"> <menuItem id="512">
<string key="title"> Right to Left</string> <string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionRightToLeft:" target="-1" id="527"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="513"/> <menuItem isSeparatorItem="YES" id="513"/>
<menuItem title="Selection" enabled="NO" id="514"> <menuItem title="Selection" enabled="NO" id="514">
@@ -379,14 +546,23 @@
<menuItem id="515"> <menuItem id="515">
<string key="title"> Default</string> <string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionNatural:" target="-1" id="528"/>
</connections>
</menuItem> </menuItem>
<menuItem id="516"> <menuItem id="516">
<string key="title"> Left to Right</string> <string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionLeftToRight:" target="-1" id="529"/>
</connections>
</menuItem> </menuItem>
<menuItem id="517"> <menuItem id="517">
<string key="title"> Right to Left</string> <string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionRightToLeft:" target="-1" id="530"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -394,12 +570,21 @@
<menuItem isSeparatorItem="YES" id="504"/> <menuItem isSeparatorItem="YES" id="504"/>
<menuItem title="Show Ruler" id="505"> <menuItem title="Show Ruler" id="505">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleRuler:" target="-1" id="520"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Copy Ruler" keyEquivalent="c" id="506"> <menuItem title="Copy Ruler" keyEquivalent="c" id="506">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="copyRuler:" target="-1" id="522"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Paste Ruler" keyEquivalent="v" id="507"> <menuItem title="Paste Ruler" keyEquivalent="v" id="507">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="pasteRuler:" target="-1" id="519"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -412,20 +597,39 @@
<items> <items>
<menuItem title="Show Toolbar" keyEquivalent="t" id="297"> <menuItem title="Show Toolbar" keyEquivalent="t" id="297">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="toggleToolbarShown:" target="-1" id="366"/>
</connections>
</menuItem>
<menuItem title="Customize Toolbar…" id="298">
<connections>
<action selector="runToolbarCustomizationPalette:" target="-1" id="365"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Customize Toolbar…" id="298"/>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem title="Window" id="19"> <menuItem title="Window" id="19">
<menu key="submenu" title="Window" systemMenu="window" id="24"> <menu key="submenu" title="Window" systemMenu="window" id="24">
<items> <items>
<menuItem title="Minimize" keyEquivalent="m" id="23"/> <menuItem title="Minimize" keyEquivalent="m" id="23">
<menuItem title="Zoom" id="239"/> <connections>
<action selector="performMiniaturize:" target="-1" id="37"/>
</connections>
</menuItem>
<menuItem title="Zoom" id="239">
<connections>
<action selector="performZoom:" target="-1" id="240"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="92"> <menuItem isSeparatorItem="YES" id="92">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Bring All to Front" id="5"/> <menuItem title="Bring All to Front" id="5">
<connections>
<action selector="arrangeInFront:" target="-1" id="39"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
@@ -433,17 +637,21 @@
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="491"> <menu key="submenu" title="Help" systemMenu="help" id="491">
<items> <items>
<menuItem title="EZAudioPassThroughExample Help" keyEquivalent="?" id="492"/> <menuItem title="EZAudioPassThroughExample Help" keyEquivalent="?" id="492">
<connections>
<action selector="showHelp:" target="-1" id="493"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
<window title="EZAudioPassThroughExample" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="371"> <window title="EZAudioPassThroughExample" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="371">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/> <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES" fullSizeContentView="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="335" y="390" width="480" height="360"/> <rect key="contentRect" x="335" y="390" width="480" height="360"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1418"/> <rect key="screenRect" x="0.0" y="0.0" width="1440" height="877"/>
<view key="contentView" id="372"> <view key="contentView" id="372">
<rect key="frame" x="0.0" y="0.0" width="480" height="360"/> <rect key="frame" x="0.0" y="0.0" width="480" height="360"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
@@ -454,14 +662,6 @@
<outlet property="window" destination="371" id="532"/> <outlet property="window" destination="371" id="532"/>
</connections> </connections>
</customObject> </customObject>
<customObject id="420" customClass="NSFontManager"> <customObject id="420" customClass="NSFontManager"/>
<connections>
<action selector="addFontTrait:" destination="390" id="421"/>
<action selector="addFontTrait:" destination="391" id="422"/>
<action selector="modifyFont:" destination="395" id="423"/>
<action selector="modifyFont:" destination="394" id="425"/>
<action selector="orderFrontFontPanel:" destination="389" id="424"/>
</connections>
</customObject>
</objects> </objects>
</document> </document>
@@ -39,7 +39,14 @@
/** /**
The OpenGL based audio plot The OpenGL based audio plot
*/ */
@property (nonatomic,weak) IBOutlet EZAudioPlotGL *audioPlot; @property (nonatomic, weak) IBOutlet EZAudioPlotGL *audioPlot;
//------------------------------------------------------------------------------
/**
The label used to display the microphone state
*/
@property (nonatomic, weak) IBOutlet NSButton *microphoneSwitch;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#pragma mark - Actions #pragma mark - Actions
@@ -132,6 +132,14 @@
#pragma mark - EZMicrophoneDelegate #pragma mark - EZMicrophoneDelegate
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
- (void)microphone:(EZMicrophone *)microphone changedPlayingState:(BOOL)isPlaying
{
NSString *title = isPlaying ? @"Microphone On" : @"Microphone Off";
[self setTitle:title forButton:self.microphoneSwitch];
}
//------------------------------------------------------------------------------
-(void) microphone:(EZMicrophone *)microphone -(void) microphone:(EZMicrophone *)microphone
hasAudioReceived:(float **)buffer hasAudioReceived:(float **)buffer
withBufferSize:(UInt32)bufferSize withBufferSize:(UInt32)bufferSize
@@ -144,6 +152,19 @@
}); });
} }
//------------------------------------------------------------------------------
#pragma mark - Utility
//------------------------------------------------------------------------------
- (void)setTitle:(NSString *)title forButton:(NSButton *)button
{
NSDictionary *attributes = @{ NSForegroundColorAttributeName : [NSColor whiteColor] };
NSAttributedString *attributedTitle = [[NSAttributedString alloc] initWithString:title
attributes:attributes];
button.attributedTitle = attributedTitle;
button.attributedAlternateTitle = attributedTitle;
}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@end @end
@@ -1,68 +1,88 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="4514" systemVersion="13A603" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<deployment version="1070" identifier="macosx"/> <deployment version="1070" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4514"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7706"/>
</dependencies> </dependencies>
<objects> <objects>
<customObject id="-2" userLabel="File's Owner" customClass="PassThroughViewController"> <customObject id="-2" userLabel="File's Owner" customClass="PassThroughViewController">
<connections> <connections>
<outlet property="audioPlot" destination="szV-uu-KbA" id="KwB-bl-yeS"/> <outlet property="audioPlot" destination="szV-uu-KbA" id="KwB-bl-yeS"/>
<outlet property="microphoneSwitch" destination="hej-uQ-uG1" id="fhN-xl-LNP"/>
<outlet property="view" destination="1d9-8y-ung" id="BT4-Db-KNk"/> <outlet property="view" destination="1d9-8y-ung" id="BT4-Db-KNk"/>
</connections> </connections>
</customObject> </customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application"/> <customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customView id="1d9-8y-ung"> <customView id="1d9-8y-ung">
<rect key="frame" x="0.0" y="0.0" width="480" height="272"/> <rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews> <subviews>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="szV-uu-KbA" customClass="EZAudioPlotGL"> <customView translatesAutoresizingMaskIntoConstraints="NO" id="szV-uu-KbA" customClass="EZAudioPlotGL">
<rect key="frame" x="0.0" y="42" width="480" height="230"/> <rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <subviews>
<box autoresizesSubviews="NO" title="Box" boxType="custom" borderType="none" translatesAutoresizingMaskIntoConstraints="NO" id="eSf-nW-gda">
<rect key="frame" x="0.0" y="0.0" width="480" height="57"/>
<view key="contentView">
<rect key="frame" x="0.0" y="0.0" width="480" height="57"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button translatesAutoresizingMaskIntoConstraints="NO" id="hej-uQ-uG1">
<rect key="frame" x="16" y="16" width="119" height="18"/>
<constraints>
<constraint firstAttribute="height" constant="14" id="fd8-mW-5iG"/>
<constraint firstAttribute="width" constant="115" id="znu-AU-bWg"/>
</constraints>
<buttonCell key="cell" type="check" title="Microphone On" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="k97-dB-fHu">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="toggleMicrophone:" target="-2" id="ofz-vX-IjK"/>
</connections>
</button>
<segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="sPx-Eg-cI6">
<rect key="frame" x="335" y="16" width="129" height="24"/>
<constraints>
<constraint firstAttribute="width" constant="125" id="JlH-Js-Z1d"/>
<constraint firstAttribute="height" constant="21" id="hEY-sc-Ib0"/>
</constraints>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="q61-MR-tCv">
<font key="font" metaFont="system"/>
<segments>
<segment label="Buffer" selected="YES"/>
<segment label="Rolling" tag="1"/>
</segments>
</segmentedCell>
<connections>
<action selector="changePlotType:" target="-2" id="UVX-Mg-yXi"/>
</connections>
</segmentedControl>
</subviews>
</view>
<constraints>
<constraint firstAttribute="trailing" secondItem="sPx-Eg-cI6" secondAttribute="trailing" constant="18" id="3dz-EL-GYk"/>
<constraint firstItem="hej-uQ-uG1" firstAttribute="leading" secondItem="eSf-nW-gda" secondAttribute="leading" constant="18" id="QRY-A3-l3d"/>
<constraint firstItem="sPx-Eg-cI6" firstAttribute="centerY" secondItem="eSf-nW-gda" secondAttribute="centerY" id="ZiD-Mc-F6Z"/>
<constraint firstItem="sPx-Eg-cI6" firstAttribute="bottom" secondItem="hej-uQ-uG1" secondAttribute="bottom" id="kMA-Gc-Asn"/>
<constraint firstAttribute="height" constant="57" id="q54-Ma-rT2"/>
</constraints>
<color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
<color key="fillColor" red="0.0" green="0.0" blue="0.0" alpha="0.70000000000000007" colorSpace="calibratedRGB"/>
</box>
</subviews>
<constraints>
<constraint firstItem="eSf-nW-gda" firstAttribute="leading" secondItem="szV-uu-KbA" secondAttribute="leading" id="n5W-wG-XMz"/>
<constraint firstAttribute="bottom" secondItem="eSf-nW-gda" secondAttribute="bottom" id="ob1-us-1L5"/>
<constraint firstAttribute="trailing" secondItem="eSf-nW-gda" secondAttribute="trailing" id="pGc-Rn-8IL"/>
</constraints>
</customView> </customView>
<button translatesAutoresizingMaskIntoConstraints="NO" id="hej-uQ-uG1">
<rect key="frame" x="18" y="14" width="119" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<constraints>
<constraint firstAttribute="height" constant="14" id="fd8-mW-5iG"/>
</constraints>
<buttonCell key="cell" type="check" title="Microphone On" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="k97-dB-fHu">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="toggleMicrophone:" target="-2" id="ofz-vX-IjK"/>
</connections>
</button>
<segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="sPx-Eg-cI6">
<rect key="frame" x="333" y="11" width="129" height="24"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<constraints>
<constraint firstAttribute="height" constant="21" id="hEY-sc-Ib0"/>
</constraints>
<segmentedCell key="cell" alignment="left" style="rounded" trackingMode="selectOne" id="q61-MR-tCv">
<font key="font" metaFont="system"/>
<segments>
<segment label="Buffer" selected="YES"/>
<segment label="Rolling" tag="1"/>
</segments>
</segmentedCell>
<connections>
<action selector="changePlotType:" target="-2" id="UVX-Mg-yXi"/>
</connections>
</segmentedControl>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstAttribute="bottom" secondItem="szV-uu-KbA" secondAttribute="bottom" id="8NU-Oj-lK1"/>
<constraint firstAttribute="trailing" secondItem="szV-uu-KbA" secondAttribute="trailing" id="AVW-CO-N2Q"/> <constraint firstAttribute="trailing" secondItem="szV-uu-KbA" secondAttribute="trailing" id="AVW-CO-N2Q"/>
<constraint firstItem="szV-uu-KbA" firstAttribute="top" secondItem="1d9-8y-ung" secondAttribute="top" id="DM4-bU-zuP"/> <constraint firstItem="szV-uu-KbA" firstAttribute="top" secondItem="1d9-8y-ung" secondAttribute="top" id="DM4-bU-zuP"/>
<constraint firstItem="sPx-Eg-cI6" firstAttribute="top" secondItem="szV-uu-KbA" secondAttribute="bottom" constant="8" id="EFb-mI-KZS"/>
<constraint firstAttribute="trailing" secondItem="sPx-Eg-cI6" secondAttribute="trailing" constant="20" id="MiO-PO-tmm"/>
<constraint firstItem="hej-uQ-uG1" firstAttribute="leading" secondItem="1d9-8y-ung" secondAttribute="leading" constant="20" id="NJE-fd-586"/>
<constraint firstItem="szV-uu-KbA" firstAttribute="leading" secondItem="1d9-8y-ung" secondAttribute="leading" id="Qkq-oi-gx2"/> <constraint firstItem="szV-uu-KbA" firstAttribute="leading" secondItem="1d9-8y-ung" secondAttribute="leading" id="Qkq-oi-gx2"/>
<constraint firstAttribute="bottom" secondItem="hej-uQ-uG1" secondAttribute="bottom" constant="16" id="UXq-4r-K0N"/>
<constraint firstAttribute="bottom" secondItem="sPx-Eg-cI6" secondAttribute="bottom" constant="13" id="V0F-aH-MAE"/>
<constraint firstItem="hej-uQ-uG1" firstAttribute="top" secondItem="szV-uu-KbA" secondAttribute="bottom" constant="12" id="cPy-qk-vL2"/>
</constraints> </constraints>
</customView> </customView>
</objects> </objects>
@@ -1,100 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="4439" systemVersion="13A451" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4439"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7706"/>
</dependencies> </dependencies>
<objects> <objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication"> <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
<connections> <connections>
<action selector="orderFrontStandardAboutPanel:" destination="58" id="142"/>
<outlet property="delegate" destination="494" id="495"/> <outlet property="delegate" destination="494" id="495"/>
</connections> </connections>
</customObject> </customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"> <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<connections> <customObject id="-3" userLabel="Application" customClass="NSObject"/>
<action selector="alignCenter:" destination="499" id="518"/>
<action selector="alignJustified:" destination="500" id="523"/>
<action selector="alignLeft:" destination="498" id="524"/>
<action selector="alignRight:" destination="501" id="521"/>
<action selector="arrangeInFront:" destination="5" id="39"/>
<action selector="capitalizeWord:" destination="466" id="467"/>
<action selector="centerSelectionInVisibleArea:" destination="210" id="245"/>
<action selector="checkSpelling:" destination="201" id="225"/>
<action selector="clearRecentDocuments:" destination="126" id="127"/>
<action selector="copy:" destination="197" id="224"/>
<action selector="copyFont:" destination="403" id="428"/>
<action selector="copyRuler:" destination="506" id="522"/>
<action selector="cut:" destination="199" id="228"/>
<action selector="delete:" destination="202" id="235"/>
<action selector="hide:" destination="134" id="367"/>
<action selector="hideOtherApplications:" destination="145" id="368"/>
<action selector="loosenKerning:" destination="419" id="435"/>
<action selector="lowerBaseline:" destination="410" id="427"/>
<action selector="lowercaseWord:" destination="465" id="468"/>
<action selector="makeBaseWritingDirectionLeftToRight:" destination="511" id="526"/>
<action selector="makeBaseWritingDirectionNatural:" destination="510" id="525"/>
<action selector="makeBaseWritingDirectionRightToLeft:" destination="512" id="527"/>
<action selector="makeTextWritingDirectionLeftToRight:" destination="516" id="529"/>
<action selector="makeTextWritingDirectionNatural:" destination="515" id="528"/>
<action selector="makeTextWritingDirectionRightToLeft:" destination="517" id="530"/>
<action selector="newDocument:" destination="82" id="373"/>
<action selector="openDocument:" destination="72" id="374"/>
<action selector="orderFrontColorPanel:" destination="401" id="433"/>
<action selector="orderFrontSubstitutionsPanel:" destination="457" id="458"/>
<action selector="paste:" destination="203" id="226"/>
<action selector="pasteAsPlainText:" destination="485" id="486"/>
<action selector="pasteFont:" destination="404" id="436"/>
<action selector="pasteRuler:" destination="507" id="519"/>
<action selector="performClose:" destination="73" id="193"/>
<action selector="performFindPanelAction:" destination="209" id="241"/>
<action selector="performFindPanelAction:" destination="208" id="487"/>
<action selector="performFindPanelAction:" destination="213" id="488"/>
<action selector="performFindPanelAction:" destination="221" id="489"/>
<action selector="performFindPanelAction:" destination="534" id="535"/>
<action selector="performMiniaturize:" destination="23" id="37"/>
<action selector="performZoom:" destination="239" id="240"/>
<action selector="print:" destination="78" id="86"/>
<action selector="raiseBaseline:" destination="409" id="426"/>
<action selector="redo:" destination="215" id="231"/>
<action selector="revertDocumentToSaved:" destination="112" id="364"/>
<action selector="runPageLayout:" destination="77" id="87"/>
<action selector="runToolbarCustomizationPalette:" destination="298" id="365"/>
<action selector="saveDocument:" destination="75" id="362"/>
<action selector="selectAll:" destination="198" id="232"/>
<action selector="showGuessPanel:" destination="204" id="230"/>
<action selector="showHelp:" destination="492" id="493"/>
<action selector="startSpeaking:" destination="196" id="233"/>
<action selector="stopSpeaking:" destination="195" id="227"/>
<action selector="subscript:" destination="408" id="429"/>
<action selector="superscript:" destination="407" id="430"/>
<action selector="tightenKerning:" destination="418" id="431"/>
<action selector="toggleAutomaticDashSubstitution:" destination="460" id="461"/>
<action selector="toggleAutomaticLinkDetection:" destination="354" id="357"/>
<action selector="toggleAutomaticQuoteSubstitution:" destination="351" id="356"/>
<action selector="toggleAutomaticSpellingCorrection:" destination="454" id="456"/>
<action selector="toggleAutomaticTextReplacement:" destination="462" id="463"/>
<action selector="toggleContinuousSpellChecking:" destination="219" id="222"/>
<action selector="toggleGrammarChecking:" destination="346" id="347"/>
<action selector="toggleRuler:" destination="505" id="520"/>
<action selector="toggleSmartInsertDelete:" destination="350" id="355"/>
<action selector="toggleToolbarShown:" destination="297" id="366"/>
<action selector="turnOffKerning:" destination="417" id="441"/>
<action selector="turnOffLigatures:" destination="413" id="440"/>
<action selector="underline:" destination="392" id="432"/>
<action selector="undo:" destination="207" id="223"/>
<action selector="unhideAllApplications:" destination="150" id="370"/>
<action selector="unscript:" destination="406" id="437"/>
<action selector="uppercaseWord:" destination="452" id="464"/>
<action selector="useAllLigatures:" destination="414" id="434"/>
<action selector="useStandardKerning:" destination="416" id="438"/>
<action selector="useStandardLigatures:" destination="412" id="439"/>
</connections>
</customObject>
<customObject id="-3" userLabel="Application">
<connections>
<action selector="terminate:" destination="136" id="449"/>
</connections>
</customObject>
<menu title="AMainMenu" systemMenu="main" id="29"> <menu title="AMainMenu" systemMenu="main" id="29">
<items> <items>
<menuItem title="EZAudioPlayFileExample" id="56"> <menuItem title="EZAudioPlayFileExample" id="56">
@@ -102,6 +19,9 @@
<items> <items>
<menuItem title="About EZAudioPlayFileExample" id="58"> <menuItem title="About EZAudioPlayFileExample" id="58">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="-2" id="142"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="236"> <menuItem isSeparatorItem="YES" id="236">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
@@ -116,95 +36,211 @@
<menuItem isSeparatorItem="YES" id="144"> <menuItem isSeparatorItem="YES" id="144">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Hide EZAudioPlayFileExample" keyEquivalent="h" id="134"/> <menuItem title="Hide EZAudioPlayFileExample" keyEquivalent="h" id="134">
<connections>
<action selector="hide:" target="-1" id="367"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="145"> <menuItem title="Hide Others" keyEquivalent="h" id="145">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="-1" id="368"/>
</connections>
</menuItem>
<menuItem title="Show All" id="150">
<connections>
<action selector="unhideAllApplications:" target="-1" id="370"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Show All" id="150"/>
<menuItem isSeparatorItem="YES" id="149"> <menuItem isSeparatorItem="YES" id="149">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Quit EZAudioPlayFileExample" keyEquivalent="q" id="136"/> <menuItem title="Quit EZAudioPlayFileExample" keyEquivalent="q" id="136">
<connections>
<action selector="terminate:" target="-3" id="449"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem title="File" id="83"> <menuItem title="File" id="83">
<menu key="submenu" title="File" id="81"> <menu key="submenu" title="File" id="81">
<items> <items>
<menuItem title="New" keyEquivalent="n" id="82"/> <menuItem title="New" keyEquivalent="n" id="82">
<menuItem title="Open…" keyEquivalent="o" id="72"/> <connections>
<action selector="newDocument:" target="-1" id="373"/>
</connections>
</menuItem>
<menuItem title="Open…" keyEquivalent="o" id="72">
<connections>
<action selector="openDocument:" target="-1" id="374"/>
</connections>
</menuItem>
<menuItem title="Open Recent" id="124"> <menuItem title="Open Recent" id="124">
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="125"> <menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="125">
<items> <items>
<menuItem title="Clear Menu" id="126"/> <menuItem title="Clear Menu" id="126">
<connections>
<action selector="clearRecentDocuments:" target="-1" id="127"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="79"> <menuItem isSeparatorItem="YES" id="79">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Close" keyEquivalent="w" id="73"/> <menuItem title="Close" keyEquivalent="w" id="73">
<menuItem title="Save…" keyEquivalent="s" id="75"/> <connections>
<action selector="performClose:" target="-1" id="193"/>
</connections>
</menuItem>
<menuItem title="Save…" keyEquivalent="s" id="75">
<connections>
<action selector="saveDocument:" target="-1" id="362"/>
</connections>
</menuItem>
<menuItem title="Revert to Saved" id="112"> <menuItem title="Revert to Saved" id="112">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="revertDocumentToSaved:" target="-1" id="364"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="74"> <menuItem isSeparatorItem="YES" id="74">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Page Setup..." keyEquivalent="P" id="77"> <menuItem title="Page Setup..." keyEquivalent="P" id="77">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="runPageLayout:" target="-1" id="87"/>
</connections>
</menuItem>
<menuItem title="Print…" keyEquivalent="p" id="78">
<connections>
<action selector="print:" target="-1" id="86"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Print…" keyEquivalent="p" id="78"/>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem title="Edit" id="217"> <menuItem title="Edit" id="217">
<menu key="submenu" title="Edit" id="205"> <menu key="submenu" title="Edit" id="205">
<items> <items>
<menuItem title="Undo" keyEquivalent="z" id="207"/> <menuItem title="Undo" keyEquivalent="z" id="207">
<connections>
<action selector="undo:" target="-1" id="223"/>
</connections>
</menuItem>
<menuItem title="Redo" keyEquivalent="Z" id="215"> <menuItem title="Redo" keyEquivalent="Z" id="215">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="redo:" target="-1" id="231"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="206"> <menuItem isSeparatorItem="YES" id="206">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Cut" keyEquivalent="x" id="199"/> <menuItem title="Cut" keyEquivalent="x" id="199">
<menuItem title="Copy" keyEquivalent="c" id="197"/> <connections>
<menuItem title="Paste" keyEquivalent="v" id="203"/> <action selector="cut:" target="-1" id="228"/>
</connections>
</menuItem>
<menuItem title="Copy" keyEquivalent="c" id="197">
<connections>
<action selector="copy:" target="-1" id="224"/>
</connections>
</menuItem>
<menuItem title="Paste" keyEquivalent="v" id="203">
<connections>
<action selector="paste:" target="-1" id="226"/>
</connections>
</menuItem>
<menuItem title="Paste and Match Style" keyEquivalent="V" id="485"> <menuItem title="Paste and Match Style" keyEquivalent="V" id="485">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteAsPlainText:" target="-1" id="486"/>
</connections>
</menuItem>
<menuItem title="Delete" id="202">
<connections>
<action selector="delete:" target="-1" id="235"/>
</connections>
</menuItem>
<menuItem title="Select All" keyEquivalent="a" id="198">
<connections>
<action selector="selectAll:" target="-1" id="232"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Delete" id="202"/>
<menuItem title="Select All" keyEquivalent="a" id="198"/>
<menuItem isSeparatorItem="YES" id="214"> <menuItem isSeparatorItem="YES" id="214">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Find" id="218"> <menuItem title="Find" id="218">
<menu key="submenu" title="Find" id="220"> <menu key="submenu" title="Find" id="220">
<items> <items>
<menuItem title="Find…" tag="1" keyEquivalent="f" id="209"/> <menuItem title="Find…" tag="1" keyEquivalent="f" id="209">
<connections>
<action selector="performFindPanelAction:" target="-1" id="241"/>
</connections>
</menuItem>
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="534"> <menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="534">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="-1" id="535"/>
</connections>
</menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="208">
<connections>
<action selector="performFindPanelAction:" target="-1" id="487"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="208"/>
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="213"> <menuItem title="Find Previous" tag="3" keyEquivalent="G" id="213">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="-1" id="488"/>
</connections>
</menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="221">
<connections>
<action selector="performFindPanelAction:" target="-1" id="489"/>
</connections>
</menuItem>
<menuItem title="Jump to Selection" keyEquivalent="j" id="210">
<connections>
<action selector="centerSelectionInVisibleArea:" target="-1" id="245"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="221"/>
<menuItem title="Jump to Selection" keyEquivalent="j" id="210"/>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem title="Spelling and Grammar" id="216"> <menuItem title="Spelling and Grammar" id="216">
<menu key="submenu" title="Spelling and Grammar" id="200"> <menu key="submenu" title="Spelling and Grammar" id="200">
<items> <items>
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="204"/> <menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="204">
<menuItem title="Check Document Now" keyEquivalent=";" id="201"/> <connections>
<action selector="showGuessPanel:" target="-1" id="230"/>
</connections>
</menuItem>
<menuItem title="Check Document Now" keyEquivalent=";" id="201">
<connections>
<action selector="checkSpelling:" target="-1" id="225"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="453"/> <menuItem isSeparatorItem="YES" id="453"/>
<menuItem title="Check Spelling While Typing" id="219"/> <menuItem title="Check Spelling While Typing" id="219">
<menuItem title="Check Grammar With Spelling" id="346"/> <connections>
<action selector="toggleContinuousSpellChecking:" target="-1" id="222"/>
</connections>
</menuItem>
<menuItem title="Check Grammar With Spelling" id="346">
<connections>
<action selector="toggleGrammarChecking:" target="-1" id="347"/>
</connections>
</menuItem>
<menuItem title="Correct Spelling Automatically" id="454"> <menuItem title="Correct Spelling Automatically" id="454">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticSpellingCorrection:" target="-1" id="456"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -214,18 +250,38 @@
<items> <items>
<menuItem title="Show Substitutions" id="457"> <menuItem title="Show Substitutions" id="457">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontSubstitutionsPanel:" target="-1" id="458"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="459"/> <menuItem isSeparatorItem="YES" id="459"/>
<menuItem title="Smart Copy/Paste" tag="1" keyEquivalent="f" id="350"/> <menuItem title="Smart Copy/Paste" tag="1" keyEquivalent="f" id="350">
<menuItem title="Smart Quotes" tag="2" keyEquivalent="g" id="351"/> <connections>
<action selector="toggleSmartInsertDelete:" target="-1" id="355"/>
</connections>
</menuItem>
<menuItem title="Smart Quotes" tag="2" keyEquivalent="g" id="351">
<connections>
<action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="356"/>
</connections>
</menuItem>
<menuItem title="Smart Dashes" id="460"> <menuItem title="Smart Dashes" id="460">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDashSubstitution:" target="-1" id="461"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Smart Links" tag="3" keyEquivalent="G" id="354"> <menuItem title="Smart Links" tag="3" keyEquivalent="G" id="354">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="toggleAutomaticLinkDetection:" target="-1" id="357"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Text Replacement" id="462"> <menuItem title="Text Replacement" id="462">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticTextReplacement:" target="-1" id="463"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -236,12 +292,21 @@
<items> <items>
<menuItem title="Make Upper Case" id="452"> <menuItem title="Make Upper Case" id="452">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="uppercaseWord:" target="-1" id="464"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Make Lower Case" id="465"> <menuItem title="Make Lower Case" id="465">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowercaseWord:" target="-1" id="468"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Capitalize" id="466"> <menuItem title="Capitalize" id="466">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="capitalizeWord:" target="-1" id="467"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -249,8 +314,16 @@
<menuItem title="Speech" id="211"> <menuItem title="Speech" id="211">
<menu key="submenu" title="Speech" id="212"> <menu key="submenu" title="Speech" id="212">
<items> <items>
<menuItem title="Start Speaking" id="196"/> <menuItem title="Start Speaking" id="196">
<menuItem title="Stop Speaking" id="195"/> <connections>
<action selector="startSpeaking:" target="-1" id="233"/>
</connections>
</menuItem>
<menuItem title="Stop Speaking" id="195">
<connections>
<action selector="stopSpeaking:" target="-1" id="227"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
@@ -265,13 +338,37 @@
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Font" systemMenu="font" id="388"> <menu key="submenu" title="Font" systemMenu="font" id="388">
<items> <items>
<menuItem title="Show Fonts" keyEquivalent="t" id="389"/> <menuItem title="Show Fonts" keyEquivalent="t" id="389">
<menuItem title="Bold" tag="2" keyEquivalent="b" id="390"/> <connections>
<menuItem title="Italic" tag="1" keyEquivalent="i" id="391"/> <action selector="orderFrontFontPanel:" target="420" id="424"/>
<menuItem title="Underline" keyEquivalent="u" id="392"/> </connections>
</menuItem>
<menuItem title="Bold" tag="2" keyEquivalent="b" id="390">
<connections>
<action selector="addFontTrait:" target="420" id="421"/>
</connections>
</menuItem>
<menuItem title="Italic" tag="1" keyEquivalent="i" id="391">
<connections>
<action selector="addFontTrait:" target="420" id="422"/>
</connections>
</menuItem>
<menuItem title="Underline" keyEquivalent="u" id="392">
<connections>
<action selector="underline:" target="-1" id="432"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="393"/> <menuItem isSeparatorItem="YES" id="393"/>
<menuItem title="Bigger" tag="3" keyEquivalent="+" id="394"/> <menuItem title="Bigger" tag="3" keyEquivalent="+" id="394">
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="395"/> <connections>
<action selector="modifyFont:" target="420" id="425"/>
</connections>
</menuItem>
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="395">
<connections>
<action selector="modifyFont:" target="420" id="423"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="396"/> <menuItem isSeparatorItem="YES" id="396"/>
<menuItem title="Kern" id="397"> <menuItem title="Kern" id="397">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
@@ -279,15 +376,27 @@
<items> <items>
<menuItem title="Use Default" id="416"> <menuItem title="Use Default" id="416">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardKerning:" target="-1" id="438"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Use None" id="417"> <menuItem title="Use None" id="417">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffKerning:" target="-1" id="441"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Tighten" id="418"> <menuItem title="Tighten" id="418">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="tightenKerning:" target="-1" id="431"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Loosen" id="419"> <menuItem title="Loosen" id="419">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="loosenKerning:" target="-1" id="435"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -298,12 +407,21 @@
<items> <items>
<menuItem title="Use Default" id="412"> <menuItem title="Use Default" id="412">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardLigatures:" target="-1" id="439"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Use None" id="413"> <menuItem title="Use None" id="413">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffLigatures:" target="-1" id="440"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Use All" id="414"> <menuItem title="Use All" id="414">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useAllLigatures:" target="-1" id="434"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -314,30 +432,55 @@
<items> <items>
<menuItem title="Use Default" id="406"> <menuItem title="Use Default" id="406">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unscript:" target="-1" id="437"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Superscript" id="407"> <menuItem title="Superscript" id="407">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="superscript:" target="-1" id="430"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Subscript" id="408"> <menuItem title="Subscript" id="408">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="subscript:" target="-1" id="429"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Raise" id="409"> <menuItem title="Raise" id="409">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="raiseBaseline:" target="-1" id="426"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Lower" id="410"> <menuItem title="Lower" id="410">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowerBaseline:" target="-1" id="427"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="400"/> <menuItem isSeparatorItem="YES" id="400"/>
<menuItem title="Show Colors" keyEquivalent="C" id="401"/> <menuItem title="Show Colors" keyEquivalent="C" id="401">
<connections>
<action selector="orderFrontColorPanel:" target="-1" id="433"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="402"/> <menuItem isSeparatorItem="YES" id="402"/>
<menuItem title="Copy Style" keyEquivalent="c" id="403"> <menuItem title="Copy Style" keyEquivalent="c" id="403">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="copyFont:" target="-1" id="428"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Paste Style" keyEquivalent="v" id="404"> <menuItem title="Paste Style" keyEquivalent="v" id="404">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteFont:" target="-1" id="436"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -346,12 +489,27 @@
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Text" id="497"> <menu key="submenu" title="Text" id="497">
<items> <items>
<menuItem title="Align Left" keyEquivalent="{" id="498"/> <menuItem title="Align Left" keyEquivalent="{" id="498">
<menuItem title="Center" keyEquivalent="|" id="499"/> <connections>
<action selector="alignLeft:" target="-1" id="524"/>
</connections>
</menuItem>
<menuItem title="Center" keyEquivalent="|" id="499">
<connections>
<action selector="alignCenter:" target="-1" id="518"/>
</connections>
</menuItem>
<menuItem title="Justify" id="500"> <menuItem title="Justify" id="500">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="alignJustified:" target="-1" id="523"/>
</connections>
</menuItem>
<menuItem title="Align Right" keyEquivalent="}" id="501">
<connections>
<action selector="alignRight:" target="-1" id="521"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Align Right" keyEquivalent="}" id="501"/>
<menuItem isSeparatorItem="YES" id="502"/> <menuItem isSeparatorItem="YES" id="502"/>
<menuItem title="Writing Direction" id="503"> <menuItem title="Writing Direction" id="503">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
@@ -363,14 +521,23 @@
<menuItem id="510"> <menuItem id="510">
<string key="title"> Default</string> <string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionNatural:" target="-1" id="525"/>
</connections>
</menuItem> </menuItem>
<menuItem id="511"> <menuItem id="511">
<string key="title"> Left to Right</string> <string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionLeftToRight:" target="-1" id="526"/>
</connections>
</menuItem> </menuItem>
<menuItem id="512"> <menuItem id="512">
<string key="title"> Right to Left</string> <string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionRightToLeft:" target="-1" id="527"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="513"/> <menuItem isSeparatorItem="YES" id="513"/>
<menuItem title="Selection" enabled="NO" id="514"> <menuItem title="Selection" enabled="NO" id="514">
@@ -379,14 +546,23 @@
<menuItem id="515"> <menuItem id="515">
<string key="title"> Default</string> <string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionNatural:" target="-1" id="528"/>
</connections>
</menuItem> </menuItem>
<menuItem id="516"> <menuItem id="516">
<string key="title"> Left to Right</string> <string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionLeftToRight:" target="-1" id="529"/>
</connections>
</menuItem> </menuItem>
<menuItem id="517"> <menuItem id="517">
<string key="title"> Right to Left</string> <string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionRightToLeft:" target="-1" id="530"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -394,12 +570,21 @@
<menuItem isSeparatorItem="YES" id="504"/> <menuItem isSeparatorItem="YES" id="504"/>
<menuItem title="Show Ruler" id="505"> <menuItem title="Show Ruler" id="505">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleRuler:" target="-1" id="520"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Copy Ruler" keyEquivalent="c" id="506"> <menuItem title="Copy Ruler" keyEquivalent="c" id="506">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="copyRuler:" target="-1" id="522"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Paste Ruler" keyEquivalent="v" id="507"> <menuItem title="Paste Ruler" keyEquivalent="v" id="507">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="pasteRuler:" target="-1" id="519"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -412,20 +597,39 @@
<items> <items>
<menuItem title="Show Toolbar" keyEquivalent="t" id="297"> <menuItem title="Show Toolbar" keyEquivalent="t" id="297">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="toggleToolbarShown:" target="-1" id="366"/>
</connections>
</menuItem>
<menuItem title="Customize Toolbar…" id="298">
<connections>
<action selector="runToolbarCustomizationPalette:" target="-1" id="365"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Customize Toolbar…" id="298"/>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem title="Window" id="19"> <menuItem title="Window" id="19">
<menu key="submenu" title="Window" systemMenu="window" id="24"> <menu key="submenu" title="Window" systemMenu="window" id="24">
<items> <items>
<menuItem title="Minimize" keyEquivalent="m" id="23"/> <menuItem title="Minimize" keyEquivalent="m" id="23">
<menuItem title="Zoom" id="239"/> <connections>
<action selector="performMiniaturize:" target="-1" id="37"/>
</connections>
</menuItem>
<menuItem title="Zoom" id="239">
<connections>
<action selector="performZoom:" target="-1" id="240"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="92"> <menuItem isSeparatorItem="YES" id="92">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Bring All to Front" id="5"/> <menuItem title="Bring All to Front" id="5">
<connections>
<action selector="arrangeInFront:" target="-1" id="39"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
@@ -433,17 +637,21 @@
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="491"> <menu key="submenu" title="Help" systemMenu="help" id="491">
<items> <items>
<menuItem title="EZAudioPlayFileExample Help" keyEquivalent="?" id="492"/> <menuItem title="EZAudioPlayFileExample Help" keyEquivalent="?" id="492">
<connections>
<action selector="showHelp:" target="-1" id="493"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
<window title="EZAudioPlayFileExample" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="371"> <window title="EZAudioPlayFileExample" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="371">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/> <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES" fullSizeContentView="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="335" y="390" width="480" height="360"/> <rect key="contentRect" x="335" y="390" width="480" height="360"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1418"/> <rect key="screenRect" x="0.0" y="0.0" width="1440" height="877"/>
<view key="contentView" id="372"> <view key="contentView" id="372">
<rect key="frame" x="0.0" y="0.0" width="480" height="360"/> <rect key="frame" x="0.0" y="0.0" width="480" height="360"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
@@ -454,14 +662,6 @@
<outlet property="window" destination="371" id="532"/> <outlet property="window" destination="371" id="532"/>
</connections> </connections>
</customObject> </customObject>
<customObject id="420" customClass="NSFontManager"> <customObject id="420" customClass="NSFontManager"/>
<connections>
<action selector="addFontTrait:" destination="390" id="421"/>
<action selector="addFontTrait:" destination="391" id="422"/>
<action selector="modifyFont:" destination="395" id="423"/>
<action selector="modifyFont:" destination="394" id="425"/>
<action selector="orderFrontFontPanel:" destination="389" id="424"/>
</connections>
</customObject>
</objects> </objects>
</document> </document>
@@ -30,222 +30,249 @@
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews> <subviews>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="Lz1-Gs-1lD" customClass="EZAudioPlotGL"> <customView translatesAutoresizingMaskIntoConstraints="NO" id="Lz1-Gs-1lD" customClass="EZAudioPlotGL">
<rect key="frame" x="0.0" y="0.0" width="480" height="146"/> <rect key="frame" x="0.0" y="0.0" width="480" height="366"/>
<subviews>
<box autoresizesSubviews="NO" title="Box" boxType="custom" borderType="none" translatesAutoresizingMaskIntoConstraints="NO" id="woe-PM-Kco">
<rect key="frame" x="0.0" y="124" width="480" height="242"/>
<view key="contentView">
<rect key="frame" x="0.0" y="0.0" width="480" height="242"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2Ma-jj-U3z">
<rect key="frame" x="12" y="172" width="125" height="32"/>
<buttonCell key="cell" type="push" title="Choose File..." bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="KLq-bf-Xkh">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="openFile:" target="-2" id="3QB-hU-LDl"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0eT-7c-7fJ">
<rect key="frame" x="140" y="184" width="36" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" alignment="left" title="Label" id="vXQ-HF-vLX">
<font key="font" metaFont="cellTitle"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="OQp-Lr-dlS">
<rect key="frame" x="12" y="139" width="125" height="32"/>
<buttonCell key="cell" type="push" title="Play" alternateTitle="Pause" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Z2A-7U-sb6">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="play:" target="-2" id="y83-JF-y4e"/>
</connections>
</button>
<segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="bZW-tA-C61">
<rect key="frame" x="335" y="144" width="129" height="24"/>
<constraints>
<constraint firstAttribute="width" constant="125" id="MeF-BC-3tU"/>
</constraints>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="8U1-ER-vPJ">
<font key="font" metaFont="system"/>
<segments>
<segment label="Buffer" selected="YES"/>
<segment label="Rolling" tag="1"/>
</segments>
</segmentedCell>
<connections>
<action selector="changePlotType:" target="-2" id="alU-Rf-22L"/>
</connections>
</segmentedControl>
<slider verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="CFP-v0-TzQ">
<rect key="frame" x="117" y="94" width="269" height="20"/>
<sliderCell key="cell" continuous="YES" alignment="left" maxValue="100" doubleValue="9.3380614657210401" tickMarkPosition="above" sliderType="linear" id="gPc-pN-dmP"/>
<connections>
<action selector="seekToFrame:" target="-2" id="iVY-so-6X2"/>
</connections>
</slider>
<slider verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="vj5-qT-JkR">
<rect key="frame" x="117" y="69" width="269" height="20"/>
<sliderCell key="cell" continuous="YES" alignment="left" minValue="128" maxValue="1024" doubleValue="128" tickMarkPosition="above" sliderType="linear" id="uRZ-Kf-cgJ"/>
<connections>
<action selector="changeRollingHistoryLength:" target="-2" id="eYD-H1-n52"/>
</connections>
</slider>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="7AB-VA-xL3">
<rect key="frame" x="16" y="121" width="53" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Volume:" id="GAa-Hp-OlV">
<font key="font" metaFont="systemBold" size="12"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Fw5-pm-4w0">
<rect key="frame" x="16" y="96" width="58" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Position:" id="9hW-4Z-OEW">
<font key="font" metaFont="systemBold" size="12"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Aa9-nc-WHJ">
<rect key="frame" x="16" y="71" width="96" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Rolling Length:" id="Mfs-zu-sCx">
<font key="font" metaFont="systemBold" size="12"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3ul-3w-l3S">
<rect key="frame" x="390" y="121" width="72" height="16"/>
<constraints>
<constraint firstAttribute="width" constant="68" id="H4m-6Q-Jin"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="0.00" id="vlK-Hb-Yca">
<numberFormatter key="formatter" formatterBehavior="custom10_4" minimumIntegerDigits="1" maximumIntegerDigits="1" minimumFractionDigits="2" maximumFractionDigits="2" id="bBU-vS-tEB">
<metadata>
<real key="inspectorSampleValue" value="44"/>
</metadata>
</numberFormatter>
<font key="font" metaFont="cellTitle"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<slider verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rRH-oS-VV3">
<rect key="frame" x="117" y="119" width="269" height="20"/>
<sliderCell key="cell" continuous="YES" state="on" alignment="left" maxValue="1" doubleValue="0.5" tickMarkPosition="above" sliderType="linear" id="xbX-Ce-da5"/>
<connections>
<action selector="changeVolume:" target="-2" id="iKx-7d-34D"/>
</connections>
</slider>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="vKe-ey-hXI">
<rect key="frame" x="390" y="71" width="72" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="0" id="JiA-3H-vb2">
<numberFormatter key="formatter" formatterBehavior="custom10_4" minimumIntegerDigits="0" maximumIntegerDigits="42" id="AYM-Tu-k5w">
<metadata>
<real key="inspectorSampleValue" value="44"/>
</metadata>
</numberFormatter>
<font key="font" metaFont="cellTitle"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0LV-Bi-dGz" userLabel="microphoneInputPopUpButton">
<rect key="frame" x="16" y="13" width="180" height="26"/>
<constraints>
<constraint firstAttribute="width" constant="175" id="2C5-hq-caw"/>
</constraints>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="a7m-V2-Mw8" id="VLU-oW-zia">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="uLv-18-vra">
<items>
<menuItem title="Item 1" state="on" id="a7m-V2-Mw8"/>
<menuItem title="Item 2" id="qJe-zH-SrZ"/>
<menuItem title="Item 3" id="zlE-dQ-R4x"/>
</items>
</menu>
</popUpButtonCell>
</popUpButton>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="RRH-G6-xkQ">
<rect key="frame" x="16" y="46" width="50" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Output:" id="2OQ-1o-1vp">
<font key="font" metaFont="systemBold" size="12"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="KYm-Io-VNv">
<rect key="frame" x="390" y="96" width="72" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="0" id="gfS-wb-pFu">
<numberFormatter key="formatter" formatterBehavior="custom10_4" minimumIntegerDigits="0" maximumIntegerDigits="42" id="py5-BY-fQN">
<metadata>
<real key="inspectorSampleValue" value="44"/>
</metadata>
</numberFormatter>
<font key="font" metaFont="cellTitle"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button translatesAutoresizingMaskIntoConstraints="NO" id="5xb-MK-C8b">
<rect key="frame" x="442" y="14" width="22" height="18"/>
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="right" alignment="right" state="on" inset="2" id="O83-sN-k0z">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="changeShouldLoop:" target="-2" id="lJN-Pe-JWA"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="TPR-Ta-wlb">
<rect key="frame" x="407" y="16" width="35" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Loop" id="Tok-s1-Gjv">
<font key="font" metaFont="systemBold" size="12"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
</view>
<constraints>
<constraint firstItem="2Ma-jj-U3z" firstAttribute="leading" secondItem="OQp-Lr-dlS" secondAttribute="leading" id="65r-3l-UpC"/>
<constraint firstItem="bZW-tA-C61" firstAttribute="top" secondItem="OQp-Lr-dlS" secondAttribute="top" id="68U-wj-F2c"/>
<constraint firstItem="vKe-ey-hXI" firstAttribute="trailing" secondItem="KYm-Io-VNv" secondAttribute="trailing" id="6r9-KH-IXj"/>
<constraint firstItem="RRH-G6-xkQ" firstAttribute="top" secondItem="Aa9-nc-WHJ" secondAttribute="bottom" constant="9" id="ARD-0e-VM7"/>
<constraint firstItem="rRH-oS-VV3" firstAttribute="baseline" secondItem="7AB-VA-xL3" secondAttribute="baseline" id="ASG-bU-1Vn"/>
<constraint firstItem="KYm-Io-VNv" firstAttribute="leading" secondItem="CFP-v0-TzQ" secondAttribute="trailing" constant="8" symbolic="YES" id="CvB-yq-Kw5"/>
<constraint firstAttribute="trailing" secondItem="bZW-tA-C61" secondAttribute="trailing" constant="18" id="DqD-RM-NfD"/>
<constraint firstItem="0LV-Bi-dGz" firstAttribute="bottom" secondItem="5xb-MK-C8b" secondAttribute="bottom" id="Eo3-Ds-Pga"/>
<constraint firstItem="7AB-VA-xL3" firstAttribute="leading" secondItem="Fw5-pm-4w0" secondAttribute="leading" id="F4w-hP-VrP"/>
<constraint firstItem="vj5-qT-JkR" firstAttribute="baseline" secondItem="Aa9-nc-WHJ" secondAttribute="baseline" id="FyT-aB-ZMd"/>
<constraint firstItem="Fw5-pm-4w0" firstAttribute="top" secondItem="7AB-VA-xL3" secondAttribute="bottom" constant="9" id="HHI-Px-CUW"/>
<constraint firstItem="RRH-G6-xkQ" firstAttribute="leading" secondItem="0LV-Bi-dGz" secondAttribute="leading" id="Hpy-j7-Sn4"/>
<constraint firstItem="0eT-7c-7fJ" firstAttribute="leading" secondItem="2Ma-jj-U3z" secondAttribute="trailing" constant="11" id="I84-HZ-kvK"/>
<constraint firstItem="OQp-Lr-dlS" firstAttribute="trailing" secondItem="2Ma-jj-U3z" secondAttribute="trailing" id="JSU-sV-ydn"/>
<constraint firstAttribute="bottom" secondItem="TPR-Ta-wlb" secondAttribute="bottom" constant="16" id="NHb-lI-raQ"/>
<constraint firstItem="5xb-MK-C8b" firstAttribute="leading" secondItem="TPR-Ta-wlb" secondAttribute="trailing" constant="4" id="OcY-La-p2F"/>
<constraint firstAttribute="bottom" secondItem="0LV-Bi-dGz" secondAttribute="bottom" constant="16" id="Su4-hr-dIF"/>
<constraint firstItem="7AB-VA-xL3" firstAttribute="top" secondItem="OQp-Lr-dlS" secondAttribute="bottom" constant="9" id="U54-Sp-UR9"/>
<constraint firstItem="KYm-Io-VNv" firstAttribute="baseline" secondItem="CFP-v0-TzQ" secondAttribute="baseline" id="WYP-6b-bar"/>
<constraint firstItem="KYm-Io-VNv" firstAttribute="leading" secondItem="vKe-ey-hXI" secondAttribute="leading" id="WkB-Br-hx8"/>
<constraint firstItem="CFP-v0-TzQ" firstAttribute="leading" secondItem="rRH-oS-VV3" secondAttribute="leading" id="YYb-HP-3oI"/>
<constraint firstItem="0LV-Bi-dGz" firstAttribute="top" secondItem="RRH-G6-xkQ" secondAttribute="bottom" constant="9" id="ZW9-Wz-NjB"/>
<constraint firstItem="bZW-tA-C61" firstAttribute="trailing" secondItem="5xb-MK-C8b" secondAttribute="trailing" id="a4v-Da-5OI"/>
<constraint firstItem="vj5-qT-JkR" firstAttribute="leading" secondItem="Aa9-nc-WHJ" secondAttribute="trailing" constant="9" id="bJy-fK-Mgx"/>
<constraint firstItem="rRH-oS-VV3" firstAttribute="baseline" secondItem="3ul-3w-l3S" secondAttribute="baseline" id="bfM-wb-rHx"/>
<constraint firstItem="7AB-VA-xL3" firstAttribute="leading" secondItem="OQp-Lr-dlS" secondAttribute="leading" id="dta-hH-v59"/>
<constraint firstItem="Fw5-pm-4w0" firstAttribute="leading" secondItem="Aa9-nc-WHJ" secondAttribute="leading" id="e3o-sk-vrf"/>
<constraint firstItem="KYm-Io-VNv" firstAttribute="trailing" secondItem="3ul-3w-l3S" secondAttribute="trailing" id="eZB-I6-kCg"/>
<constraint firstAttribute="height" constant="242" id="gIM-zm-GWO"/>
<constraint firstItem="2Ma-jj-U3z" firstAttribute="top" secondItem="0eT-7c-7fJ" secondAttribute="top" id="hRy-MT-4On"/>
<constraint firstItem="OQp-Lr-dlS" firstAttribute="top" secondItem="2Ma-jj-U3z" secondAttribute="bottom" constant="12" symbolic="YES" id="i9A-k5-5Qa"/>
<constraint firstItem="3ul-3w-l3S" firstAttribute="leading" secondItem="KYm-Io-VNv" secondAttribute="leading" id="jNp-BV-Sn1"/>
<constraint firstItem="CFP-v0-TzQ" firstAttribute="leading" secondItem="vj5-qT-JkR" secondAttribute="leading" id="jlK-cp-ukV"/>
<constraint firstAttribute="trailing" secondItem="3ul-3w-l3S" secondAttribute="trailing" constant="20" id="lUf-2h-95p"/>
<constraint firstItem="CFP-v0-TzQ" firstAttribute="baseline" secondItem="Fw5-pm-4w0" secondAttribute="baseline" id="lVm-7v-XFC"/>
<constraint firstItem="Aa9-nc-WHJ" firstAttribute="top" secondItem="Fw5-pm-4w0" secondAttribute="bottom" constant="9" id="mep-8V-ybk"/>
<constraint firstItem="2Ma-jj-U3z" firstAttribute="leading" secondItem="woe-PM-Kco" secondAttribute="leading" constant="18" id="ufW-Fo-f6i"/>
<constraint firstItem="RRH-G6-xkQ" firstAttribute="leading" secondItem="Aa9-nc-WHJ" secondAttribute="leading" id="v6o-ED-CBK"/>
<constraint firstItem="vKe-ey-hXI" firstAttribute="leading" secondItem="vj5-qT-JkR" secondAttribute="trailing" constant="8" symbolic="YES" id="x5P-WA-MWS"/>
<constraint firstItem="3ul-3w-l3S" firstAttribute="leading" secondItem="rRH-oS-VV3" secondAttribute="trailing" constant="8" symbolic="YES" id="yQv-xx-Toh"/>
<constraint firstItem="vj5-qT-JkR" firstAttribute="baseline" secondItem="vKe-ey-hXI" secondAttribute="baseline" id="ysL-Tn-bng"/>
</constraints>
<color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
<color key="fillColor" red="0.0" green="0.0" blue="0.0" alpha="0.70000000000000007" colorSpace="calibratedRGB"/>
</box>
</subviews>
<constraints>
<constraint firstAttribute="trailing" secondItem="woe-PM-Kco" secondAttribute="trailing" id="IfY-Ff-46n"/>
<constraint firstItem="woe-PM-Kco" firstAttribute="leading" secondItem="Lz1-Gs-1lD" secondAttribute="leading" id="UzR-Mq-ujC"/>
<constraint firstItem="woe-PM-Kco" firstAttribute="top" secondItem="Lz1-Gs-1lD" secondAttribute="top" id="yqN-Hf-0Wn"/>
</constraints>
</customView> </customView>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2Ma-jj-U3z">
<rect key="frame" x="12" y="320" width="125" height="32"/>
<buttonCell key="cell" type="push" title="Choose File..." bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="KLq-bf-Xkh">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="openFile:" target="-2" id="3QB-hU-LDl"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0eT-7c-7fJ">
<rect key="frame" x="140" y="332" width="36" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" alignment="left" title="Label" id="vXQ-HF-vLX">
<font key="font" metaFont="cellTitle"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="OQp-Lr-dlS">
<rect key="frame" x="12" y="287" width="125" height="32"/>
<buttonCell key="cell" type="push" title="Play" alternateTitle="Pause" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Z2A-7U-sb6">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="play:" target="-2" id="y83-JF-y4e"/>
</connections>
</button>
<segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="bZW-tA-C61">
<rect key="frame" x="335" y="292" width="129" height="24"/>
<constraints>
<constraint firstAttribute="width" constant="125" id="A3V-sd-Jab"/>
</constraints>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="8U1-ER-vPJ">
<font key="font" metaFont="system"/>
<segments>
<segment label="Buffer" selected="YES"/>
<segment label="Rolling" tag="1"/>
</segments>
</segmentedCell>
<connections>
<action selector="changePlotType:" target="-2" id="alU-Rf-22L"/>
</connections>
</segmentedControl>
<slider verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="CFP-v0-TzQ">
<rect key="frame" x="117" y="242" width="269" height="20"/>
<sliderCell key="cell" continuous="YES" alignment="left" maxValue="100" doubleValue="9.3380614657210401" tickMarkPosition="above" sliderType="linear" id="gPc-pN-dmP"/>
<connections>
<action selector="seekToFrame:" target="-2" id="iVY-so-6X2"/>
</connections>
</slider>
<slider verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="vj5-qT-JkR">
<rect key="frame" x="117" y="217" width="269" height="20"/>
<sliderCell key="cell" continuous="YES" alignment="left" minValue="128" maxValue="1024" doubleValue="128" tickMarkPosition="above" sliderType="linear" id="uRZ-Kf-cgJ"/>
<connections>
<action selector="changeRollingHistoryLength:" target="-2" id="eYD-H1-n52"/>
</connections>
</slider>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="7AB-VA-xL3">
<rect key="frame" x="16" y="269" width="53" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Volume:" id="GAa-Hp-OlV">
<font key="font" metaFont="systemBold" size="12"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Fw5-pm-4w0">
<rect key="frame" x="16" y="244" width="58" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Position:" id="9hW-4Z-OEW">
<font key="font" metaFont="systemBold" size="12"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Aa9-nc-WHJ">
<rect key="frame" x="16" y="219" width="96" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Rolling Length:" id="Mfs-zu-sCx">
<font key="font" metaFont="systemBold" size="12"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3ul-3w-l3S">
<rect key="frame" x="390" y="269" width="72" height="16"/>
<constraints>
<constraint firstAttribute="width" constant="68" id="eyi-2x-AqF"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="0.00" id="vlK-Hb-Yca">
<numberFormatter key="formatter" formatterBehavior="custom10_4" minimumIntegerDigits="1" maximumIntegerDigits="1" minimumFractionDigits="2" maximumFractionDigits="2" id="bBU-vS-tEB">
<metadata>
<real key="inspectorSampleValue" value="44"/>
</metadata>
</numberFormatter>
<font key="font" metaFont="cellTitle"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<slider verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rRH-oS-VV3">
<rect key="frame" x="117" y="267" width="269" height="20"/>
<sliderCell key="cell" continuous="YES" state="on" alignment="left" maxValue="1" doubleValue="0.5" tickMarkPosition="above" sliderType="linear" id="xbX-Ce-da5"/>
<connections>
<action selector="changeVolume:" target="-2" id="iKx-7d-34D"/>
</connections>
</slider>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="vKe-ey-hXI">
<rect key="frame" x="390" y="219" width="72" height="16"/>
<constraints>
<constraint firstAttribute="width" constant="68" id="7dV-vH-IBh"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="0" id="JiA-3H-vb2">
<numberFormatter key="formatter" formatterBehavior="custom10_4" minimumIntegerDigits="0" maximumIntegerDigits="42" id="AYM-Tu-k5w">
<metadata>
<real key="inspectorSampleValue" value="44"/>
</metadata>
</numberFormatter>
<font key="font" metaFont="cellTitle"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0LV-Bi-dGz" userLabel="microphoneInputPopUpButton">
<rect key="frame" x="16" y="161" width="180" height="26"/>
<constraints>
<constraint firstAttribute="width" constant="175" id="fDF-j7-LMD"/>
</constraints>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="a7m-V2-Mw8" id="VLU-oW-zia">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="uLv-18-vra">
<items>
<menuItem title="Item 1" state="on" id="a7m-V2-Mw8"/>
<menuItem title="Item 2" id="qJe-zH-SrZ"/>
<menuItem title="Item 3" id="zlE-dQ-R4x"/>
</items>
</menu>
</popUpButtonCell>
</popUpButton>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="RRH-G6-xkQ">
<rect key="frame" x="16" y="194" width="50" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Output:" id="2OQ-1o-1vp">
<font key="font" metaFont="systemBold" size="12"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="KYm-Io-VNv">
<rect key="frame" x="390" y="244" width="72" height="16"/>
<constraints>
<constraint firstAttribute="width" constant="68" id="fOV-38-VqQ"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="0" id="gfS-wb-pFu">
<numberFormatter key="formatter" formatterBehavior="custom10_4" minimumIntegerDigits="0" maximumIntegerDigits="42" id="py5-BY-fQN">
<metadata>
<real key="inspectorSampleValue" value="44"/>
</metadata>
</numberFormatter>
<font key="font" metaFont="cellTitle"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button translatesAutoresizingMaskIntoConstraints="NO" id="5xb-MK-C8b">
<rect key="frame" x="410" y="162" width="54" height="18"/>
<buttonCell key="cell" type="check" title="Loop" bezelStyle="regularSquare" imagePosition="right" state="on" inset="2" id="O83-sN-k0z">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="changeShouldLoop:" target="-2" id="lJN-Pe-JWA"/>
</connections>
</button>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstItem="vKe-ey-hXI" firstAttribute="baseline" secondItem="vj5-qT-JkR" secondAttribute="baseline" id="03u-fe-Q2r"/> <constraint firstItem="Lz1-Gs-1lD" firstAttribute="leading" secondItem="Xpo-HP-Ost" secondAttribute="leading" id="Edu-Ye-wV8"/>
<constraint firstItem="vj5-qT-JkR" firstAttribute="leading" secondItem="Aa9-nc-WHJ" secondAttribute="trailing" constant="9" id="0QT-jZ-rPL"/> <constraint firstAttribute="bottom" secondItem="Lz1-Gs-1lD" secondAttribute="bottom" id="UV6-Xh-8m0"/>
<constraint firstItem="rRH-oS-VV3" firstAttribute="baseline" secondItem="7AB-VA-xL3" secondAttribute="baseline" id="4WU-L2-5TI"/> <constraint firstItem="Lz1-Gs-1lD" firstAttribute="top" secondItem="Xpo-HP-Ost" secondAttribute="top" id="b4I-Py-1Kt"/>
<constraint firstItem="3ul-3w-l3S" firstAttribute="trailing" secondItem="bZW-tA-C61" secondAttribute="trailing" constant="-2" id="75o-B9-UmY"/> <constraint firstAttribute="trailing" secondItem="Lz1-Gs-1lD" secondAttribute="trailing" id="ges-aT-5L1"/>
<constraint firstItem="vj5-qT-JkR" firstAttribute="baseline" secondItem="Aa9-nc-WHJ" secondAttribute="baseline" id="8ia-fE-3Ej"/>
<constraint firstItem="Lz1-Gs-1lD" firstAttribute="top" secondItem="5xb-MK-C8b" secondAttribute="bottom" constant="18" id="CG6-jk-Mmj"/>
<constraint firstAttribute="bottom" secondItem="Lz1-Gs-1lD" secondAttribute="bottom" id="Cdp-xg-Udu"/>
<constraint firstItem="0eT-7c-7fJ" firstAttribute="leading" secondItem="2Ma-jj-U3z" secondAttribute="trailing" constant="11" id="F4y-lz-2p6"/>
<constraint firstItem="7AB-VA-xL3" firstAttribute="top" secondItem="OQp-Lr-dlS" secondAttribute="bottom" constant="9" id="GbY-7Z-81V"/>
<constraint firstItem="Lz1-Gs-1lD" firstAttribute="leading" secondItem="Xpo-HP-Ost" secondAttribute="leading" id="HW1-t3-mGg"/>
<constraint firstItem="OQp-Lr-dlS" firstAttribute="leading" secondItem="2Ma-jj-U3z" secondAttribute="leading" id="Ira-0b-xzU"/>
<constraint firstItem="rRH-oS-VV3" firstAttribute="baseline" secondItem="3ul-3w-l3S" secondAttribute="baseline" id="KOD-cZ-e52"/>
<constraint firstItem="CFP-v0-TzQ" firstAttribute="baseline" secondItem="Fw5-pm-4w0" secondAttribute="baseline" id="PbC-KG-EzE"/>
<constraint firstItem="2Ma-jj-U3z" firstAttribute="leading" secondItem="Xpo-HP-Ost" secondAttribute="leading" constant="18" id="PiQ-KC-eta"/>
<constraint firstItem="Fw5-pm-4w0" firstAttribute="top" secondItem="7AB-VA-xL3" secondAttribute="bottom" constant="9" id="SPP-F6-chs"/>
<constraint firstItem="vj5-qT-JkR" firstAttribute="trailing" secondItem="CFP-v0-TzQ" secondAttribute="trailing" id="URd-7z-JBO"/>
<constraint firstAttribute="trailing" secondItem="5xb-MK-C8b" secondAttribute="trailing" constant="18" id="WdY-l2-cmp"/>
<constraint firstItem="RRH-G6-xkQ" firstAttribute="leading" secondItem="Xpo-HP-Ost" secondAttribute="leading" constant="18" id="WiW-CU-B7N"/>
<constraint firstAttribute="trailing" secondItem="Lz1-Gs-1lD" secondAttribute="trailing" id="ay9-Mt-iFx"/>
<constraint firstItem="rRH-oS-VV3" firstAttribute="leading" secondItem="CFP-v0-TzQ" secondAttribute="leading" id="cWn-4f-E04"/>
<constraint firstItem="Fw5-pm-4w0" firstAttribute="leading" secondItem="Aa9-nc-WHJ" secondAttribute="leading" id="cnU-xS-2CO"/>
<constraint firstItem="KYm-Io-VNv" firstAttribute="leading" secondItem="3ul-3w-l3S" secondAttribute="leading" id="dac-nA-d4U"/>
<constraint firstItem="0LV-Bi-dGz" firstAttribute="top" secondItem="RRH-G6-xkQ" secondAttribute="bottom" constant="9" id="dnZ-Rx-iiV"/>
<constraint firstItem="Aa9-nc-WHJ" firstAttribute="top" secondItem="Fw5-pm-4w0" secondAttribute="bottom" constant="9" id="fc6-dV-Lxf"/>
<constraint firstItem="vKe-ey-hXI" firstAttribute="leading" secondItem="vj5-qT-JkR" secondAttribute="trailing" constant="8" symbolic="YES" id="fuB-es-weU"/>
<constraint firstItem="2Ma-jj-U3z" firstAttribute="top" secondItem="Xpo-HP-Ost" secondAttribute="top" constant="18" id="hDY-vI-eWO"/>
<constraint firstItem="OQp-Lr-dlS" firstAttribute="trailing" secondItem="2Ma-jj-U3z" secondAttribute="trailing" id="hXB-Gp-9wN"/>
<constraint firstAttribute="trailing" secondItem="bZW-tA-C61" secondAttribute="trailing" constant="18" id="iUL-br-ASL"/>
<constraint firstItem="OQp-Lr-dlS" firstAttribute="top" secondItem="bZW-tA-C61" secondAttribute="top" id="kny-zR-hiF"/>
<constraint firstItem="Lz1-Gs-1lD" firstAttribute="top" secondItem="0LV-Bi-dGz" secondAttribute="bottom" constant="18" id="l6M-H0-bYA"/>
<constraint firstItem="7AB-VA-xL3" firstAttribute="leading" secondItem="OQp-Lr-dlS" secondAttribute="leading" id="omq-Zw-Gvk"/>
<constraint firstItem="KYm-Io-VNv" firstAttribute="baseline" secondItem="CFP-v0-TzQ" secondAttribute="baseline" id="q8e-0e-Xqt"/>
<constraint firstItem="0eT-7c-7fJ" firstAttribute="top" secondItem="2Ma-jj-U3z" secondAttribute="top" id="snu-Ma-cHX"/>
<constraint firstItem="OQp-Lr-dlS" firstAttribute="top" secondItem="2Ma-jj-U3z" secondAttribute="bottom" constant="12" symbolic="YES" id="tkR-bR-msf"/>
<constraint firstItem="0LV-Bi-dGz" firstAttribute="leading" secondItem="Xpo-HP-Ost" secondAttribute="leading" constant="18" id="tmm-8d-ldM"/>
<constraint firstItem="3ul-3w-l3S" firstAttribute="leading" secondItem="rRH-oS-VV3" secondAttribute="trailing" constant="8" id="uF6-oM-5lN"/>
<constraint firstItem="Fw5-pm-4w0" firstAttribute="leading" secondItem="7AB-VA-xL3" secondAttribute="leading" id="vNA-c3-Gcy"/>
<constraint firstItem="RRH-G6-xkQ" firstAttribute="top" secondItem="Aa9-nc-WHJ" secondAttribute="bottom" constant="9" id="w92-Np-SYg"/>
<constraint firstItem="rRH-oS-VV3" firstAttribute="trailing" secondItem="CFP-v0-TzQ" secondAttribute="trailing" id="wdS-Vt-caT"/>
<constraint firstItem="vj5-qT-JkR" firstAttribute="leading" secondItem="CFP-v0-TzQ" secondAttribute="leading" id="wek-S9-BzW"/>
</constraints> </constraints>
<point key="canvasLocation" x="191" y="409"/> <point key="canvasLocation" x="191" y="409"/>
</customView> </customView>
@@ -29,7 +29,6 @@
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{ {
// Swap in our view controller in the window's content view // Swap in our view controller in the window's content view
self.recordViewController = [[RecordViewController alloc] init]; self.recordViewController = [[RecordViewController alloc] init];
// Resize view controller to content view's current size // Resize view controller to content view's current size
@@ -1,100 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="4439" systemVersion="13A451" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4439"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7706"/>
</dependencies> </dependencies>
<objects> <objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication"> <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
<connections> <connections>
<action selector="orderFrontStandardAboutPanel:" destination="58" id="142"/>
<outlet property="delegate" destination="494" id="495"/> <outlet property="delegate" destination="494" id="495"/>
</connections> </connections>
</customObject> </customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"> <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<connections> <customObject id="-3" userLabel="Application" customClass="NSObject"/>
<action selector="alignCenter:" destination="499" id="518"/>
<action selector="alignJustified:" destination="500" id="523"/>
<action selector="alignLeft:" destination="498" id="524"/>
<action selector="alignRight:" destination="501" id="521"/>
<action selector="arrangeInFront:" destination="5" id="39"/>
<action selector="capitalizeWord:" destination="466" id="467"/>
<action selector="centerSelectionInVisibleArea:" destination="210" id="245"/>
<action selector="checkSpelling:" destination="201" id="225"/>
<action selector="clearRecentDocuments:" destination="126" id="127"/>
<action selector="copy:" destination="197" id="224"/>
<action selector="copyFont:" destination="403" id="428"/>
<action selector="copyRuler:" destination="506" id="522"/>
<action selector="cut:" destination="199" id="228"/>
<action selector="delete:" destination="202" id="235"/>
<action selector="hide:" destination="134" id="367"/>
<action selector="hideOtherApplications:" destination="145" id="368"/>
<action selector="loosenKerning:" destination="419" id="435"/>
<action selector="lowerBaseline:" destination="410" id="427"/>
<action selector="lowercaseWord:" destination="465" id="468"/>
<action selector="makeBaseWritingDirectionLeftToRight:" destination="511" id="526"/>
<action selector="makeBaseWritingDirectionNatural:" destination="510" id="525"/>
<action selector="makeBaseWritingDirectionRightToLeft:" destination="512" id="527"/>
<action selector="makeTextWritingDirectionLeftToRight:" destination="516" id="529"/>
<action selector="makeTextWritingDirectionNatural:" destination="515" id="528"/>
<action selector="makeTextWritingDirectionRightToLeft:" destination="517" id="530"/>
<action selector="newDocument:" destination="82" id="373"/>
<action selector="openDocument:" destination="72" id="374"/>
<action selector="orderFrontColorPanel:" destination="401" id="433"/>
<action selector="orderFrontSubstitutionsPanel:" destination="457" id="458"/>
<action selector="paste:" destination="203" id="226"/>
<action selector="pasteAsPlainText:" destination="485" id="486"/>
<action selector="pasteFont:" destination="404" id="436"/>
<action selector="pasteRuler:" destination="507" id="519"/>
<action selector="performClose:" destination="73" id="193"/>
<action selector="performFindPanelAction:" destination="209" id="241"/>
<action selector="performFindPanelAction:" destination="208" id="487"/>
<action selector="performFindPanelAction:" destination="213" id="488"/>
<action selector="performFindPanelAction:" destination="221" id="489"/>
<action selector="performFindPanelAction:" destination="534" id="535"/>
<action selector="performMiniaturize:" destination="23" id="37"/>
<action selector="performZoom:" destination="239" id="240"/>
<action selector="print:" destination="78" id="86"/>
<action selector="raiseBaseline:" destination="409" id="426"/>
<action selector="redo:" destination="215" id="231"/>
<action selector="revertDocumentToSaved:" destination="112" id="364"/>
<action selector="runPageLayout:" destination="77" id="87"/>
<action selector="runToolbarCustomizationPalette:" destination="298" id="365"/>
<action selector="saveDocument:" destination="75" id="362"/>
<action selector="selectAll:" destination="198" id="232"/>
<action selector="showGuessPanel:" destination="204" id="230"/>
<action selector="showHelp:" destination="492" id="493"/>
<action selector="startSpeaking:" destination="196" id="233"/>
<action selector="stopSpeaking:" destination="195" id="227"/>
<action selector="subscript:" destination="408" id="429"/>
<action selector="superscript:" destination="407" id="430"/>
<action selector="tightenKerning:" destination="418" id="431"/>
<action selector="toggleAutomaticDashSubstitution:" destination="460" id="461"/>
<action selector="toggleAutomaticLinkDetection:" destination="354" id="357"/>
<action selector="toggleAutomaticQuoteSubstitution:" destination="351" id="356"/>
<action selector="toggleAutomaticSpellingCorrection:" destination="454" id="456"/>
<action selector="toggleAutomaticTextReplacement:" destination="462" id="463"/>
<action selector="toggleContinuousSpellChecking:" destination="219" id="222"/>
<action selector="toggleGrammarChecking:" destination="346" id="347"/>
<action selector="toggleRuler:" destination="505" id="520"/>
<action selector="toggleSmartInsertDelete:" destination="350" id="355"/>
<action selector="toggleToolbarShown:" destination="297" id="366"/>
<action selector="turnOffKerning:" destination="417" id="441"/>
<action selector="turnOffLigatures:" destination="413" id="440"/>
<action selector="underline:" destination="392" id="432"/>
<action selector="undo:" destination="207" id="223"/>
<action selector="unhideAllApplications:" destination="150" id="370"/>
<action selector="unscript:" destination="406" id="437"/>
<action selector="uppercaseWord:" destination="452" id="464"/>
<action selector="useAllLigatures:" destination="414" id="434"/>
<action selector="useStandardKerning:" destination="416" id="438"/>
<action selector="useStandardLigatures:" destination="412" id="439"/>
</connections>
</customObject>
<customObject id="-3" userLabel="Application">
<connections>
<action selector="terminate:" destination="136" id="449"/>
</connections>
</customObject>
<menu title="AMainMenu" systemMenu="main" id="29"> <menu title="AMainMenu" systemMenu="main" id="29">
<items> <items>
<menuItem title="EZAudioRecordExample" id="56"> <menuItem title="EZAudioRecordExample" id="56">
@@ -102,6 +19,9 @@
<items> <items>
<menuItem title="About EZAudioRecordExample" id="58"> <menuItem title="About EZAudioRecordExample" id="58">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="-2" id="142"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="236"> <menuItem isSeparatorItem="YES" id="236">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
@@ -116,95 +36,211 @@
<menuItem isSeparatorItem="YES" id="144"> <menuItem isSeparatorItem="YES" id="144">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Hide EZAudioRecordExample" keyEquivalent="h" id="134"/> <menuItem title="Hide EZAudioRecordExample" keyEquivalent="h" id="134">
<connections>
<action selector="hide:" target="-1" id="367"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="145"> <menuItem title="Hide Others" keyEquivalent="h" id="145">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="-1" id="368"/>
</connections>
</menuItem>
<menuItem title="Show All" id="150">
<connections>
<action selector="unhideAllApplications:" target="-1" id="370"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Show All" id="150"/>
<menuItem isSeparatorItem="YES" id="149"> <menuItem isSeparatorItem="YES" id="149">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Quit EZAudioRecordExample" keyEquivalent="q" id="136"/> <menuItem title="Quit EZAudioRecordExample" keyEquivalent="q" id="136">
<connections>
<action selector="terminate:" target="-3" id="449"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem title="File" id="83"> <menuItem title="File" id="83">
<menu key="submenu" title="File" id="81"> <menu key="submenu" title="File" id="81">
<items> <items>
<menuItem title="New" keyEquivalent="n" id="82"/> <menuItem title="New" keyEquivalent="n" id="82">
<menuItem title="Open…" keyEquivalent="o" id="72"/> <connections>
<action selector="newDocument:" target="-1" id="373"/>
</connections>
</menuItem>
<menuItem title="Open…" keyEquivalent="o" id="72">
<connections>
<action selector="openDocument:" target="-1" id="374"/>
</connections>
</menuItem>
<menuItem title="Open Recent" id="124"> <menuItem title="Open Recent" id="124">
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="125"> <menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="125">
<items> <items>
<menuItem title="Clear Menu" id="126"/> <menuItem title="Clear Menu" id="126">
<connections>
<action selector="clearRecentDocuments:" target="-1" id="127"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="79"> <menuItem isSeparatorItem="YES" id="79">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Close" keyEquivalent="w" id="73"/> <menuItem title="Close" keyEquivalent="w" id="73">
<menuItem title="Save…" keyEquivalent="s" id="75"/> <connections>
<action selector="performClose:" target="-1" id="193"/>
</connections>
</menuItem>
<menuItem title="Save…" keyEquivalent="s" id="75">
<connections>
<action selector="saveDocument:" target="-1" id="362"/>
</connections>
</menuItem>
<menuItem title="Revert to Saved" id="112"> <menuItem title="Revert to Saved" id="112">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="revertDocumentToSaved:" target="-1" id="364"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="74"> <menuItem isSeparatorItem="YES" id="74">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Page Setup..." keyEquivalent="P" id="77"> <menuItem title="Page Setup..." keyEquivalent="P" id="77">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="runPageLayout:" target="-1" id="87"/>
</connections>
</menuItem>
<menuItem title="Print…" keyEquivalent="p" id="78">
<connections>
<action selector="print:" target="-1" id="86"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Print…" keyEquivalent="p" id="78"/>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem title="Edit" id="217"> <menuItem title="Edit" id="217">
<menu key="submenu" title="Edit" id="205"> <menu key="submenu" title="Edit" id="205">
<items> <items>
<menuItem title="Undo" keyEquivalent="z" id="207"/> <menuItem title="Undo" keyEquivalent="z" id="207">
<connections>
<action selector="undo:" target="-1" id="223"/>
</connections>
</menuItem>
<menuItem title="Redo" keyEquivalent="Z" id="215"> <menuItem title="Redo" keyEquivalent="Z" id="215">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="redo:" target="-1" id="231"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="206"> <menuItem isSeparatorItem="YES" id="206">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Cut" keyEquivalent="x" id="199"/> <menuItem title="Cut" keyEquivalent="x" id="199">
<menuItem title="Copy" keyEquivalent="c" id="197"/> <connections>
<menuItem title="Paste" keyEquivalent="v" id="203"/> <action selector="cut:" target="-1" id="228"/>
</connections>
</menuItem>
<menuItem title="Copy" keyEquivalent="c" id="197">
<connections>
<action selector="copy:" target="-1" id="224"/>
</connections>
</menuItem>
<menuItem title="Paste" keyEquivalent="v" id="203">
<connections>
<action selector="paste:" target="-1" id="226"/>
</connections>
</menuItem>
<menuItem title="Paste and Match Style" keyEquivalent="V" id="485"> <menuItem title="Paste and Match Style" keyEquivalent="V" id="485">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteAsPlainText:" target="-1" id="486"/>
</connections>
</menuItem>
<menuItem title="Delete" id="202">
<connections>
<action selector="delete:" target="-1" id="235"/>
</connections>
</menuItem>
<menuItem title="Select All" keyEquivalent="a" id="198">
<connections>
<action selector="selectAll:" target="-1" id="232"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Delete" id="202"/>
<menuItem title="Select All" keyEquivalent="a" id="198"/>
<menuItem isSeparatorItem="YES" id="214"> <menuItem isSeparatorItem="YES" id="214">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Find" id="218"> <menuItem title="Find" id="218">
<menu key="submenu" title="Find" id="220"> <menu key="submenu" title="Find" id="220">
<items> <items>
<menuItem title="Find…" tag="1" keyEquivalent="f" id="209"/> <menuItem title="Find…" tag="1" keyEquivalent="f" id="209">
<connections>
<action selector="performFindPanelAction:" target="-1" id="241"/>
</connections>
</menuItem>
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="534"> <menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="534">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="-1" id="535"/>
</connections>
</menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="208">
<connections>
<action selector="performFindPanelAction:" target="-1" id="487"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="208"/>
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="213"> <menuItem title="Find Previous" tag="3" keyEquivalent="G" id="213">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="-1" id="488"/>
</connections>
</menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="221">
<connections>
<action selector="performFindPanelAction:" target="-1" id="489"/>
</connections>
</menuItem>
<menuItem title="Jump to Selection" keyEquivalent="j" id="210">
<connections>
<action selector="centerSelectionInVisibleArea:" target="-1" id="245"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="221"/>
<menuItem title="Jump to Selection" keyEquivalent="j" id="210"/>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem title="Spelling and Grammar" id="216"> <menuItem title="Spelling and Grammar" id="216">
<menu key="submenu" title="Spelling and Grammar" id="200"> <menu key="submenu" title="Spelling and Grammar" id="200">
<items> <items>
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="204"/> <menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="204">
<menuItem title="Check Document Now" keyEquivalent=";" id="201"/> <connections>
<action selector="showGuessPanel:" target="-1" id="230"/>
</connections>
</menuItem>
<menuItem title="Check Document Now" keyEquivalent=";" id="201">
<connections>
<action selector="checkSpelling:" target="-1" id="225"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="453"/> <menuItem isSeparatorItem="YES" id="453"/>
<menuItem title="Check Spelling While Typing" id="219"/> <menuItem title="Check Spelling While Typing" id="219">
<menuItem title="Check Grammar With Spelling" id="346"/> <connections>
<action selector="toggleContinuousSpellChecking:" target="-1" id="222"/>
</connections>
</menuItem>
<menuItem title="Check Grammar With Spelling" id="346">
<connections>
<action selector="toggleGrammarChecking:" target="-1" id="347"/>
</connections>
</menuItem>
<menuItem title="Correct Spelling Automatically" id="454"> <menuItem title="Correct Spelling Automatically" id="454">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticSpellingCorrection:" target="-1" id="456"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -214,18 +250,38 @@
<items> <items>
<menuItem title="Show Substitutions" id="457"> <menuItem title="Show Substitutions" id="457">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontSubstitutionsPanel:" target="-1" id="458"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="459"/> <menuItem isSeparatorItem="YES" id="459"/>
<menuItem title="Smart Copy/Paste" tag="1" keyEquivalent="f" id="350"/> <menuItem title="Smart Copy/Paste" tag="1" keyEquivalent="f" id="350">
<menuItem title="Smart Quotes" tag="2" keyEquivalent="g" id="351"/> <connections>
<action selector="toggleSmartInsertDelete:" target="-1" id="355"/>
</connections>
</menuItem>
<menuItem title="Smart Quotes" tag="2" keyEquivalent="g" id="351">
<connections>
<action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="356"/>
</connections>
</menuItem>
<menuItem title="Smart Dashes" id="460"> <menuItem title="Smart Dashes" id="460">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDashSubstitution:" target="-1" id="461"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Smart Links" tag="3" keyEquivalent="G" id="354"> <menuItem title="Smart Links" tag="3" keyEquivalent="G" id="354">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="toggleAutomaticLinkDetection:" target="-1" id="357"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Text Replacement" id="462"> <menuItem title="Text Replacement" id="462">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticTextReplacement:" target="-1" id="463"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -236,12 +292,21 @@
<items> <items>
<menuItem title="Make Upper Case" id="452"> <menuItem title="Make Upper Case" id="452">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="uppercaseWord:" target="-1" id="464"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Make Lower Case" id="465"> <menuItem title="Make Lower Case" id="465">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowercaseWord:" target="-1" id="468"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Capitalize" id="466"> <menuItem title="Capitalize" id="466">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="capitalizeWord:" target="-1" id="467"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -249,8 +314,16 @@
<menuItem title="Speech" id="211"> <menuItem title="Speech" id="211">
<menu key="submenu" title="Speech" id="212"> <menu key="submenu" title="Speech" id="212">
<items> <items>
<menuItem title="Start Speaking" id="196"/> <menuItem title="Start Speaking" id="196">
<menuItem title="Stop Speaking" id="195"/> <connections>
<action selector="startSpeaking:" target="-1" id="233"/>
</connections>
</menuItem>
<menuItem title="Stop Speaking" id="195">
<connections>
<action selector="stopSpeaking:" target="-1" id="227"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
@@ -265,13 +338,37 @@
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Font" systemMenu="font" id="388"> <menu key="submenu" title="Font" systemMenu="font" id="388">
<items> <items>
<menuItem title="Show Fonts" keyEquivalent="t" id="389"/> <menuItem title="Show Fonts" keyEquivalent="t" id="389">
<menuItem title="Bold" tag="2" keyEquivalent="b" id="390"/> <connections>
<menuItem title="Italic" tag="1" keyEquivalent="i" id="391"/> <action selector="orderFrontFontPanel:" target="420" id="424"/>
<menuItem title="Underline" keyEquivalent="u" id="392"/> </connections>
</menuItem>
<menuItem title="Bold" tag="2" keyEquivalent="b" id="390">
<connections>
<action selector="addFontTrait:" target="420" id="421"/>
</connections>
</menuItem>
<menuItem title="Italic" tag="1" keyEquivalent="i" id="391">
<connections>
<action selector="addFontTrait:" target="420" id="422"/>
</connections>
</menuItem>
<menuItem title="Underline" keyEquivalent="u" id="392">
<connections>
<action selector="underline:" target="-1" id="432"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="393"/> <menuItem isSeparatorItem="YES" id="393"/>
<menuItem title="Bigger" tag="3" keyEquivalent="+" id="394"/> <menuItem title="Bigger" tag="3" keyEquivalent="+" id="394">
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="395"/> <connections>
<action selector="modifyFont:" target="420" id="425"/>
</connections>
</menuItem>
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="395">
<connections>
<action selector="modifyFont:" target="420" id="423"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="396"/> <menuItem isSeparatorItem="YES" id="396"/>
<menuItem title="Kern" id="397"> <menuItem title="Kern" id="397">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
@@ -279,15 +376,27 @@
<items> <items>
<menuItem title="Use Default" id="416"> <menuItem title="Use Default" id="416">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardKerning:" target="-1" id="438"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Use None" id="417"> <menuItem title="Use None" id="417">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffKerning:" target="-1" id="441"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Tighten" id="418"> <menuItem title="Tighten" id="418">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="tightenKerning:" target="-1" id="431"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Loosen" id="419"> <menuItem title="Loosen" id="419">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="loosenKerning:" target="-1" id="435"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -298,12 +407,21 @@
<items> <items>
<menuItem title="Use Default" id="412"> <menuItem title="Use Default" id="412">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardLigatures:" target="-1" id="439"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Use None" id="413"> <menuItem title="Use None" id="413">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffLigatures:" target="-1" id="440"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Use All" id="414"> <menuItem title="Use All" id="414">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useAllLigatures:" target="-1" id="434"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -314,30 +432,55 @@
<items> <items>
<menuItem title="Use Default" id="406"> <menuItem title="Use Default" id="406">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unscript:" target="-1" id="437"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Superscript" id="407"> <menuItem title="Superscript" id="407">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="superscript:" target="-1" id="430"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Subscript" id="408"> <menuItem title="Subscript" id="408">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="subscript:" target="-1" id="429"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Raise" id="409"> <menuItem title="Raise" id="409">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="raiseBaseline:" target="-1" id="426"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Lower" id="410"> <menuItem title="Lower" id="410">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowerBaseline:" target="-1" id="427"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="400"/> <menuItem isSeparatorItem="YES" id="400"/>
<menuItem title="Show Colors" keyEquivalent="C" id="401"/> <menuItem title="Show Colors" keyEquivalent="C" id="401">
<connections>
<action selector="orderFrontColorPanel:" target="-1" id="433"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="402"/> <menuItem isSeparatorItem="YES" id="402"/>
<menuItem title="Copy Style" keyEquivalent="c" id="403"> <menuItem title="Copy Style" keyEquivalent="c" id="403">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="copyFont:" target="-1" id="428"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Paste Style" keyEquivalent="v" id="404"> <menuItem title="Paste Style" keyEquivalent="v" id="404">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteFont:" target="-1" id="436"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -346,12 +489,27 @@
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Text" id="497"> <menu key="submenu" title="Text" id="497">
<items> <items>
<menuItem title="Align Left" keyEquivalent="{" id="498"/> <menuItem title="Align Left" keyEquivalent="{" id="498">
<menuItem title="Center" keyEquivalent="|" id="499"/> <connections>
<action selector="alignLeft:" target="-1" id="524"/>
</connections>
</menuItem>
<menuItem title="Center" keyEquivalent="|" id="499">
<connections>
<action selector="alignCenter:" target="-1" id="518"/>
</connections>
</menuItem>
<menuItem title="Justify" id="500"> <menuItem title="Justify" id="500">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="alignJustified:" target="-1" id="523"/>
</connections>
</menuItem>
<menuItem title="Align Right" keyEquivalent="}" id="501">
<connections>
<action selector="alignRight:" target="-1" id="521"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Align Right" keyEquivalent="}" id="501"/>
<menuItem isSeparatorItem="YES" id="502"/> <menuItem isSeparatorItem="YES" id="502"/>
<menuItem title="Writing Direction" id="503"> <menuItem title="Writing Direction" id="503">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
@@ -363,14 +521,23 @@
<menuItem id="510"> <menuItem id="510">
<string key="title"> Default</string> <string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionNatural:" target="-1" id="525"/>
</connections>
</menuItem> </menuItem>
<menuItem id="511"> <menuItem id="511">
<string key="title"> Left to Right</string> <string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionLeftToRight:" target="-1" id="526"/>
</connections>
</menuItem> </menuItem>
<menuItem id="512"> <menuItem id="512">
<string key="title"> Right to Left</string> <string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionRightToLeft:" target="-1" id="527"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="513"/> <menuItem isSeparatorItem="YES" id="513"/>
<menuItem title="Selection" enabled="NO" id="514"> <menuItem title="Selection" enabled="NO" id="514">
@@ -379,14 +546,23 @@
<menuItem id="515"> <menuItem id="515">
<string key="title"> Default</string> <string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionNatural:" target="-1" id="528"/>
</connections>
</menuItem> </menuItem>
<menuItem id="516"> <menuItem id="516">
<string key="title"> Left to Right</string> <string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionLeftToRight:" target="-1" id="529"/>
</connections>
</menuItem> </menuItem>
<menuItem id="517"> <menuItem id="517">
<string key="title"> Right to Left</string> <string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionRightToLeft:" target="-1" id="530"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -394,12 +570,21 @@
<menuItem isSeparatorItem="YES" id="504"/> <menuItem isSeparatorItem="YES" id="504"/>
<menuItem title="Show Ruler" id="505"> <menuItem title="Show Ruler" id="505">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleRuler:" target="-1" id="520"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Copy Ruler" keyEquivalent="c" id="506"> <menuItem title="Copy Ruler" keyEquivalent="c" id="506">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="copyRuler:" target="-1" id="522"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Paste Ruler" keyEquivalent="v" id="507"> <menuItem title="Paste Ruler" keyEquivalent="v" id="507">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="pasteRuler:" target="-1" id="519"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -412,20 +597,39 @@
<items> <items>
<menuItem title="Show Toolbar" keyEquivalent="t" id="297"> <menuItem title="Show Toolbar" keyEquivalent="t" id="297">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="toggleToolbarShown:" target="-1" id="366"/>
</connections>
</menuItem>
<menuItem title="Customize Toolbar…" id="298">
<connections>
<action selector="runToolbarCustomizationPalette:" target="-1" id="365"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Customize Toolbar…" id="298"/>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem title="Window" id="19"> <menuItem title="Window" id="19">
<menu key="submenu" title="Window" systemMenu="window" id="24"> <menu key="submenu" title="Window" systemMenu="window" id="24">
<items> <items>
<menuItem title="Minimize" keyEquivalent="m" id="23"/> <menuItem title="Minimize" keyEquivalent="m" id="23">
<menuItem title="Zoom" id="239"/> <connections>
<action selector="performMiniaturize:" target="-1" id="37"/>
</connections>
</menuItem>
<menuItem title="Zoom" id="239">
<connections>
<action selector="performZoom:" target="-1" id="240"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="92"> <menuItem isSeparatorItem="YES" id="92">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Bring All to Front" id="5"/> <menuItem title="Bring All to Front" id="5">
<connections>
<action selector="arrangeInFront:" target="-1" id="39"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
@@ -433,17 +637,21 @@
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="491"> <menu key="submenu" title="Help" systemMenu="help" id="491">
<items> <items>
<menuItem title="EZAudioRecordExample Help" keyEquivalent="?" id="492"/> <menuItem title="EZAudioRecordExample Help" keyEquivalent="?" id="492">
<connections>
<action selector="showHelp:" target="-1" id="493"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
<window title="EZAudioRecordExample" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="371"> <window title="EZAudioRecordExample" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="371">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/> <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES" fullSizeContentView="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="335" y="390" width="480" height="360"/> <rect key="contentRect" x="335" y="390" width="480" height="360"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1418"/> <rect key="screenRect" x="0.0" y="0.0" width="1440" height="877"/>
<view key="contentView" id="372"> <view key="contentView" id="372">
<rect key="frame" x="0.0" y="0.0" width="480" height="360"/> <rect key="frame" x="0.0" y="0.0" width="480" height="360"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
@@ -454,14 +662,6 @@
<outlet property="window" destination="371" id="532"/> <outlet property="window" destination="371" id="532"/>
</connections> </connections>
</customObject> </customObject>
<customObject id="420" customClass="NSFontManager"> <customObject id="420" customClass="NSFontManager"/>
<connections>
<action selector="addFontTrait:" destination="390" id="421"/>
<action selector="addFontTrait:" destination="391" id="422"/>
<action selector="modifyFont:" destination="395" id="423"/>
<action selector="modifyFont:" destination="394" id="425"/>
<action selector="orderFrontFontPanel:" destination="389" id="424"/>
</connections>
</customObject>
</objects> </objects>
</document> </document>
@@ -28,51 +28,116 @@
// Import EZAudio header // Import EZAudio header
#import "EZAudio.h" #import "EZAudio.h"
// Import AVFoundation to play the file (will save EZAudioFile and EZOutput for separate example)
#import <AVFoundation/AVFoundation.h>
// By default this will record a file to /Users/YOUR_USERNAME/Documents/test.caf // By default this will record a file to /Users/YOUR_USERNAME/Documents/test.caf
#define kAudioFilePath [NSString stringWithFormat:@"%@%@",NSHomeDirectory(),@"/Documents/test.m4a"] #define kAudioFilePath [NSString stringWithFormat:@"%@%@",NSHomeDirectory(),@"/Documents/test.m4a"]
//------------------------------------------------------------------------------
#pragma mark - RecordViewController
//------------------------------------------------------------------------------
/** /**
We will allow this view controller to act as an EZMicrophoneDelegate. This is how we listen for the microphone callback. We will allow this view controller to act as an EZMicrophoneDelegate. This is how we listen for the microphone callback.
*/ */
@interface RecordViewController : NSViewController <EZMicrophoneDelegate,AVAudioPlayerDelegate> @interface RecordViewController : NSViewController <EZAudioPlayerDelegate,
EZMicrophoneDelegate,
EZRecorderDelegate>
/**
The label used to display the current time for recording/playback in the top left
*/
@property (nonatomic, weak) IBOutlet NSTextField *currentTimeLabel;
//------------------------------------------------------------------------------
/** /**
Use a OpenGL based plot to visualize the data coming in Use a OpenGL based plot to visualize the data coming in
*/ */
@property (nonatomic,weak) IBOutlet EZAudioPlotGL *audioPlot; @property (nonatomic, weak) IBOutlet EZAudioPlotGL *recordingAudioPlot;
//------------------------------------------------------------------------------
/** /**
A flag indicating whether we are recording or not A flag indicating whether we are recording or not
*/ */
@property (nonatomic,assign) BOOL isRecording; @property (nonatomic, assign) BOOL isRecording;
//------------------------------------------------------------------------------
/** /**
The microphone component The microphone component
*/ */
@property (nonatomic,strong) EZMicrophone *microphone; @property (nonatomic, strong) EZMicrophone *microphone;
//------------------------------------------------------------------------------
/**
The switch used to toggle the microphone on/off
*/
@property (nonatomic, weak) IBOutlet NSButton *microphoneSwitch;
//------------------------------------------------------------------------------
/**
The audio player that will play the recorded file
*/
@property (nonatomic, strong) EZAudioPlayer *player;
//------------------------------------------------------------------------------
/** /**
The recorder component The recorder component
*/ */
@property (nonatomic,strong) EZRecorder *recorder; @property (nonatomic, strong) EZRecorder *recorder;
//------------------------------------------------------------------------------
/**
The second audio plot used on the top right to display the current playing audio
*/
@property (nonatomic, weak) IBOutlet EZAudioPlot *playingAudioPlot;
//------------------------------------------------------------------------------
/**
The button the user taps to play the recorded audio file
*/
@property (nonatomic, weak) IBOutlet NSButton *playButton;
//------------------------------------------------------------------------------
/**
The label used to display the audio player play state
*/
@property (nonatomic, weak) IBOutlet NSTextField *playingStateLabel;
//------------------------------------------------------------------------------
/**
The switch used to toggle the recording on/off
*/
@property (nonatomic, weak) IBOutlet NSButton *recordSwitch;
//------------------------------------------------------------------------------
#pragma mark - Actions #pragma mark - Actions
//------------------------------------------------------------------------------
/** /**
Stops the recorder and starts playing whatever has been recorded. Stops the recorder and starts playing whatever has been recorded.
*/ */
-(IBAction)playFile:(id)sender; - (IBAction)playFile:(id)sender;
//------------------------------------------------------------------------------
/** /**
Toggles the microphone on and off. When the microphone is on it will send its delegate (aka this view controller) the audio data in various ways (check out the EZMicrophoneDelegate documentation for more details); Toggles the microphone on and off. When the microphone is on it will send its delegate (aka this view controller) the audio data in various ways (check out the EZMicrophoneDelegate documentation for more details);
*/ */
-(IBAction)toggleMicrophone:(id)sender; - (IBAction)toggleMicrophone:(id)sender;
//------------------------------------------------------------------------------
/** /**
Toggles the microphone on and off. When the microphone is on it will send its delegate (aka this view controller) the audio data in various ways (check out the EZMicrophoneDelegate documentation for more details); Toggles the microphone on and off. When the microphone is on it will send its delegate (aka this view controller) the audio data in various ways (check out the EZMicrophoneDelegate documentation for more details);
*/ */
-(IBAction)toggleRecording:(id)sender; - (IBAction)toggleRecording:(id)sender;
@end @end
@@ -25,12 +25,9 @@
#import "RecordViewController.h" #import "RecordViewController.h"
@interface RecordViewController () //------------------------------------------------------------------------------
@property (nonatomic,strong) AVAudioPlayer *audioPlayer; #pragma mark - RecordViewController (Implementation)
@property (nonatomic,weak) IBOutlet NSButton *microphoneToggle; //------------------------------------------------------------------------------
@property (nonatomic,weak) IBOutlet NSButton *playButton;
@property (nonatomic,weak) IBOutlet NSButton *recordingToggle;
@end
@implementation RecordViewController @implementation RecordViewController
@@ -38,51 +35,105 @@
#pragma mark - Customize the Audio Plot #pragma mark - Customize the Audio Plot
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
-(void)awakeFromNib - (void)awakeFromNib
{ {
/*
Customizing the audio plot's look
*/
// Background color
self.audioPlot.backgroundColor = [NSColor colorWithCalibratedRed: 0.984 green: 0.71 blue: 0.365 alpha: 1];
// Waveform color
self.audioPlot.color = [NSColor colorWithCalibratedRed: 1.000 green: 1.000 blue: 1.000 alpha: 1];
// Plot type
self.audioPlot.plotType = EZPlotTypeRolling;
// Fill
self.audioPlot.shouldFill = YES;
// Mirror
self.audioPlot.shouldMirror = YES;
// Configure the play button //
[self.playButton setHidden:YES]; // Customizing the audio plot that'll show the current microphone input/recording
//
self.recordingAudioPlot.backgroundColor = [NSColor colorWithRed: 0.984 green: 0.71 blue: 0.365 alpha: 1];
self.recordingAudioPlot.color = [NSColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
self.recordingAudioPlot.plotType = EZPlotTypeRolling;
self.recordingAudioPlot.shouldFill = YES;
self.recordingAudioPlot.shouldMirror = YES;
/* //
Start the microphone // Customizing the audio plot that'll show the playback
*/ //
self.microphone = [EZMicrophone microphoneWithDelegate:self startsImmediately:YES]; self.playingAudioPlot.color = [NSColor whiteColor];
self.playingAudioPlot.plotType = EZPlotTypeRolling;
self.playingAudioPlot.shouldFill = YES;
self.playingAudioPlot.shouldMirror = YES;
self.playingAudioPlot.gain = 2.5f;
// Create an instance of the microphone and tell it to use this view controller instance as the delegate
self.microphone = [EZMicrophone microphoneWithDelegate:self];
self.player = [EZAudioPlayer audioPlayerWithDelegate:self];
//
// Initialize UI components
//
[self setTitle:@"Microphone On" forButton:self.microphoneSwitch];
[self setTitle:@"Not Recording" forButton:self.recordSwitch];
self.playingStateLabel.stringValue = @"Not Playing";
self.playButton.enabled = NO;
//
// Setup notifications
//
[self setupNotifications];
//
// Start the microphone
//
[self.microphone startFetchingAudio];
}
//------------------------------------------------------------------------------
- (void)setupNotifications
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerDidChangePlayState:)
name:EZAudioPlayerDidChangePlayStateNotification
object:self.player];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerDidReachEndOfFile:)
name:EZAudioPlayerDidReachEndOfFileNotification
object:self.player];
}
//------------------------------------------------------------------------------
#pragma mark - Notifications
//------------------------------------------------------------------------------
- (void)playerDidChangePlayState:(NSNotification *)notification
{
EZAudioPlayer *player = [notification object];
BOOL isPlaying = [player isPlaying];
if (isPlaying)
{
self.recorder.delegate = nil;
}
self.playingStateLabel.stringValue = isPlaying ? @"Playing" : @"Not Playing";
self.playingAudioPlot.hidden = !isPlaying;
}
//------------------------------------------------------------------------------
- (void)playerDidReachEndOfFile:(NSNotification *)notification
{
[self.playingAudioPlot clear];
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#pragma mark - Actions #pragma mark - Actions
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
-(void)playFile:(id)sender - (void)playFile:(id)sender
{ {
// //
// Update microphone state // Update microphone state
// //
[self.microphone stopFetchingAudio]; [self.microphone stopFetchingAudio];
self.microphoneToggle.state = NSOffState;
[self.microphoneToggle setEnabled:NO];
// //
// Update recording state // Update recording state
// //
self.isRecording = NO; self.isRecording = NO;
self.recordingToggle.state = NSOffState; [self setTitle:@"Not Recording" forButton:self.recordSwitch];
[self.recordingToggle setEnabled:NO]; self.recordSwitch.state = NSOffState;
// //
// Close the audio file // Close the audio file
@@ -92,94 +143,90 @@
[self.recorder closeAudioFile]; [self.recorder closeAudioFile];
} }
// EZAudioFile *audioFile = [EZAudioFile audioFileWithURL:[NSURL fileURLWithPath:kAudioFilePath]];
// Create audio player [self.player playAudioFile:audioFile];
//
if (self.audioPlayer)
{
if (self.audioPlayer.playing) [self.audioPlayer stop];
self.audioPlayer = nil;
}
NSError *err;
self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:kAudioFilePath]
error:&err];
[self.audioPlayer play];
self.audioPlayer.delegate = self;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
-(void)toggleMicrophone:(id)sender - (void)toggleMicrophone:(id)sender
{ {
switch([sender state]) [self.player pause];
NSInteger state = [(NSButton *)sender state];
if (state == NSOffState)
{ {
case NSOffState: [self.microphone stopFetchingAudio];
[self.microphone stopFetchingAudio]; }
break; else
case NSOnState: {
[self.microphone startFetchingAudio]; [self.microphone startFetchingAudio];
break;
default:
break;
} }
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
-(void)toggleRecording:(id)sender - (void)toggleRecording:(id)sender
{ {
[self.playButton setHidden:NO]; [self.player pause];
switch( [sender state])
NSInteger state = [(NSButton *)sender state];
if (state == NSOnState)
{ {
case NSOffState: //
[self.recorder closeAudioFile]; // Create the recorder
break; //
case NSOnState: [self.microphone startFetchingAudio];
/* self.recorder = [EZRecorder recorderWithURL:[NSURL fileURLWithPath:kAudioFilePath]
Create the recorder clientFormat:[self.microphone audioStreamBasicDescription]
*/ fileType:EZRecorderFileTypeM4A
self.recorder = [EZRecorder recorderWithDestinationURL:[NSURL fileURLWithPath:kAudioFilePath] delegate:self];
sourceFormat:[self.microphone audioStreamBasicDescription] self.playButton.enabled = YES;
destinationFileType:EZRecorderFileTypeM4A];
break;
default:
break;
} }
self.isRecording = (BOOL)[sender state]; self.isRecording = state;
NSString *title = self.isRecording ? @"Recording" : @"Not Recording";
[self setTitle:title forButton:self.recordSwitch];
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#pragma mark - EZMicrophoneDelegate #pragma mark - EZMicrophoneDelegate
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
- (void)microphone:(EZMicrophone *)microphone changedPlayingState:(BOOL)isPlaying
{
self.microphoneSwitch.state = isPlaying;
NSString *title = isPlaying ? @"Microphone On" : @"Microphone Off";
[self setTitle:title forButton:self.microphoneSwitch];
}
//------------------------------------------------------------------------------
#warning Thread Safety #warning Thread Safety
// Note that any callback that provides streamed audio data (like streaming microphone input) happens on a separate audio thread that should not be blocked. When we feed audio data into any of the UI components we need to explicity create a GCD block on the main thread to properly get the UI to work. // Note that any callback that provides streamed audio data (like streaming microphone input) happens on a separate audio thread that should not be blocked. When we feed audio data into any of the UI components we need to explicity create a GCD block on the main thread to properly get the UI to work.
-(void)microphone:(EZMicrophone *)microphone - (void) microphone:(EZMicrophone *)microphone
hasAudioReceived:(float **)buffer hasAudioReceived:(float **)buffer
withBufferSize:(UInt32)bufferSize withBufferSize:(UInt32)bufferSize
withNumberOfChannels:(UInt32)numberOfChannels withNumberOfChannels:(UInt32)numberOfChannels
{ {
// Getting audio data as an array of float buffer arrays. What does that mean? Because the audio is coming in as a stereo signal the data is split into a left and right channel. So buffer[0] corresponds to the float* data for the left channel while buffer[1] corresponds to the float* data for the right channel. // Getting audio data as an array of float buffer arrays. What does that mean? Because the audio is coming in as a stereo signal the data is split into a left and right channel. So buffer[0] corresponds to the float* data for the left channel while buffer[1] corresponds to the float* data for the right channel.
// See the Thread Safety warning above, but in a nutshell these callbacks happen on a separate audio thread. We wrap any UI updating in a GCD block on the main thread to avoid blocking that audio flow. // See the Thread Safety warning above, but in a nutshell these callbacks happen on a separate audio thread. We wrap any UI updating in a GCD block on the main thread to avoid blocking that audio flow.
__weak typeof (self) weakSelf = self; __weak typeof (self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(),^{ dispatch_async(dispatch_get_main_queue(), ^{
// All the audio plot needs is the buffer data (float*) and the size. Internally the audio plot will handle all the drawing related code, history management, and freeing its own resources. Hence, one badass line of code gets you a pretty plot :) // All the audio plot needs is the buffer data (float*) and the size. Internally the audio plot will handle all the drawing related code, history management, and freeing its own resources. Hence, one badass line of code gets you a pretty plot :)
[weakSelf.audioPlot updateBuffer:buffer[0] [weakSelf.recordingAudioPlot updateBuffer:buffer[0]
withBufferSize:bufferSize]; withBufferSize:bufferSize];
}); });
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// Append the microphone data coming as a AudioBufferList with the specified buffer size to the recorder - (void) microphone:(EZMicrophone *)microphone
-(void) microphone:(EZMicrophone *)microphone
hasBufferList:(AudioBufferList *)bufferList hasBufferList:(AudioBufferList *)bufferList
withBufferSize:(UInt32)bufferSize withBufferSize:(UInt32)bufferSize
withNumberOfChannels:(UInt32)numberOfChannels withNumberOfChannels:(UInt32)numberOfChannels
{ {
// Getting audio data as a buffer list that can be directly fed into the EZRecorder. This is happening on the audio thread - any UI updating needs a GCD main queue block. // Getting audio data as a buffer list that can be directly fed into the EZRecorder. This is happening on the audio thread - any UI updating needs a GCD main queue block. This will keep appending data to the tail of the audio file.
if (self.isRecording) if (self.isRecording)
{ {
[self.recorder appendDataFromBufferList:bufferList [self.recorder appendDataFromBufferList:bufferList
@@ -188,26 +235,65 @@ withNumberOfChannels:(UInt32)numberOfChannels
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#pragma mark - AVAudioPlayerDelegate #pragma mark - EZRecorderDelegate
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
/* - (void)recorderDidClose:(EZRecorder *)recorder
Occurs when the audio player instance completes playback
*/
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player
successfully:(BOOL)flag
{ {
// Update microphone state recorder.delegate = nil;
self.microphoneToggle.state = NSOnState;
[self.microphoneToggle setEnabled:YES];
[self.microphone startFetchingAudio];
// Update recording state
self.isRecording = NO;
self.recordingToggle.state = NSOffState;
[self.recordingToggle setEnabled:YES];
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
- (void)recorderUpdatedCurrentTime:(EZRecorder *)recorder
{
__weak typeof (self) weakSelf = self;
NSString *formattedCurrentTime = [recorder formattedCurrentTime];
dispatch_async(dispatch_get_main_queue(), ^{
weakSelf.currentTimeLabel.stringValue = formattedCurrentTime;
});
}
//------------------------------------------------------------------------------
#pragma mark - EZAudioPlayerDelegate
//------------------------------------------------------------------------------
- (void) audioPlayer:(EZAudioPlayer *)audioPlayer
playedAudio:(float **)buffer
withBufferSize:(UInt32)bufferSize
withNumberOfChannels:(UInt32)numberOfChannels
inAudioFile:(EZAudioFile *)audioFile
{
__weak typeof (self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf.playingAudioPlot updateBuffer:buffer[0]
withBufferSize:bufferSize];
});
}
//------------------------------------------------------------------------------
- (void)audioPlayer:(EZAudioPlayer *)audioPlayer
updatedPosition:(SInt64)framePosition
inAudioFile:(EZAudioFile *)audioFile
{
__weak typeof (self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
weakSelf.currentTimeLabel.stringValue = [audioPlayer formattedCurrentTime];
});
}
//------------------------------------------------------------------------------
#pragma mark - Utility
//------------------------------------------------------------------------------
- (void)setTitle:(NSString *)title forButton:(NSButton *)button
{
NSDictionary *attributes = @{ NSForegroundColorAttributeName : [NSColor whiteColor] };
NSAttributedString *attributedTitle = [[NSAttributedString alloc] initWithString:title
attributes:attributes];
button.attributedTitle = attributedTitle;
button.attributedAlternateTitle = attributedTitle;
}
@end @end
@@ -1,78 +1,115 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="4514" systemVersion="13A603" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<deployment version="1070" identifier="macosx"/> <deployment version="1070" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4514"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7706"/>
</dependencies> </dependencies>
<objects> <objects>
<customObject id="-2" userLabel="File's Owner" customClass="RecordViewController"> <customObject id="-2" userLabel="File's Owner" customClass="RecordViewController">
<connections> <connections>
<outlet property="audioPlot" destination="dEs-hA-819" id="iGa-BH-xLn"/> <outlet property="currentTimeLabel" destination="HxF-TY-fDR" id="zwj-XE-ACe"/>
<outlet property="microphoneToggle" destination="642-4u-aBm" id="FYB-Cp-aPB"/> <outlet property="microphoneSwitch" destination="642-4u-aBm" id="AEv-nm-gLS"/>
<outlet property="playButton" destination="y4R-NE-icG" id="1FP-aQ-BcB"/> <outlet property="playButton" destination="y4R-NE-icG" id="kHv-iM-mCt"/>
<outlet property="recordingToggle" destination="fdr-L4-Y6i" id="dYX-uf-6YS"/> <outlet property="playingAudioPlot" destination="1yQ-Hd-JGR" id="Hdj-Ve-A6A"/>
<outlet property="playingStateLabel" destination="y9d-HG-0Rl" id="YXg-yy-Q9t"/>
<outlet property="recordSwitch" destination="fdr-L4-Y6i" id="Rqe-gC-lfh"/>
<outlet property="recordingAudioPlot" destination="dEs-hA-819" id="ACe-8h-ags"/>
<outlet property="view" destination="178-e9-GIn" id="bPz-Je-f18"/> <outlet property="view" destination="178-e9-GIn" id="bPz-Je-f18"/>
</connections> </connections>
</customObject> </customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application"/> <customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customView id="178-e9-GIn"> <customView id="178-e9-GIn">
<rect key="frame" x="0.0" y="0.0" width="480" height="272"/> <rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews> <subviews>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="dEs-hA-819" customClass="EZAudioPlotGL"> <customView translatesAutoresizingMaskIntoConstraints="NO" id="dEs-hA-819" customClass="EZAudioPlotGL">
<rect key="frame" x="0.0" y="42" width="480" height="230"/> <rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <subviews>
</customView> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="HxF-TY-fDR">
<button misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="642-4u-aBm"> <rect key="frame" x="16" y="193" width="85" height="39"/>
<rect key="frame" x="18" y="14" width="119" height="18"/> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="00:00" id="Lsu-38-RnW">
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <font key="font" size="32" name="HelveticaNeue-Light"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="1yQ-Hd-JGR" customClass="EZAudioPlot">
<rect key="frame" x="108" y="193" width="354" height="39"/>
<constraints>
<constraint firstAttribute="height" constant="39" id="Cmv-Of-yxB"/>
</constraints>
</customView>
<button translatesAutoresizingMaskIntoConstraints="NO" id="642-4u-aBm">
<rect key="frame" x="16" y="39" width="119" height="18"/>
<constraints>
<constraint firstAttribute="width" constant="115" id="jzA-c9-gss"/>
</constraints>
<buttonCell key="cell" type="check" title="Microphone Off" alternateTitle="Microphone On" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="WpM-g2-QmU">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="toggleMicrophone:" target="-2" id="xOT-qg-D3j"/>
</connections>
</button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="fdr-L4-Y6i">
<rect key="frame" x="16" y="16" width="113" height="18"/>
<constraints>
<constraint firstAttribute="width" constant="109" id="XVw-ku-8Kp"/>
</constraints>
<buttonCell key="cell" type="check" title="Not Recording" alternateTitle="Recording" bezelStyle="regularSquare" imagePosition="left" inset="2" id="j1l-ue-yI3">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="toggleRecording:" target="-2" id="WKw-uD-CBI"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="y4R-NE-icG">
<rect key="frame" x="12" y="57" width="65" height="32"/>
<constraints>
<constraint firstAttribute="width" constant="53" id="eH3-f2-ls9"/>
</constraints>
<buttonCell key="cell" type="push" title="Play" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="XoV-qX-N9x">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="playFile:" target="-2" id="jrd-yg-pvq"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="y9d-HG-0Rl">
<rect key="frame" x="76" y="66" width="75" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Not Playing" id="pde-yf-Cac">
<font key="font" metaFont="system"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints> <constraints>
<constraint firstAttribute="height" constant="14" id="DDP-K1-hjt"/> <constraint firstItem="y9d-HG-0Rl" firstAttribute="leading" secondItem="y4R-NE-icG" secondAttribute="trailing" constant="7" id="5mU-Du-t8h"/>
<constraint firstItem="fdr-L4-Y6i" firstAttribute="leading" secondItem="642-4u-aBm" secondAttribute="leading" id="6HB-Yz-Xlv"/>
<constraint firstItem="642-4u-aBm" firstAttribute="top" secondItem="y4R-NE-icG" secondAttribute="bottom" constant="9" id="Gvt-cc-iCu"/>
<constraint firstItem="1yQ-Hd-JGR" firstAttribute="top" secondItem="dEs-hA-819" secondAttribute="top" constant="40" id="MIg-OC-dHb"/>
<constraint firstItem="1yQ-Hd-JGR" firstAttribute="leading" secondItem="HxF-TY-fDR" secondAttribute="trailing" constant="9" id="Njb-Oj-SUR"/>
<constraint firstItem="HxF-TY-fDR" firstAttribute="leading" secondItem="dEs-hA-819" secondAttribute="leading" constant="18" id="Y42-ar-917"/>
<constraint firstItem="y4R-NE-icG" firstAttribute="leading" secondItem="HxF-TY-fDR" secondAttribute="leading" id="eTn-op-NgF"/>
<constraint firstItem="fdr-L4-Y6i" firstAttribute="top" secondItem="642-4u-aBm" secondAttribute="bottom" constant="9" id="hb4-N7-xjI"/>
<constraint firstItem="HxF-TY-fDR" firstAttribute="top" secondItem="dEs-hA-819" secondAttribute="top" constant="40" id="kI9-mf-kW9"/>
<constraint firstAttribute="trailing" secondItem="1yQ-Hd-JGR" secondAttribute="trailing" constant="18" id="nDj-wc-gcG"/>
<constraint firstAttribute="bottom" secondItem="fdr-L4-Y6i" secondAttribute="bottom" constant="18" id="nGo-GX-HZv"/>
<constraint firstItem="642-4u-aBm" firstAttribute="leading" secondItem="y4R-NE-icG" secondAttribute="leading" id="o9C-CB-nEE"/>
<constraint firstItem="y9d-HG-0Rl" firstAttribute="centerY" secondItem="y4R-NE-icG" secondAttribute="centerY" id="xIG-Gy-XOS"/>
</constraints> </constraints>
<buttonCell key="cell" type="check" title="Microphone Off" alternateTitle="Microphone On" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="WpM-g2-QmU"> </customView>
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="toggleMicrophone:" target="-2" id="xOT-qg-D3j"/>
</connections>
</button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="fdr-L4-Y6i">
<rect key="frame" x="349" y="14" width="113" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Not Recording" alternateTitle="Recording" bezelStyle="regularSquare" imagePosition="left" inset="2" id="j1l-ue-yI3">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="toggleRecording:" target="-2" id="WKw-uD-CBI"/>
</connections>
</button>
<button verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="y4R-NE-icG">
<rect key="frame" x="137" y="6" width="65" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="Play" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="XoV-qX-N9x">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="playFile:" target="-2" id="jrd-yg-pvq"/>
</connections>
</button>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstAttribute="bottom" secondItem="642-4u-aBm" secondAttribute="bottom" constant="16" id="LIb-Ej-46s"/> <constraint firstAttribute="trailing" secondItem="dEs-hA-819" secondAttribute="trailing" id="R5V-pX-y9Q"/>
<constraint firstAttribute="bottom" secondItem="fdr-L4-Y6i" secondAttribute="bottom" constant="16" id="Pvr-gh-o7q"/> <constraint firstItem="dEs-hA-819" firstAttribute="leading" secondItem="178-e9-GIn" secondAttribute="leading" id="UWT-Ay-DKN"/>
<constraint firstItem="642-4u-aBm" firstAttribute="top" secondItem="dEs-hA-819" secondAttribute="bottom" constant="12" id="QgB-Ty-AN0"/> <constraint firstAttribute="bottom" secondItem="dEs-hA-819" secondAttribute="bottom" id="ajJ-h2-gWy"/>
<constraint firstAttribute="bottom" secondItem="y4R-NE-icG" secondAttribute="bottom" constant="13" id="UX6-ts-w3M"/> <constraint firstItem="dEs-hA-819" firstAttribute="top" secondItem="178-e9-GIn" secondAttribute="top" id="h1e-yD-I80"/>
<constraint firstItem="y4R-NE-icG" firstAttribute="leading" secondItem="642-4u-aBm" secondAttribute="trailing" constant="8" id="ZbS-5O-fFJ"/>
<constraint firstItem="642-4u-aBm" firstAttribute="leading" secondItem="178-e9-GIn" secondAttribute="leading" constant="20" id="ayr-0v-aOC"/>
<constraint firstAttribute="trailing" secondItem="fdr-L4-Y6i" secondAttribute="trailing" constant="20" id="hk9-I9-9g5"/>
<constraint firstItem="dEs-hA-819" firstAttribute="top" secondItem="178-e9-GIn" secondAttribute="top" id="mv6-AK-Cz4"/>
<constraint firstAttribute="trailing" secondItem="dEs-hA-819" secondAttribute="trailing" id="tqk-1H-SZ4"/>
<constraint firstItem="y4R-NE-icG" firstAttribute="top" secondItem="dEs-hA-819" secondAttribute="bottom" constant="8" id="xzp-cM-xAL"/>
<constraint firstItem="dEs-hA-819" firstAttribute="leading" secondItem="178-e9-GIn" secondAttribute="leading" id="yvm-d3-Fzl"/>
</constraints> </constraints>
</customView> </customView>
</objects> </objects>
@@ -1,100 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="4439" systemVersion="13A451" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4439"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7706"/>
</dependencies> </dependencies>
<objects> <objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication"> <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
<connections> <connections>
<action selector="orderFrontStandardAboutPanel:" destination="58" id="142"/>
<outlet property="delegate" destination="494" id="495"/> <outlet property="delegate" destination="494" id="495"/>
</connections> </connections>
</customObject> </customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"> <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<connections> <customObject id="-3" userLabel="Application" customClass="NSObject"/>
<action selector="alignCenter:" destination="499" id="518"/>
<action selector="alignJustified:" destination="500" id="523"/>
<action selector="alignLeft:" destination="498" id="524"/>
<action selector="alignRight:" destination="501" id="521"/>
<action selector="arrangeInFront:" destination="5" id="39"/>
<action selector="capitalizeWord:" destination="466" id="467"/>
<action selector="centerSelectionInVisibleArea:" destination="210" id="245"/>
<action selector="checkSpelling:" destination="201" id="225"/>
<action selector="clearRecentDocuments:" destination="126" id="127"/>
<action selector="copy:" destination="197" id="224"/>
<action selector="copyFont:" destination="403" id="428"/>
<action selector="copyRuler:" destination="506" id="522"/>
<action selector="cut:" destination="199" id="228"/>
<action selector="delete:" destination="202" id="235"/>
<action selector="hide:" destination="134" id="367"/>
<action selector="hideOtherApplications:" destination="145" id="368"/>
<action selector="loosenKerning:" destination="419" id="435"/>
<action selector="lowerBaseline:" destination="410" id="427"/>
<action selector="lowercaseWord:" destination="465" id="468"/>
<action selector="makeBaseWritingDirectionLeftToRight:" destination="511" id="526"/>
<action selector="makeBaseWritingDirectionNatural:" destination="510" id="525"/>
<action selector="makeBaseWritingDirectionRightToLeft:" destination="512" id="527"/>
<action selector="makeTextWritingDirectionLeftToRight:" destination="516" id="529"/>
<action selector="makeTextWritingDirectionNatural:" destination="515" id="528"/>
<action selector="makeTextWritingDirectionRightToLeft:" destination="517" id="530"/>
<action selector="newDocument:" destination="82" id="373"/>
<action selector="openDocument:" destination="72" id="374"/>
<action selector="orderFrontColorPanel:" destination="401" id="433"/>
<action selector="orderFrontSubstitutionsPanel:" destination="457" id="458"/>
<action selector="paste:" destination="203" id="226"/>
<action selector="pasteAsPlainText:" destination="485" id="486"/>
<action selector="pasteFont:" destination="404" id="436"/>
<action selector="pasteRuler:" destination="507" id="519"/>
<action selector="performClose:" destination="73" id="193"/>
<action selector="performFindPanelAction:" destination="209" id="241"/>
<action selector="performFindPanelAction:" destination="208" id="487"/>
<action selector="performFindPanelAction:" destination="213" id="488"/>
<action selector="performFindPanelAction:" destination="221" id="489"/>
<action selector="performFindPanelAction:" destination="534" id="535"/>
<action selector="performMiniaturize:" destination="23" id="37"/>
<action selector="performZoom:" destination="239" id="240"/>
<action selector="print:" destination="78" id="86"/>
<action selector="raiseBaseline:" destination="409" id="426"/>
<action selector="redo:" destination="215" id="231"/>
<action selector="revertDocumentToSaved:" destination="112" id="364"/>
<action selector="runPageLayout:" destination="77" id="87"/>
<action selector="runToolbarCustomizationPalette:" destination="298" id="365"/>
<action selector="saveDocument:" destination="75" id="362"/>
<action selector="selectAll:" destination="198" id="232"/>
<action selector="showGuessPanel:" destination="204" id="230"/>
<action selector="showHelp:" destination="492" id="493"/>
<action selector="startSpeaking:" destination="196" id="233"/>
<action selector="stopSpeaking:" destination="195" id="227"/>
<action selector="subscript:" destination="408" id="429"/>
<action selector="superscript:" destination="407" id="430"/>
<action selector="tightenKerning:" destination="418" id="431"/>
<action selector="toggleAutomaticDashSubstitution:" destination="460" id="461"/>
<action selector="toggleAutomaticLinkDetection:" destination="354" id="357"/>
<action selector="toggleAutomaticQuoteSubstitution:" destination="351" id="356"/>
<action selector="toggleAutomaticSpellingCorrection:" destination="454" id="456"/>
<action selector="toggleAutomaticTextReplacement:" destination="462" id="463"/>
<action selector="toggleContinuousSpellChecking:" destination="219" id="222"/>
<action selector="toggleGrammarChecking:" destination="346" id="347"/>
<action selector="toggleRuler:" destination="505" id="520"/>
<action selector="toggleSmartInsertDelete:" destination="350" id="355"/>
<action selector="toggleToolbarShown:" destination="297" id="366"/>
<action selector="turnOffKerning:" destination="417" id="441"/>
<action selector="turnOffLigatures:" destination="413" id="440"/>
<action selector="underline:" destination="392" id="432"/>
<action selector="undo:" destination="207" id="223"/>
<action selector="unhideAllApplications:" destination="150" id="370"/>
<action selector="unscript:" destination="406" id="437"/>
<action selector="uppercaseWord:" destination="452" id="464"/>
<action selector="useAllLigatures:" destination="414" id="434"/>
<action selector="useStandardKerning:" destination="416" id="438"/>
<action selector="useStandardLigatures:" destination="412" id="439"/>
</connections>
</customObject>
<customObject id="-3" userLabel="Application">
<connections>
<action selector="terminate:" destination="136" id="449"/>
</connections>
</customObject>
<menu title="AMainMenu" systemMenu="main" id="29"> <menu title="AMainMenu" systemMenu="main" id="29">
<items> <items>
<menuItem title="EZAudioWaveformFromFileExample" id="56"> <menuItem title="EZAudioWaveformFromFileExample" id="56">
@@ -102,6 +19,9 @@
<items> <items>
<menuItem title="About EZAudioWaveformFromFileExample" id="58"> <menuItem title="About EZAudioWaveformFromFileExample" id="58">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="-2" id="142"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="236"> <menuItem isSeparatorItem="YES" id="236">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
@@ -116,95 +36,211 @@
<menuItem isSeparatorItem="YES" id="144"> <menuItem isSeparatorItem="YES" id="144">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Hide EZAudioWaveformFromFileExample" keyEquivalent="h" id="134"/> <menuItem title="Hide EZAudioWaveformFromFileExample" keyEquivalent="h" id="134">
<connections>
<action selector="hide:" target="-1" id="367"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="145"> <menuItem title="Hide Others" keyEquivalent="h" id="145">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="-1" id="368"/>
</connections>
</menuItem>
<menuItem title="Show All" id="150">
<connections>
<action selector="unhideAllApplications:" target="-1" id="370"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Show All" id="150"/>
<menuItem isSeparatorItem="YES" id="149"> <menuItem isSeparatorItem="YES" id="149">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Quit EZAudioWaveformFromFileExample" keyEquivalent="q" id="136"/> <menuItem title="Quit EZAudioWaveformFromFileExample" keyEquivalent="q" id="136">
<connections>
<action selector="terminate:" target="-3" id="449"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem title="File" id="83"> <menuItem title="File" id="83">
<menu key="submenu" title="File" id="81"> <menu key="submenu" title="File" id="81">
<items> <items>
<menuItem title="New" keyEquivalent="n" id="82"/> <menuItem title="New" keyEquivalent="n" id="82">
<menuItem title="Open…" keyEquivalent="o" id="72"/> <connections>
<action selector="newDocument:" target="-1" id="373"/>
</connections>
</menuItem>
<menuItem title="Open…" keyEquivalent="o" id="72">
<connections>
<action selector="openDocument:" target="-1" id="374"/>
</connections>
</menuItem>
<menuItem title="Open Recent" id="124"> <menuItem title="Open Recent" id="124">
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="125"> <menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="125">
<items> <items>
<menuItem title="Clear Menu" id="126"/> <menuItem title="Clear Menu" id="126">
<connections>
<action selector="clearRecentDocuments:" target="-1" id="127"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="79"> <menuItem isSeparatorItem="YES" id="79">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Close" keyEquivalent="w" id="73"/> <menuItem title="Close" keyEquivalent="w" id="73">
<menuItem title="Save…" keyEquivalent="s" id="75"/> <connections>
<action selector="performClose:" target="-1" id="193"/>
</connections>
</menuItem>
<menuItem title="Save…" keyEquivalent="s" id="75">
<connections>
<action selector="saveDocument:" target="-1" id="362"/>
</connections>
</menuItem>
<menuItem title="Revert to Saved" id="112"> <menuItem title="Revert to Saved" id="112">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="revertDocumentToSaved:" target="-1" id="364"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="74"> <menuItem isSeparatorItem="YES" id="74">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Page Setup..." keyEquivalent="P" id="77"> <menuItem title="Page Setup..." keyEquivalent="P" id="77">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="runPageLayout:" target="-1" id="87"/>
</connections>
</menuItem>
<menuItem title="Print…" keyEquivalent="p" id="78">
<connections>
<action selector="print:" target="-1" id="86"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Print…" keyEquivalent="p" id="78"/>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem title="Edit" id="217"> <menuItem title="Edit" id="217">
<menu key="submenu" title="Edit" id="205"> <menu key="submenu" title="Edit" id="205">
<items> <items>
<menuItem title="Undo" keyEquivalent="z" id="207"/> <menuItem title="Undo" keyEquivalent="z" id="207">
<connections>
<action selector="undo:" target="-1" id="223"/>
</connections>
</menuItem>
<menuItem title="Redo" keyEquivalent="Z" id="215"> <menuItem title="Redo" keyEquivalent="Z" id="215">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="redo:" target="-1" id="231"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="206"> <menuItem isSeparatorItem="YES" id="206">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Cut" keyEquivalent="x" id="199"/> <menuItem title="Cut" keyEquivalent="x" id="199">
<menuItem title="Copy" keyEquivalent="c" id="197"/> <connections>
<menuItem title="Paste" keyEquivalent="v" id="203"/> <action selector="cut:" target="-1" id="228"/>
</connections>
</menuItem>
<menuItem title="Copy" keyEquivalent="c" id="197">
<connections>
<action selector="copy:" target="-1" id="224"/>
</connections>
</menuItem>
<menuItem title="Paste" keyEquivalent="v" id="203">
<connections>
<action selector="paste:" target="-1" id="226"/>
</connections>
</menuItem>
<menuItem title="Paste and Match Style" keyEquivalent="V" id="485"> <menuItem title="Paste and Match Style" keyEquivalent="V" id="485">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteAsPlainText:" target="-1" id="486"/>
</connections>
</menuItem>
<menuItem title="Delete" id="202">
<connections>
<action selector="delete:" target="-1" id="235"/>
</connections>
</menuItem>
<menuItem title="Select All" keyEquivalent="a" id="198">
<connections>
<action selector="selectAll:" target="-1" id="232"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Delete" id="202"/>
<menuItem title="Select All" keyEquivalent="a" id="198"/>
<menuItem isSeparatorItem="YES" id="214"> <menuItem isSeparatorItem="YES" id="214">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Find" id="218"> <menuItem title="Find" id="218">
<menu key="submenu" title="Find" id="220"> <menu key="submenu" title="Find" id="220">
<items> <items>
<menuItem title="Find…" tag="1" keyEquivalent="f" id="209"/> <menuItem title="Find…" tag="1" keyEquivalent="f" id="209">
<connections>
<action selector="performFindPanelAction:" target="-1" id="241"/>
</connections>
</menuItem>
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="534"> <menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="534">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="-1" id="535"/>
</connections>
</menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="208">
<connections>
<action selector="performFindPanelAction:" target="-1" id="487"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="208"/>
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="213"> <menuItem title="Find Previous" tag="3" keyEquivalent="G" id="213">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="-1" id="488"/>
</connections>
</menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="221">
<connections>
<action selector="performFindPanelAction:" target="-1" id="489"/>
</connections>
</menuItem>
<menuItem title="Jump to Selection" keyEquivalent="j" id="210">
<connections>
<action selector="centerSelectionInVisibleArea:" target="-1" id="245"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="221"/>
<menuItem title="Jump to Selection" keyEquivalent="j" id="210"/>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem title="Spelling and Grammar" id="216"> <menuItem title="Spelling and Grammar" id="216">
<menu key="submenu" title="Spelling and Grammar" id="200"> <menu key="submenu" title="Spelling and Grammar" id="200">
<items> <items>
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="204"/> <menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="204">
<menuItem title="Check Document Now" keyEquivalent=";" id="201"/> <connections>
<action selector="showGuessPanel:" target="-1" id="230"/>
</connections>
</menuItem>
<menuItem title="Check Document Now" keyEquivalent=";" id="201">
<connections>
<action selector="checkSpelling:" target="-1" id="225"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="453"/> <menuItem isSeparatorItem="YES" id="453"/>
<menuItem title="Check Spelling While Typing" id="219"/> <menuItem title="Check Spelling While Typing" id="219">
<menuItem title="Check Grammar With Spelling" id="346"/> <connections>
<action selector="toggleContinuousSpellChecking:" target="-1" id="222"/>
</connections>
</menuItem>
<menuItem title="Check Grammar With Spelling" id="346">
<connections>
<action selector="toggleGrammarChecking:" target="-1" id="347"/>
</connections>
</menuItem>
<menuItem title="Correct Spelling Automatically" id="454"> <menuItem title="Correct Spelling Automatically" id="454">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticSpellingCorrection:" target="-1" id="456"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -214,18 +250,38 @@
<items> <items>
<menuItem title="Show Substitutions" id="457"> <menuItem title="Show Substitutions" id="457">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontSubstitutionsPanel:" target="-1" id="458"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="459"/> <menuItem isSeparatorItem="YES" id="459"/>
<menuItem title="Smart Copy/Paste" tag="1" keyEquivalent="f" id="350"/> <menuItem title="Smart Copy/Paste" tag="1" keyEquivalent="f" id="350">
<menuItem title="Smart Quotes" tag="2" keyEquivalent="g" id="351"/> <connections>
<action selector="toggleSmartInsertDelete:" target="-1" id="355"/>
</connections>
</menuItem>
<menuItem title="Smart Quotes" tag="2" keyEquivalent="g" id="351">
<connections>
<action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="356"/>
</connections>
</menuItem>
<menuItem title="Smart Dashes" id="460"> <menuItem title="Smart Dashes" id="460">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDashSubstitution:" target="-1" id="461"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Smart Links" tag="3" keyEquivalent="G" id="354"> <menuItem title="Smart Links" tag="3" keyEquivalent="G" id="354">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="toggleAutomaticLinkDetection:" target="-1" id="357"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Text Replacement" id="462"> <menuItem title="Text Replacement" id="462">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticTextReplacement:" target="-1" id="463"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -236,12 +292,21 @@
<items> <items>
<menuItem title="Make Upper Case" id="452"> <menuItem title="Make Upper Case" id="452">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="uppercaseWord:" target="-1" id="464"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Make Lower Case" id="465"> <menuItem title="Make Lower Case" id="465">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowercaseWord:" target="-1" id="468"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Capitalize" id="466"> <menuItem title="Capitalize" id="466">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="capitalizeWord:" target="-1" id="467"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -249,8 +314,16 @@
<menuItem title="Speech" id="211"> <menuItem title="Speech" id="211">
<menu key="submenu" title="Speech" id="212"> <menu key="submenu" title="Speech" id="212">
<items> <items>
<menuItem title="Start Speaking" id="196"/> <menuItem title="Start Speaking" id="196">
<menuItem title="Stop Speaking" id="195"/> <connections>
<action selector="startSpeaking:" target="-1" id="233"/>
</connections>
</menuItem>
<menuItem title="Stop Speaking" id="195">
<connections>
<action selector="stopSpeaking:" target="-1" id="227"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
@@ -265,13 +338,37 @@
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Font" systemMenu="font" id="388"> <menu key="submenu" title="Font" systemMenu="font" id="388">
<items> <items>
<menuItem title="Show Fonts" keyEquivalent="t" id="389"/> <menuItem title="Show Fonts" keyEquivalent="t" id="389">
<menuItem title="Bold" tag="2" keyEquivalent="b" id="390"/> <connections>
<menuItem title="Italic" tag="1" keyEquivalent="i" id="391"/> <action selector="orderFrontFontPanel:" target="420" id="424"/>
<menuItem title="Underline" keyEquivalent="u" id="392"/> </connections>
</menuItem>
<menuItem title="Bold" tag="2" keyEquivalent="b" id="390">
<connections>
<action selector="addFontTrait:" target="420" id="421"/>
</connections>
</menuItem>
<menuItem title="Italic" tag="1" keyEquivalent="i" id="391">
<connections>
<action selector="addFontTrait:" target="420" id="422"/>
</connections>
</menuItem>
<menuItem title="Underline" keyEquivalent="u" id="392">
<connections>
<action selector="underline:" target="-1" id="432"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="393"/> <menuItem isSeparatorItem="YES" id="393"/>
<menuItem title="Bigger" tag="3" keyEquivalent="+" id="394"/> <menuItem title="Bigger" tag="3" keyEquivalent="+" id="394">
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="395"/> <connections>
<action selector="modifyFont:" target="420" id="425"/>
</connections>
</menuItem>
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="395">
<connections>
<action selector="modifyFont:" target="420" id="423"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="396"/> <menuItem isSeparatorItem="YES" id="396"/>
<menuItem title="Kern" id="397"> <menuItem title="Kern" id="397">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
@@ -279,15 +376,27 @@
<items> <items>
<menuItem title="Use Default" id="416"> <menuItem title="Use Default" id="416">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardKerning:" target="-1" id="438"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Use None" id="417"> <menuItem title="Use None" id="417">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffKerning:" target="-1" id="441"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Tighten" id="418"> <menuItem title="Tighten" id="418">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="tightenKerning:" target="-1" id="431"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Loosen" id="419"> <menuItem title="Loosen" id="419">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="loosenKerning:" target="-1" id="435"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -298,12 +407,21 @@
<items> <items>
<menuItem title="Use Default" id="412"> <menuItem title="Use Default" id="412">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardLigatures:" target="-1" id="439"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Use None" id="413"> <menuItem title="Use None" id="413">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffLigatures:" target="-1" id="440"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Use All" id="414"> <menuItem title="Use All" id="414">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useAllLigatures:" target="-1" id="434"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -314,30 +432,55 @@
<items> <items>
<menuItem title="Use Default" id="406"> <menuItem title="Use Default" id="406">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unscript:" target="-1" id="437"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Superscript" id="407"> <menuItem title="Superscript" id="407">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="superscript:" target="-1" id="430"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Subscript" id="408"> <menuItem title="Subscript" id="408">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="subscript:" target="-1" id="429"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Raise" id="409"> <menuItem title="Raise" id="409">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="raiseBaseline:" target="-1" id="426"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Lower" id="410"> <menuItem title="Lower" id="410">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowerBaseline:" target="-1" id="427"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="400"/> <menuItem isSeparatorItem="YES" id="400"/>
<menuItem title="Show Colors" keyEquivalent="C" id="401"/> <menuItem title="Show Colors" keyEquivalent="C" id="401">
<connections>
<action selector="orderFrontColorPanel:" target="-1" id="433"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="402"/> <menuItem isSeparatorItem="YES" id="402"/>
<menuItem title="Copy Style" keyEquivalent="c" id="403"> <menuItem title="Copy Style" keyEquivalent="c" id="403">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="copyFont:" target="-1" id="428"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Paste Style" keyEquivalent="v" id="404"> <menuItem title="Paste Style" keyEquivalent="v" id="404">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteFont:" target="-1" id="436"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -346,12 +489,27 @@
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Text" id="497"> <menu key="submenu" title="Text" id="497">
<items> <items>
<menuItem title="Align Left" keyEquivalent="{" id="498"/> <menuItem title="Align Left" keyEquivalent="{" id="498">
<menuItem title="Center" keyEquivalent="|" id="499"/> <connections>
<action selector="alignLeft:" target="-1" id="524"/>
</connections>
</menuItem>
<menuItem title="Center" keyEquivalent="|" id="499">
<connections>
<action selector="alignCenter:" target="-1" id="518"/>
</connections>
</menuItem>
<menuItem title="Justify" id="500"> <menuItem title="Justify" id="500">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="alignJustified:" target="-1" id="523"/>
</connections>
</menuItem>
<menuItem title="Align Right" keyEquivalent="}" id="501">
<connections>
<action selector="alignRight:" target="-1" id="521"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Align Right" keyEquivalent="}" id="501"/>
<menuItem isSeparatorItem="YES" id="502"/> <menuItem isSeparatorItem="YES" id="502"/>
<menuItem title="Writing Direction" id="503"> <menuItem title="Writing Direction" id="503">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
@@ -363,14 +521,23 @@
<menuItem id="510"> <menuItem id="510">
<string key="title"> Default</string> <string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionNatural:" target="-1" id="525"/>
</connections>
</menuItem> </menuItem>
<menuItem id="511"> <menuItem id="511">
<string key="title"> Left to Right</string> <string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionLeftToRight:" target="-1" id="526"/>
</connections>
</menuItem> </menuItem>
<menuItem id="512"> <menuItem id="512">
<string key="title"> Right to Left</string> <string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionRightToLeft:" target="-1" id="527"/>
</connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="513"/> <menuItem isSeparatorItem="YES" id="513"/>
<menuItem title="Selection" enabled="NO" id="514"> <menuItem title="Selection" enabled="NO" id="514">
@@ -379,14 +546,23 @@
<menuItem id="515"> <menuItem id="515">
<string key="title"> Default</string> <string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionNatural:" target="-1" id="528"/>
</connections>
</menuItem> </menuItem>
<menuItem id="516"> <menuItem id="516">
<string key="title"> Left to Right</string> <string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionLeftToRight:" target="-1" id="529"/>
</connections>
</menuItem> </menuItem>
<menuItem id="517"> <menuItem id="517">
<string key="title"> Right to Left</string> <string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionRightToLeft:" target="-1" id="530"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -394,12 +570,21 @@
<menuItem isSeparatorItem="YES" id="504"/> <menuItem isSeparatorItem="YES" id="504"/>
<menuItem title="Show Ruler" id="505"> <menuItem title="Show Ruler" id="505">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleRuler:" target="-1" id="520"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Copy Ruler" keyEquivalent="c" id="506"> <menuItem title="Copy Ruler" keyEquivalent="c" id="506">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="copyRuler:" target="-1" id="522"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Paste Ruler" keyEquivalent="v" id="507"> <menuItem title="Paste Ruler" keyEquivalent="v" id="507">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="pasteRuler:" target="-1" id="519"/>
</connections>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
@@ -412,20 +597,39 @@
<items> <items>
<menuItem title="Show Toolbar" keyEquivalent="t" id="297"> <menuItem title="Show Toolbar" keyEquivalent="t" id="297">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="toggleToolbarShown:" target="-1" id="366"/>
</connections>
</menuItem>
<menuItem title="Customize Toolbar…" id="298">
<connections>
<action selector="runToolbarCustomizationPalette:" target="-1" id="365"/>
</connections>
</menuItem> </menuItem>
<menuItem title="Customize Toolbar…" id="298"/>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
<menuItem title="Window" id="19"> <menuItem title="Window" id="19">
<menu key="submenu" title="Window" systemMenu="window" id="24"> <menu key="submenu" title="Window" systemMenu="window" id="24">
<items> <items>
<menuItem title="Minimize" keyEquivalent="m" id="23"/> <menuItem title="Minimize" keyEquivalent="m" id="23">
<menuItem title="Zoom" id="239"/> <connections>
<action selector="performMiniaturize:" target="-1" id="37"/>
</connections>
</menuItem>
<menuItem title="Zoom" id="239">
<connections>
<action selector="performZoom:" target="-1" id="240"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="92"> <menuItem isSeparatorItem="YES" id="92">
<modifierMask key="keyEquivalentModifierMask" command="YES"/> <modifierMask key="keyEquivalentModifierMask" command="YES"/>
</menuItem> </menuItem>
<menuItem title="Bring All to Front" id="5"/> <menuItem title="Bring All to Front" id="5">
<connections>
<action selector="arrangeInFront:" target="-1" id="39"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
@@ -433,17 +637,21 @@
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="491"> <menu key="submenu" title="Help" systemMenu="help" id="491">
<items> <items>
<menuItem title="EZAudioWaveformFromFileExample Help" keyEquivalent="?" id="492"/> <menuItem title="EZAudioWaveformFromFileExample Help" keyEquivalent="?" id="492">
<connections>
<action selector="showHelp:" target="-1" id="493"/>
</connections>
</menuItem>
</items> </items>
</menu> </menu>
</menuItem> </menuItem>
</items> </items>
</menu> </menu>
<window title="EZAudioWaveformFromFileExample" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="371"> <window title="EZAudioWaveformFromFileExample" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="371">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/> <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES" fullSizeContentView="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="335" y="390" width="480" height="360"/> <rect key="contentRect" x="335" y="390" width="480" height="360"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1418"/> <rect key="screenRect" x="0.0" y="0.0" width="1440" height="877"/>
<view key="contentView" id="372"> <view key="contentView" id="372">
<rect key="frame" x="0.0" y="0.0" width="480" height="360"/> <rect key="frame" x="0.0" y="0.0" width="480" height="360"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
@@ -454,14 +662,6 @@
<outlet property="window" destination="371" id="532"/> <outlet property="window" destination="371" id="532"/>
</connections> </connections>
</customObject> </customObject>
<customObject id="420" customClass="NSFontManager"> <customObject id="420" customClass="NSFontManager"/>
<connections>
<action selector="addFontTrait:" destination="390" id="421"/>
<action selector="addFontTrait:" destination="391" id="422"/>
<action selector="modifyFont:" destination="395" id="423"/>
<action selector="modifyFont:" destination="394" id="425"/>
<action selector="orderFrontFontPanel:" destination="389" id="424"/>
</connections>
</customObject>
</objects> </objects>
</document> </document>
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7702" systemVersion="14C109" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<deployment version="1070" identifier="macosx"/> <deployment version="1070" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7702"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7706"/>
</dependencies> </dependencies>
<objects> <objects>
<customObject id="-2" userLabel="File's Owner" customClass="WaveformFromFileViewController"> <customObject id="-2" userLabel="File's Owner" customClass="WaveformFromFileViewController">
@@ -19,53 +19,76 @@
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews> <subviews>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="gA7-R7-vbt" customClass="EZAudioPlot"> <customView translatesAutoresizingMaskIntoConstraints="NO" id="gA7-R7-vbt" customClass="EZAudioPlot">
<rect key="frame" x="0.0" y="0.0" width="480" height="211"/> <rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
</customView> <subviews>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="xHD-WQ-u4W"> <box autoresizesSubviews="NO" title="Box" boxType="custom" borderType="none" translatesAutoresizingMaskIntoConstraints="NO" id="dH6-TL-MVT">
<rect key="frame" x="14" y="224" width="125" height="32"/> <rect key="frame" x="0.0" y="193" width="480" height="79"/>
<view key="contentView">
<rect key="frame" x="0.0" y="0.0" width="480" height="79"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="xHD-WQ-u4W">
<rect key="frame" x="10" y="11" width="125" height="32"/>
<constraints>
<constraint firstAttribute="width" constant="113" id="b31-eU-mqu"/>
</constraints>
<buttonCell key="cell" type="push" title="Choose File..." bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="7er-Dd-Gmx">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="openFile:" target="-2" id="oIG-3z-prU"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="zS7-9z-YB1">
<rect key="frame" x="137" y="22" width="213" height="17"/>
<textFieldCell key="cell" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="Label" id="jWL-Kx-s9B">
<font key="font" metaFont="system"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2Q5-5T-qQ4">
<rect key="frame" x="371" y="11" width="97" height="32"/>
<constraints>
<constraint firstAttribute="width" constant="85" id="Xin-4w-yLk"/>
</constraints>
<buttonCell key="cell" type="push" title="Snapshot" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="8ht-Cu-65q">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="snapshot:" target="-2" id="RLS-Qr-Gbu"/>
</connections>
</button>
</subviews>
</view>
<constraints>
<constraint firstItem="zS7-9z-YB1" firstAttribute="leading" secondItem="xHD-WQ-u4W" secondAttribute="trailing" constant="10" id="7yh-7q-axR"/>
<constraint firstItem="2Q5-5T-qQ4" firstAttribute="leading" secondItem="zS7-9z-YB1" secondAttribute="trailing" constant="29" id="D3d-Ou-qaP"/>
<constraint firstAttribute="trailing" secondItem="2Q5-5T-qQ4" secondAttribute="trailing" constant="18" id="D9F-H4-mlu"/>
<constraint firstItem="zS7-9z-YB1" firstAttribute="top" secondItem="2Q5-5T-qQ4" secondAttribute="top" id="E0b-6r-tgF"/>
<constraint firstItem="xHD-WQ-u4W" firstAttribute="leading" secondItem="dH6-TL-MVT" secondAttribute="leading" constant="16" id="Ieb-er-Yqf"/>
<constraint firstItem="2Q5-5T-qQ4" firstAttribute="centerY" secondItem="dH6-TL-MVT" secondAttribute="centerY" constant="11" id="TG9-81-0jp"/>
<constraint firstItem="xHD-WQ-u4W" firstAttribute="top" secondItem="dH6-TL-MVT" secondAttribute="top" constant="40" id="aDV-Ry-Inv"/>
<constraint firstItem="2Q5-5T-qQ4" firstAttribute="baseline" secondItem="xHD-WQ-u4W" secondAttribute="baseline" id="yAV-WB-sKN"/>
</constraints>
<color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
<color key="fillColor" red="0.0" green="0.0" blue="0.0" alpha="0.69999999999999996" colorSpace="calibratedRGB"/>
</box>
</subviews>
<constraints> <constraints>
<constraint firstAttribute="width" constant="113" id="0jv-eA-dSV"/> <constraint firstItem="dH6-TL-MVT" firstAttribute="leading" secondItem="gA7-R7-vbt" secondAttribute="leading" id="JWF-3n-y1m"/>
<constraint firstAttribute="height" constant="21" id="1Yn-bF-mfb"/> <constraint firstAttribute="trailing" secondItem="dH6-TL-MVT" secondAttribute="trailing" id="c6J-c1-evB"/>
<constraint firstItem="dH6-TL-MVT" firstAttribute="top" secondItem="gA7-R7-vbt" secondAttribute="top" id="yIc-KE-eyZ"/>
</constraints> </constraints>
<buttonCell key="cell" type="push" title="Choose File..." bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="7er-Dd-Gmx"> </customView>
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="openFile:" target="-2" id="oIG-3z-prU"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="zS7-9z-YB1">
<rect key="frame" x="141" y="235" width="213" height="17"/>
<textFieldCell key="cell" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="Label" id="jWL-Kx-s9B">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="2Q5-5T-qQ4">
<rect key="frame" x="375" y="224" width="97" height="32"/>
<buttonCell key="cell" type="push" title="Snapshot" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="8ht-Cu-65q">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="snapshot:" target="-2" id="RLS-Qr-Gbu"/>
</connections>
</button>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstItem="zS7-9z-YB1" firstAttribute="leading" secondItem="xHD-WQ-u4W" secondAttribute="trailing" constant="10" id="4RW-fI-JJs"/> <constraint firstItem="gA7-R7-vbt" firstAttribute="leading" secondItem="0tP-1Y-eJu" secondAttribute="leading" id="1uQ-PM-GXF"/>
<constraint firstItem="2Q5-5T-qQ4" firstAttribute="top" secondItem="0tP-1Y-eJu" secondAttribute="top" constant="20" id="E3b-p3-BoQ"/> <constraint firstAttribute="trailing" secondItem="gA7-R7-vbt" secondAttribute="trailing" id="w4s-bY-9Vz"/>
<constraint firstAttribute="trailing" relation="lessThanOrEqual" secondItem="zS7-9z-YB1" secondAttribute="trailing" constant="20" id="NTC-UB-Fma"/> <constraint firstItem="gA7-R7-vbt" firstAttribute="top" secondItem="0tP-1Y-eJu" secondAttribute="top" id="wko-ZW-xTr"/>
<constraint firstAttribute="trailing" secondItem="gA7-R7-vbt" secondAttribute="trailing" id="Tsg-V9-2HL"/> <constraint firstAttribute="bottom" secondItem="gA7-R7-vbt" secondAttribute="bottom" id="ynB-p6-1In"/>
<constraint firstItem="gA7-R7-vbt" firstAttribute="leading" secondItem="0tP-1Y-eJu" secondAttribute="leading" id="WAi-gw-Gx4"/>
<constraint firstItem="gA7-R7-vbt" firstAttribute="top" secondItem="xHD-WQ-u4W" secondAttribute="bottom" constant="20" id="fLd-J2-pdv"/>
<constraint firstItem="zS7-9z-YB1" firstAttribute="top" secondItem="0tP-1Y-eJu" secondAttribute="top" constant="20" id="gjc-Xh-3J0"/>
<constraint firstItem="xHD-WQ-u4W" firstAttribute="leading" secondItem="0tP-1Y-eJu" secondAttribute="leading" constant="20" id="ide-qF-Q25"/>
<constraint firstItem="xHD-WQ-u4W" firstAttribute="top" secondItem="0tP-1Y-eJu" secondAttribute="top" constant="20" id="iiM-ji-9ME"/>
<constraint firstAttribute="trailing" secondItem="2Q5-5T-qQ4" secondAttribute="trailing" constant="14" id="j3N-CF-2Rt"/>
<constraint firstAttribute="bottom" secondItem="gA7-R7-vbt" secondAttribute="bottom" id="nf1-Zn-U5V"/>
</constraints> </constraints>
</customView> </customView>
</objects> </objects>
@@ -24,7 +24,7 @@
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#pragma mark - Customize the Audio Plot #pragma mark - Setup
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
- (void)viewDidLoad - (void)viewDidLoad
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7702" systemVersion="14C109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="uAJ-Uz-eFq"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="uAJ-Uz-eFq">
<dependencies> <dependencies>
<deployment identifier="iOS"/> <deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
<capability name="Constraints to layout margins" minToolsVersion="6.0"/> <capability name="Constraints to layout margins" minToolsVersion="6.0"/>
</dependencies> </dependencies>
<scenes> <scenes>
@@ -506,6 +506,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "EZAudioFFTExample/EZAudioFFTExample-Prefix.pch"; GCC_PREFIX_HEADER = "EZAudioFFTExample/EZAudioFFTExample-Prefix.pch";
INFOPLIST_FILE = "EZAudioFFTExample/EZAudioFFTExample-Info.plist"; INFOPLIST_FILE = "EZAudioFFTExample/EZAudioFFTExample-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app; WRAPPER_EXTENSION = app;
}; };
@@ -519,6 +520,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "EZAudioFFTExample/EZAudioFFTExample-Prefix.pch"; GCC_PREFIX_HEADER = "EZAudioFFTExample/EZAudioFFTExample-Prefix.pch";
INFOPLIST_FILE = "EZAudioFFTExample/EZAudioFFTExample-Info.plist"; INFOPLIST_FILE = "EZAudioFFTExample/EZAudioFFTExample-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app; WRAPPER_EXTENSION = app;
}; };
@@ -502,6 +502,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "EZAudioOpenGLWaveformExample/EZAudioOpenGLWaveformExample-Prefix.pch"; GCC_PREFIX_HEADER = "EZAudioOpenGLWaveformExample/EZAudioOpenGLWaveformExample-Prefix.pch";
INFOPLIST_FILE = "EZAudioOpenGLWaveformExample/EZAudioOpenGLWaveformExample-Info.plist"; INFOPLIST_FILE = "EZAudioOpenGLWaveformExample/EZAudioOpenGLWaveformExample-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app; WRAPPER_EXTENSION = app;
}; };
@@ -515,6 +516,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "EZAudioOpenGLWaveformExample/EZAudioOpenGLWaveformExample-Prefix.pch"; GCC_PREFIX_HEADER = "EZAudioOpenGLWaveformExample/EZAudioOpenGLWaveformExample-Prefix.pch";
INFOPLIST_FILE = "EZAudioOpenGLWaveformExample/EZAudioOpenGLWaveformExample-Info.plist"; INFOPLIST_FILE = "EZAudioOpenGLWaveformExample/EZAudioOpenGLWaveformExample-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app; WRAPPER_EXTENSION = app;
}; };
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="1v1-63-VYU"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="1v1-63-VYU">
<dependencies> <dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
<capability name="Constraints to layout margins" minToolsVersion="6.0"/> <capability name="Constraints to layout margins" minToolsVersion="6.0"/>
</dependencies> </dependencies>
@@ -24,7 +24,7 @@
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#pragma mark - Customize the Audio Plot #pragma mark - Setup
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
- (void)viewDidLoad - (void)viewDidLoad
@@ -502,6 +502,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "EZAudioPassThroughExample/EZAudioPassThroughExample-Prefix.pch"; GCC_PREFIX_HEADER = "EZAudioPassThroughExample/EZAudioPassThroughExample-Prefix.pch";
INFOPLIST_FILE = "EZAudioPassThroughExample/EZAudioPassThroughExample-Info.plist"; INFOPLIST_FILE = "EZAudioPassThroughExample/EZAudioPassThroughExample-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app; WRAPPER_EXTENSION = app;
}; };
@@ -515,6 +516,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "EZAudioPassThroughExample/EZAudioPassThroughExample-Prefix.pch"; GCC_PREFIX_HEADER = "EZAudioPassThroughExample/EZAudioPassThroughExample-Prefix.pch";
INFOPLIST_FILE = "EZAudioPassThroughExample/EZAudioPassThroughExample-Info.plist"; INFOPLIST_FILE = "EZAudioPassThroughExample/EZAudioPassThroughExample-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app; WRAPPER_EXTENSION = app;
}; };
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7702" systemVersion="14C109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="zGs-8g-w7u"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="zGs-8g-w7u">
<dependencies> <dependencies>
<deployment identifier="iOS"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/>
</dependencies> </dependencies>
<scenes> <scenes>
<!--Pass Through View Controller--> <!--Pass Through View Controller-->
@@ -506,6 +506,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "EZAudioPlayFileExample/EZAudioPlayFileExample-Prefix.pch"; GCC_PREFIX_HEADER = "EZAudioPlayFileExample/EZAudioPlayFileExample-Prefix.pch";
INFOPLIST_FILE = "EZAudioPlayFileExample/EZAudioPlayFileExample-Info.plist"; INFOPLIST_FILE = "EZAudioPlayFileExample/EZAudioPlayFileExample-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app; WRAPPER_EXTENSION = app;
}; };
@@ -519,6 +520,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "EZAudioPlayFileExample/EZAudioPlayFileExample-Prefix.pch"; GCC_PREFIX_HEADER = "EZAudioPlayFileExample/EZAudioPlayFileExample-Prefix.pch";
INFOPLIST_FILE = "EZAudioPlayFileExample/EZAudioPlayFileExample-Info.plist"; INFOPLIST_FILE = "EZAudioPlayFileExample/EZAudioPlayFileExample-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app; WRAPPER_EXTENSION = app;
}; };
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="scx-fQ-Cxi"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="scx-fQ-Cxi">
<dependencies> <dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
</dependencies> </dependencies>
<scenes> <scenes>
@@ -29,7 +29,7 @@
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#pragma mark - Customize the Audio Plot #pragma mark - Setup
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
- (void)viewDidLoad - (void)viewDidLoad
@@ -42,7 +42,7 @@
// //
AVAudioSession *session = [AVAudioSession sharedInstance]; AVAudioSession *session = [AVAudioSession sharedInstance];
NSError *error; NSError *error;
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error]; [session setCategory:AVAudioSessionCategoryPlayback error:&error];
if (error) if (error)
{ {
NSLog(@"Error setting up audio session category: %@", error.localizedDescription); NSLog(@"Error setting up audio session category: %@", error.localizedDescription);
@@ -62,6 +62,8 @@
self.audioPlot.shouldFill = YES; self.audioPlot.shouldFill = YES;
self.audioPlot.shouldMirror = YES; self.audioPlot.shouldMirror = YES;
NSLog(@"outputs: %@", [EZAudioDevice outputDevices]);
// //
// Create the audio player // Create the audio player
// //
@@ -197,7 +199,8 @@
[self.audioFile getWaveformDataWithCompletionBlock:^(float **waveformData, [self.audioFile getWaveformDataWithCompletionBlock:^(float **waveformData,
int length) int length)
{ {
[weakSelf.audioPlot updateBuffer:waveformData[0] withBufferSize:length]; [weakSelf.audioPlot updateBuffer:waveformData[0]
withBufferSize:length];
}]; }];
// //
@@ -216,6 +219,11 @@
} }
else else
{ {
if (self.audioPlot.shouldMirror && (self.audioPlot.plotType == EZPlotTypeBuffer))
{
self.audioPlot.shouldMirror = NO;
self.audioPlot.shouldFill = NO;
}
[self.player play]; [self.player play];
} }
} }
@@ -502,6 +502,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "EZAudioRecordExample/EZAudioRecordExample-Prefix.pch"; GCC_PREFIX_HEADER = "EZAudioRecordExample/EZAudioRecordExample-Prefix.pch";
INFOPLIST_FILE = "EZAudioRecordExample/EZAudioRecordExample-Info.plist"; INFOPLIST_FILE = "EZAudioRecordExample/EZAudioRecordExample-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app; WRAPPER_EXTENSION = app;
}; };
@@ -515,6 +516,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "EZAudioRecordExample/EZAudioRecordExample-Prefix.pch"; GCC_PREFIX_HEADER = "EZAudioRecordExample/EZAudioRecordExample-Prefix.pch";
INFOPLIST_FILE = "EZAudioRecordExample/EZAudioRecordExample-Info.plist"; INFOPLIST_FILE = "EZAudioRecordExample/EZAudioRecordExample-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app; WRAPPER_EXTENSION = app;
}; };
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7702" systemVersion="14C109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="llE-BN-jHz"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="llE-BN-jHz">
<dependencies> <dependencies>
<deployment identifier="iOS"/> <deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
</dependencies> </dependencies>
<scenes> <scenes>
<!--Record View Controller--> <!--Record View Controller-->
@@ -20,70 +20,91 @@
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="2wj-z5-SgU" customClass="EZAudioPlotGL"> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="2wj-z5-SgU" customClass="EZAudioPlotGL">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/> <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<subviews> <subviews>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1hg-FO-pPe"> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Ua2-c0-har">
<rect key="frame" x="18" y="512" width="51" height="31"/> <rect key="frame" x="0.0" y="455" width="600" height="145"/>
<color key="onTintColor" white="1" alpha="1" colorSpace="calibratedWhite"/> <subviews>
<connections> <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1hg-FO-pPe">
<action selector="toggleMicrophone:" destination="llE-BN-jHz" eventType="valueChanged" id="gDV-6T-Whu"/> <rect key="frame" x="18" y="57" width="51" height="31"/>
</connections> <color key="onTintColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</switch> <connections>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Microphone On" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0aj-Ap-Ylp"> <action selector="toggleMicrophone:" destination="llE-BN-jHz" eventType="valueChanged" id="gDV-6T-Whu"/>
<rect key="frame" x="85" y="520" width="497" height="16"/> </connections>
<fontDescription key="fontDescription" type="system" pointSize="13"/> </switch>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Microphone On" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0aj-Ap-Ylp">
<nil key="highlightedColor"/> <rect key="frame" x="85" y="65" width="497" height="16"/>
</label> <fontDescription key="fontDescription" type="system" pointSize="13"/>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="x5e-xg-u5V"> <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<rect key="frame" x="18" y="551" width="51" height="31"/> <nil key="highlightedColor"/>
<connections> </label>
<action selector="toggleRecording:" destination="llE-BN-jHz" eventType="valueChanged" id="XcR-8d-Kcd"/> <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="x5e-xg-u5V">
</connections> <rect key="frame" x="18" y="96" width="51" height="31"/>
</switch> <color key="onTintColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Recording On" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="e1t-nE-3QJ"> <connections>
<rect key="frame" x="85" y="559" width="497" height="16"/> <action selector="toggleRecording:" destination="llE-BN-jHz" eventType="valueChanged" id="XcR-8d-Kcd"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/> </connections>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> </switch>
<nil key="highlightedColor"/> <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Recording On" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="e1t-nE-3QJ">
</label> <rect key="frame" x="85" y="104" width="497" height="16"/>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" showsTouchWhenHighlighted="YES" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="r8j-qU-fh6"> <fontDescription key="fontDescription" type="system" pointSize="13"/>
<rect key="frame" x="18" y="474" width="49" height="30"/> <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Not Playing" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="zeh-I6-Na6">
<rect key="frame" x="85" y="26" width="497" height="16"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" showsTouchWhenHighlighted="YES" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Lex-aP-CGX">
<rect key="frame" x="13" y="19" width="59" height="30"/>
<constraints>
<constraint firstAttribute="height" constant="30" id="LDk-Y3-uk0"/>
<constraint firstAttribute="width" constant="59" id="zqS-lz-oEK"/>
</constraints>
<fontDescription key="fontDescription" name="HelveticaNeue-Bold" family="Helvetica Neue" pointSize="13"/>
<color key="tintColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<state key="normal" title="Play">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="playFile:" destination="llE-BN-jHz" eventType="touchUpInside" id="DDY-Cz-2IW"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.70000000000000007" colorSpace="custom" customColorSpace="sRGB"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="30" id="dbU-fb-Yp6"/> <constraint firstAttribute="height" constant="145" id="84N-gU-Dz9"/>
<constraint firstAttribute="width" constant="49" id="jPi-0p-2oF"/> <constraint firstAttribute="trailing" secondItem="zeh-I6-Na6" secondAttribute="trailing" constant="18" id="Nnf-8H-wts"/>
<constraint firstItem="Lex-aP-CGX" firstAttribute="leading" secondItem="Ua2-c0-har" secondAttribute="leading" constant="13" id="Zb4-yY-8dM"/>
<constraint firstItem="zeh-I6-Na6" firstAttribute="top" secondItem="Ua2-c0-har" secondAttribute="top" constant="26" id="l3q-uD-w0G"/>
<constraint firstItem="zeh-I6-Na6" firstAttribute="leading" secondItem="Lex-aP-CGX" secondAttribute="trailing" constant="13" id="mnu-nJ-xAa"/>
<constraint firstItem="Lex-aP-CGX" firstAttribute="top" secondItem="Ua2-c0-har" secondAttribute="top" constant="19" id="tAe-da-Jb2"/>
</constraints> </constraints>
<fontDescription key="fontDescription" type="system" pointSize="13"/> </view>
<state key="normal" title="Play"> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="00:00" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QZk-8t-iz0">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/> <rect key="frame" x="18" y="18" width="80" height="39"/>
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/> <fontDescription key="fontDescription" type="system" weight="light" pointSize="32"/>
</state> <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<connections>
<action selector="playFile:" destination="llE-BN-jHz" eventType="touchUpInside" id="IbI-bz-M5D"/>
</connections>
</button>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Not Playing" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="zeh-I6-Na6">
<rect key="frame" x="85" y="481" width="497" height="16"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
</label> </label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NK6-i1-Kjf" customClass="EZAudioPlot">
<rect key="frame" x="107" y="18" width="475" height="39"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="height" constant="39" id="pnN-yp-8eE"/>
</constraints>
</view>
</subviews> </subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints> <constraints>
<constraint firstItem="0aj-Ap-Ylp" firstAttribute="centerY" secondItem="1hg-FO-pPe" secondAttribute="centerY" id="2ID-SH-h0n"/> <constraint firstItem="QZk-8t-iz0" firstAttribute="top" secondItem="2wj-z5-SgU" secondAttribute="top" constant="18" id="7aU-qh-lzs"/>
<constraint firstItem="x5e-xg-u5V" firstAttribute="centerY" secondItem="e1t-nE-3QJ" secondAttribute="centerY" id="3TN-JD-fXs"/> <constraint firstItem="QZk-8t-iz0" firstAttribute="leading" secondItem="2wj-z5-SgU" secondAttribute="leading" constant="18" id="Aac-ba-fJG"/>
<constraint firstAttribute="trailing" secondItem="0aj-Ap-Ylp" secondAttribute="trailing" constant="18" id="Nzq-x0-Bn3"/> <constraint firstAttribute="trailing" secondItem="NK6-i1-Kjf" secondAttribute="trailing" constant="18" id="BAg-ql-P64"/>
<constraint firstItem="1hg-FO-pPe" firstAttribute="leading" secondItem="2wj-z5-SgU" secondAttribute="leading" constant="18" id="SGf-Ot-ydT"/> <constraint firstAttribute="trailing" secondItem="Ua2-c0-har" secondAttribute="trailing" id="DFS-Lr-ap6"/>
<constraint firstItem="zeh-I6-Na6" firstAttribute="centerY" secondItem="r8j-qU-fh6" secondAttribute="centerY" id="SV5-g6-nAm"/> <constraint firstAttribute="bottom" secondItem="Ua2-c0-har" secondAttribute="bottom" id="hWL-2I-U11"/>
<constraint firstItem="zeh-I6-Na6" firstAttribute="leading" secondItem="r8j-qU-fh6" secondAttribute="trailing" constant="18" id="WrE-fc-eWU"/> <constraint firstItem="Ua2-c0-har" firstAttribute="leading" secondItem="2wj-z5-SgU" secondAttribute="leading" id="jV7-AG-ClO"/>
<constraint firstItem="0aj-Ap-Ylp" firstAttribute="leading" secondItem="1hg-FO-pPe" secondAttribute="trailing" constant="18" id="Zlu-hy-toc"/> <constraint firstItem="NK6-i1-Kjf" firstAttribute="leading" secondItem="QZk-8t-iz0" secondAttribute="trailing" constant="9" id="rqh-Ib-RFU"/>
<constraint firstItem="r8j-qU-fh6" firstAttribute="leading" secondItem="2wj-z5-SgU" secondAttribute="leading" constant="18" id="bfv-fU-4be"/> <constraint firstItem="NK6-i1-Kjf" firstAttribute="top" secondItem="2wj-z5-SgU" secondAttribute="top" constant="18" id="tRd-Ee-lnl"/>
<constraint firstItem="e1t-nE-3QJ" firstAttribute="leading" secondItem="x5e-xg-u5V" secondAttribute="trailing" constant="18" id="cyW-VV-2vF"/>
<constraint firstItem="x5e-xg-u5V" firstAttribute="leading" secondItem="2wj-z5-SgU" secondAttribute="leading" constant="18" id="d1D-pw-daz"/>
<constraint firstAttribute="bottom" secondItem="x5e-xg-u5V" secondAttribute="bottom" constant="18" id="j5C-Pr-Qr1"/>
<constraint firstItem="1hg-FO-pPe" firstAttribute="top" secondItem="r8j-qU-fh6" secondAttribute="bottom" constant="8" id="kGE-En-5oO"/>
<constraint firstAttribute="trailing" secondItem="zeh-I6-Na6" secondAttribute="trailing" constant="18" id="lgq-o9-XKk"/>
<constraint firstAttribute="trailing" secondItem="e1t-nE-3QJ" secondAttribute="trailing" constant="18" id="yg8-Wi-4FL"/>
<constraint firstItem="x5e-xg-u5V" firstAttribute="top" secondItem="1hg-FO-pPe" secondAttribute="bottom" constant="8" id="zO4-XU-4yd"/>
</constraints> </constraints>
</view> </view>
</subviews> </subviews>
@@ -96,13 +117,15 @@
</constraints> </constraints>
</view> </view>
<connections> <connections>
<outlet property="audioPlot" destination="2wj-z5-SgU" id="1ih-MQ-w9g"/> <outlet property="currentTimeLabel" destination="QZk-8t-iz0" id="MP6-0t-jhv"/>
<outlet property="microphoneStateLabel" destination="0aj-Ap-Ylp" id="fb1-B6-aY6"/>
<outlet property="microphoneSwitch" destination="1hg-FO-pPe" id="SFI-AX-IjC"/> <outlet property="microphoneSwitch" destination="1hg-FO-pPe" id="SFI-AX-IjC"/>
<outlet property="microphoneTextField" destination="0aj-Ap-Ylp" id="748-Fq-ubg"/> <outlet property="playButton" destination="Lex-aP-CGX" id="K8T-X8-Tfy"/>
<outlet property="playButton" destination="r8j-qU-fh6" id="tmR-Nt-pKO"/> <outlet property="playingAudioPlot" destination="NK6-i1-Kjf" id="bes-5F-Cfa"/>
<outlet property="playingTextField" destination="zeh-I6-Na6" id="bsZ-bd-HDD"/> <outlet property="playingStateLabel" destination="zeh-I6-Na6" id="Tpj-mT-wwx"/>
<outlet property="recordSwitch" destination="x5e-xg-u5V" id="yZ8-zX-x4o"/> <outlet property="recordSwitch" destination="x5e-xg-u5V" id="yZ8-zX-x4o"/>
<outlet property="recordingTextField" destination="e1t-nE-3QJ" id="Vr4-cl-5zt"/> <outlet property="recordingAudioPlot" destination="2wj-z5-SgU" id="2hH-vO-WSb"/>
<outlet property="recordingStateLabel" destination="e1t-nE-3QJ" id="PDc-R4-k0n"/>
<outlet property="view" destination="PCx-Sz-N5f" id="fk5-lV-jnA"/> <outlet property="view" destination="PCx-Sz-N5f" id="fk5-lV-jnA"/>
</connections> </connections>
</viewController> </viewController>
@@ -11,48 +11,127 @@
// Import EZAudio header // Import EZAudio header
#import "EZAudio.h" #import "EZAudio.h"
// Import AVFoundation to play the file (will save EZAudioFile and EZOutput for separate example)
#import <AVFoundation/AVFoundation.h>
// By default this will record a file to the application's documents directory (within the application's sandbox) // By default this will record a file to the application's documents directory (within the application's sandbox)
#define kAudioFilePath @"EZAudioTest.m4a" #define kAudioFilePath @"EZAudioTest.m4a"
@interface RecordViewController : UIViewController <AVAudioPlayerDelegate,EZMicrophoneDelegate> //------------------------------------------------------------------------------
#pragma mark - RecordViewController
//------------------------------------------------------------------------------
@interface RecordViewController : UIViewController <EZAudioPlayerDelegate,
EZMicrophoneDelegate,
EZRecorderDelegate>
/**
The label used to display the current time for recording/playback in the top left
*/
@property (nonatomic, weak) IBOutlet UILabel *currentTimeLabel;
//------------------------------------------------------------------------------
/** /**
Use a OpenGL based plot to visualize the data coming in Use a OpenGL based plot to visualize the data coming in
*/ */
@property (nonatomic,weak) IBOutlet EZAudioPlotGL *audioPlot; @property (nonatomic, weak) IBOutlet EZAudioPlotGL *recordingAudioPlot;
//------------------------------------------------------------------------------
/** /**
A flag indicating whether we are recording or not A flag indicating whether we are recording or not
*/ */
@property (nonatomic,assign) BOOL isRecording; @property (nonatomic, assign) BOOL isRecording;
//------------------------------------------------------------------------------
/** /**
The microphone component The microphone component
*/ */
@property (nonatomic,strong) EZMicrophone *microphone; @property (nonatomic, strong) EZMicrophone *microphone;
//------------------------------------------------------------------------------
/**
The switch used to toggle the microphone on/off
*/
@property (nonatomic, weak) IBOutlet UISwitch *microphoneSwitch;
//------------------------------------------------------------------------------
/**
The label used to display the microphone's play state
*/
@property (nonatomic, weak) IBOutlet UILabel *microphoneStateLabel;
//------------------------------------------------------------------------------
/**
The audio player that will play the recorded file
*/
@property (nonatomic, strong) EZAudioPlayer *player;
//------------------------------------------------------------------------------
/** /**
The recorder component The recorder component
*/ */
@property (nonatomic,strong) EZRecorder *recorder; @property (nonatomic, strong) EZRecorder *recorder;
//------------------------------------------------------------------------------
/**
The second audio plot used on the top right to display the current playing audio
*/
@property (nonatomic, weak) IBOutlet EZAudioPlot *playingAudioPlot;
//------------------------------------------------------------------------------
/**
The button the user taps to play the recorded audio file
*/
@property (nonatomic, weak) IBOutlet UIButton *playButton;
//------------------------------------------------------------------------------
/**
The label used to display the audio player play state
*/
@property (nonatomic, weak) IBOutlet UILabel *playingStateLabel;
//------------------------------------------------------------------------------
/**
The label used to display the recording play state
*/
@property (nonatomic, weak) IBOutlet UILabel *recordingStateLabel;
//------------------------------------------------------------------------------
/**
The switch used to toggle the recording on/off
*/
@property (nonatomic, weak) IBOutlet UISwitch *recordSwitch;
//------------------------------------------------------------------------------
#pragma mark - Actions #pragma mark - Actions
//------------------------------------------------------------------------------
/** /**
Stops the recorder and starts playing whatever has been recorded. Stops the recorder and starts playing whatever has been recorded.
*/ */
-(IBAction)playFile:(id)sender; - (IBAction)playFile:(id)sender;
//------------------------------------------------------------------------------
/** /**
Toggles the microphone on and off. When the microphone is on it will send its delegate (aka this view controller) the audio data in various ways (check out the EZMicrophoneDelegate documentation for more details); Toggles the microphone on and off. When the microphone is on it will send its delegate (aka this view controller) the audio data in various ways (check out the EZMicrophoneDelegate documentation for more details);
*/ */
-(IBAction)toggleMicrophone:(id)sender; - (IBAction)toggleMicrophone:(id)sender;
//------------------------------------------------------------------------------
/** /**
Toggles the microphone on and off. When the microphone is on it will send its delegate (aka this view controller) the audio data in various ways (check out the EZMicrophoneDelegate documentation for more details); Toggles the microphone on and off. When the microphone is on it will send its delegate (aka this view controller) the audio data in various ways (check out the EZMicrophoneDelegate documentation for more details);
*/ */
-(IBAction)toggleRecording:(id)sender; - (IBAction)toggleRecording:(id)sender;
@end @end
@@ -8,53 +8,34 @@
#import "RecordViewController.h" #import "RecordViewController.h"
@interface RecordViewController ()
// Using AVPlayer for example
@property (nonatomic,strong) AVAudioPlayer *audioPlayer;
@property (nonatomic,weak) IBOutlet UISwitch *microphoneSwitch;
@property (nonatomic,weak) IBOutlet UILabel *microphoneTextField;
@property (nonatomic,weak) IBOutlet UIButton *playButton;
@property (nonatomic,weak) IBOutlet UILabel *playingTextField;
@property (nonatomic,weak) IBOutlet UISwitch *recordSwitch;
@property (nonatomic,weak) IBOutlet UILabel *recordingTextField;
@end
@implementation RecordViewController @implementation RecordViewController
@synthesize audioPlot;
@synthesize microphone;
@synthesize microphoneSwitch;
@synthesize microphoneTextField;
@synthesize playButton;
@synthesize playingTextField;
@synthesize recorder;
@synthesize recordSwitch;
@synthesize recordingTextField;
//------------------------------------------------------------------------------
#pragma mark - Dealloc
//------------------------------------------------------------------------------
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
//------------------------------------------------------------------------------
#pragma mark - Status Bar Style #pragma mark - Status Bar Style
//------------------------------------------------------------------------------
- (UIStatusBarStyle)preferredStatusBarStyle - (UIStatusBarStyle)preferredStatusBarStyle
{ {
return UIStatusBarStyleLightContent; return UIStatusBarStyleLightContent;
} }
#pragma mark - Initialization //------------------------------------------------------------------------------
-(id)init { #pragma mark - Setup
self = [super init]; //------------------------------------------------------------------------------
if(self){
[self initializeViewController];
}
return self;
}
-(id)initWithCoder:(NSCoder *)aDecoder { - (void)viewDidLoad
self = [super initWithCoder:aDecoder]; {
if(self){ [super viewDidLoad];
[self initializeViewController];
}
return self;
}
#pragma mark - Initialize View Controller Here
-(void)initializeViewController {
// //
// Setup the AVAudioSession. EZMicrophone will not work properly on iOS // Setup the AVAudioSession. EZMicrophone will not work properly on iOS
// if you don't do this! // if you don't do this!
@@ -72,193 +53,277 @@
NSLog(@"Error setting up audio session active: %@", error.localizedDescription); NSLog(@"Error setting up audio session active: %@", error.localizedDescription);
} }
//
// Customizing the audio plot that'll show the current microphone input/recording
//
self.recordingAudioPlot.backgroundColor = [UIColor colorWithRed: 0.984 green: 0.71 blue: 0.365 alpha: 1];
self.recordingAudioPlot.color = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
self.recordingAudioPlot.plotType = EZPlotTypeRolling;
self.recordingAudioPlot.shouldFill = YES;
self.recordingAudioPlot.shouldMirror = YES;
//
// Customizing the audio plot that'll show the playback
//
self.playingAudioPlot.color = [UIColor whiteColor];
self.playingAudioPlot.plotType = EZPlotTypeRolling;
self.playingAudioPlot.shouldFill = YES;
self.playingAudioPlot.shouldMirror = YES;
self.playingAudioPlot.gain = 2.5f;
// Create an instance of the microphone and tell it to use this view controller instance as the delegate // Create an instance of the microphone and tell it to use this view controller instance as the delegate
self.microphone = [EZMicrophone microphoneWithDelegate:self]; self.microphone = [EZMicrophone microphoneWithDelegate:self];
self.player = [EZAudioPlayer audioPlayerWithDelegate:self];
//
// Initialize UI components
//
self.microphoneStateLabel.text = @"Microphone On";
self.recordingStateLabel.text = @"Not Recording";
self.playingStateLabel.text = @"Not Playing";
self.playButton.enabled = NO;
//
// Setup notifications
//
[self setupNotifications];
//
// Log out where the file is being written to within the app's documents directory
//
NSLog(@"File written to application sandbox's documents directory: %@",[self testFilePathURL]);
//
// Start the microphone
//
[self.microphone startFetchingAudio];
} }
#pragma mark - Customize the Audio Plot //------------------------------------------------------------------------------
-(void)viewDidLoad {
[super viewDidLoad]; - (void)setupNotifications
/*
Customizing the audio plot's look
*/
// Background color
self.audioPlot.backgroundColor = [UIColor colorWithRed: 0.984 green: 0.71 blue: 0.365 alpha: 1];
// Waveform color
self.audioPlot.color = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
// Plot type
self.audioPlot.plotType = EZPlotTypeRolling;
// Fill
self.audioPlot.shouldFill = YES;
// Mirror
self.audioPlot.shouldMirror = YES;
/*
Start the microphone
*/
[self.microphone startFetchingAudio];
self.microphoneTextField.text = @"Microphone On";
self.recordingTextField.text = @"Not Recording";
self.playingTextField.text = @"Not Playing";
// Hide the play button
self.playButton.hidden = YES;
/*
Log out where the file is being written to within the app's documents directory
*/
NSLog(@"File written to application sandbox's documents directory: %@",[self testFilePathURL]);
}
#pragma mark - Actions
-(void)playFile:(id)sender
{ {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerDidChangePlayState:)
name:EZAudioPlayerDidChangePlayStateNotification
object:self.player];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerDidReachEndOfFile:)
name:EZAudioPlayerDidReachEndOfFileNotification
object:self.player];
}
//------------------------------------------------------------------------------
#pragma mark - Notifications
//------------------------------------------------------------------------------
- (void)playerDidChangePlayState:(NSNotification *)notification
{
EZAudioPlayer *player = [notification object];
BOOL isPlaying = [player isPlaying];
if (isPlaying)
{
self.recorder.delegate = nil;
}
self.playingStateLabel.text = isPlaying ? @"Playing" : @"Not Playing";
self.playingAudioPlot.hidden = !isPlaying;
}
//------------------------------------------------------------------------------
- (void)playerDidReachEndOfFile:(NSNotification *)notification
{
[self.playingAudioPlot clear];
}
//------------------------------------------------------------------------------
#pragma mark - Actions
//------------------------------------------------------------------------------
- (void)playFile:(id)sender
{
//
// Update microphone state // Update microphone state
//
[self.microphone stopFetchingAudio]; [self.microphone stopFetchingAudio];
self.microphoneTextField.text = @"Microphone Off";
self.microphoneSwitch.on = NO;
//
// Update recording state // Update recording state
//
self.isRecording = NO; self.isRecording = NO;
self.recordingTextField.text = @"Not Recording"; self.recordingStateLabel.text = @"Not Recording";
self.recordSwitch.on = NO; self.recordSwitch.on = NO;
// Create Audio Player //
if( self.audioPlayer )
{
if( self.audioPlayer.playing )
{
[self.audioPlayer stop];
}
self.audioPlayer = nil;
}
// Close the audio file // Close the audio file
if( self.recorder ) //
if (self.recorder)
{ {
[self.recorder closeAudioFile]; [self.recorder closeAudioFile];
} }
NSError *err; EZAudioFile *audioFile = [EZAudioFile audioFileWithURL:[self testFilePathURL]];
self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[self testFilePathURL] [self.player playAudioFile:audioFile];
error:&err];
[self.audioPlayer play];
self.audioPlayer.delegate = self;
self.playingTextField.text = @"Playing";
} }
-(void)toggleMicrophone:(id)sender { //------------------------------------------------------------------------------
self.playingTextField.text = @"Not Playing"; - (void)toggleMicrophone:(id)sender
if( self.audioPlayer ){ {
if( self.audioPlayer.playing ) [self.audioPlayer stop]; [self.player pause];
self.audioPlayer = nil;
}
if( ![(UISwitch*)sender isOn] ){ BOOL isOn = [(UISwitch*)sender isOn];
[self.microphone stopFetchingAudio]; if (!isOn)
self.microphoneTextField.text = @"Microphone Off";
}
else {
[self.microphone startFetchingAudio];
self.microphoneTextField.text = @"Microphone On";
}
}
-(void)toggleRecording:(id)sender {
self.playingTextField.text = @"Not Playing";
if( self.audioPlayer )
{ {
if( self.audioPlayer.playing ) [self.microphone stopFetchingAudio];
{
[self.audioPlayer stop];
}
self.audioPlayer = nil;
}
self.playButton.hidden = NO;
if( [sender isOn] )
{
/*
Create the recorder
*/
[EZAudioUtilities printASBD:self.microphone.audioStreamBasicDescription];
self.recorder = [EZRecorder recorderWithDestinationURL:[self testFilePathURL]
sourceFormat:self.microphone.audioStreamBasicDescription
destinationFileType:EZRecorderFileTypeM4A];
} }
else else
{ {
[self.recorder closeAudioFile]; [self.microphone startFetchingAudio];
}
}
//------------------------------------------------------------------------------
- (void)toggleRecording:(id)sender
{
[self.player pause];
if ([sender isOn])
{
//
// Create the recorder
//
[self.recordingAudioPlot clear];
[self.microphone startFetchingAudio];
self.recorder = [EZRecorder recorderWithURL:[self testFilePathURL]
clientFormat:[self.microphone audioStreamBasicDescription]
fileType:EZRecorderFileTypeM4A
delegate:self];
self.playButton.enabled = YES;
} }
self.isRecording = (BOOL)[sender isOn]; self.isRecording = (BOOL)[sender isOn];
self.recordingTextField.text = self.isRecording ? @"Recording" : @"Not Recording"; self.recordingStateLabel.text = self.isRecording ? @"Recording" : @"Not Recording";
} }
//------------------------------------------------------------------------------
#pragma mark - EZMicrophoneDelegate #pragma mark - EZMicrophoneDelegate
//------------------------------------------------------------------------------
- (void)microphone:(EZMicrophone *)microphone changedPlayingState:(BOOL)isPlaying
{
self.microphoneStateLabel.text = isPlaying ? @"Microphone On" : @"Microphone Off";
self.microphoneSwitch.on = isPlaying;
}
//------------------------------------------------------------------------------
#warning Thread Safety #warning Thread Safety
// Note that any callback that provides streamed audio data (like streaming microphone input) happens on a separate audio thread that should not be blocked. When we feed audio data into any of the UI components we need to explicity create a GCD block on the main thread to properly get the UI to work. // Note that any callback that provides streamed audio data (like streaming microphone input) happens on a separate audio thread that should not be blocked. When we feed audio data into any of the UI components we need to explicity create a GCD block on the main thread to properly get the UI to work.
-(void)microphone:(EZMicrophone *)microphone - (void) microphone:(EZMicrophone *)microphone
hasAudioReceived:(float **)buffer hasAudioReceived:(float **)buffer
withBufferSize:(UInt32)bufferSize withBufferSize:(UInt32)bufferSize
withNumberOfChannels:(UInt32)numberOfChannels { withNumberOfChannels:(UInt32)numberOfChannels
// Getting audio data as an array of float buffer arrays. What does that mean? Because the audio is coming in as a stereo signal the data is split into a left and right channel. So buffer[0] corresponds to the float* data for the left channel while buffer[1] corresponds to the float* data for the right channel. {
// Getting audio data as an array of float buffer arrays. What does that mean? Because the audio is coming in as a stereo signal the data is split into a left and right channel. So buffer[0] corresponds to the float* data for the left channel while buffer[1] corresponds to the float* data for the right channel.
// See the Thread Safety warning above, but in a nutshell these callbacks happen on a separate audio thread. We wrap any UI updating in a GCD block on the main thread to avoid blocking that audio flow. // See the Thread Safety warning above, but in a nutshell these callbacks happen on a separate audio thread. We wrap any UI updating in a GCD block on the main thread to avoid blocking that audio flow.
dispatch_async(dispatch_get_main_queue(),^{ __weak typeof (self) weakSelf = self;
// All the audio plot needs is the buffer data (float*) and the size. Internally the audio plot will handle all the drawing related code, history management, and freeing its own resources. Hence, one badass line of code gets you a pretty plot :) dispatch_async(dispatch_get_main_queue(), ^{
[self.audioPlot updateBuffer:buffer[0] withBufferSize:bufferSize]; // All the audio plot needs is the buffer data (float*) and the size. Internally the audio plot will handle all the drawing related code, history management, and freeing its own resources. Hence, one badass line of code gets you a pretty plot :)
}); [weakSelf.recordingAudioPlot updateBuffer:buffer[0]
withBufferSize:bufferSize];
});
} }
-(void)microphone:(EZMicrophone *)microphone //------------------------------------------------------------------------------
hasBufferList:(AudioBufferList *)bufferList
withBufferSize:(UInt32)bufferSize
withNumberOfChannels:(UInt32)numberOfChannels {
// Getting audio data as a buffer list that can be directly fed into the EZRecorder. This is happening on the audio thread - any UI updating needs a GCD main queue block. This will keep appending data to the tail of the audio file.
if( self.isRecording ){
[self.recorder appendDataFromBufferList:bufferList
withBufferSize:bufferSize];
}
- (void) microphone:(EZMicrophone *)microphone
hasBufferList:(AudioBufferList *)bufferList
withBufferSize:(UInt32)bufferSize
withNumberOfChannels:(UInt32)numberOfChannels
{
// Getting audio data as a buffer list that can be directly fed into the EZRecorder. This is happening on the audio thread - any UI updating needs a GCD main queue block. This will keep appending data to the tail of the audio file.
if (self.isRecording)
{
[self.recorder appendDataFromBufferList:bufferList
withBufferSize:bufferSize];
}
} }
#pragma mark - AVAudioPlayerDelegate //------------------------------------------------------------------------------
/* #pragma mark - EZRecorderDelegate
Occurs when the audio player instance completes playback //------------------------------------------------------------------------------
*/
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
self.audioPlayer = nil;
self.playingTextField.text = @"Finished Playing";
[self.microphone startFetchingAudio]; - (void)recorderDidClose:(EZRecorder *)recorder
self.microphoneSwitch.on = YES; {
self.microphoneTextField.text = @"Microphone On"; recorder.delegate = nil;
} }
//------------------------------------------------------------------------------
- (void)recorderUpdatedCurrentTime:(EZRecorder *)recorder
{
__weak typeof (self) weakSelf = self;
NSString *formattedCurrentTime = [recorder formattedCurrentTime];
dispatch_async(dispatch_get_main_queue(), ^{
weakSelf.currentTimeLabel.text = formattedCurrentTime;
});
}
//------------------------------------------------------------------------------
#pragma mark - EZAudioPlayerDelegate
//------------------------------------------------------------------------------
- (void) audioPlayer:(EZAudioPlayer *)audioPlayer
playedAudio:(float **)buffer
withBufferSize:(UInt32)bufferSize
withNumberOfChannels:(UInt32)numberOfChannels
inAudioFile:(EZAudioFile *)audioFile
{
__weak typeof (self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf.playingAudioPlot updateBuffer:buffer[0]
withBufferSize:bufferSize];
});
}
//------------------------------------------------------------------------------
- (void)audioPlayer:(EZAudioPlayer *)audioPlayer
updatedPosition:(SInt64)framePosition
inAudioFile:(EZAudioFile *)audioFile
{
__weak typeof (self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
weakSelf.currentTimeLabel.text = [audioPlayer formattedCurrentTime];
});
}
//------------------------------------------------------------------------------
#pragma mark - Utility #pragma mark - Utility
-(NSArray*)applicationDocuments { //------------------------------------------------------------------------------
- (NSArray *)applicationDocuments
{
return NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); return NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
} }
-(NSString*)applicationDocumentsDirectory //------------------------------------------------------------------------------
- (NSString *)applicationDocumentsDirectory
{ {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
return basePath; return basePath;
} }
-(NSURL*)testFilePathURL { //------------------------------------------------------------------------------
return [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%@",
[self applicationDocumentsDirectory], - (NSURL *)testFilePathURL
kAudioFilePath]]; {
return [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%@",
[self applicationDocumentsDirectory],
kAudioFilePath]];
} }
@end @end
@@ -506,6 +506,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "EZAudioWaveformFromFileExample/EZAudioWaveformFromFileExample-Prefix.pch"; GCC_PREFIX_HEADER = "EZAudioWaveformFromFileExample/EZAudioWaveformFromFileExample-Prefix.pch";
INFOPLIST_FILE = "EZAudioWaveformFromFileExample/EZAudioWaveformFromFileExample-Info.plist"; INFOPLIST_FILE = "EZAudioWaveformFromFileExample/EZAudioWaveformFromFileExample-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app; WRAPPER_EXTENSION = app;
}; };
@@ -519,6 +520,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "EZAudioWaveformFromFileExample/EZAudioWaveformFromFileExample-Prefix.pch"; GCC_PREFIX_HEADER = "EZAudioWaveformFromFileExample/EZAudioWaveformFromFileExample-Prefix.pch";
INFOPLIST_FILE = "EZAudioWaveformFromFileExample/EZAudioWaveformFromFileExample-Info.plist"; INFOPLIST_FILE = "EZAudioWaveformFromFileExample/EZAudioWaveformFromFileExample-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app; WRAPPER_EXTENSION = app;
}; };
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7702" systemVersion="14C109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="d7h-J5-hmC"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="d7h-J5-hmC">
<dependencies> <dependencies>
<deployment identifier="iOS"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/>
</dependencies> </dependencies>
<scenes> <scenes>
<!--Waveform From File View Controller--> <!--Waveform From File View Controller-->
+12 -5
View File
@@ -4,7 +4,7 @@
A simple, intuitive audio framework for iOS and OSX. A simple, intuitive audio framework for iOS and OSX.
# Note as of July 2, 2015 # Note as of July 2, 2015
Over the last week I've been rewriting the core components of EZAudio to be better, faster, and much more flexible. As EZAudio gets closer its 1.0 release the API has changed a little bit for each component and as a result this repo's README for the [Examples](#Examples) and [Core Components](#CoreComponents) is in a deprecated state, but will be updated tomorrow <b>July 3rd, 2015</b>. Happy coding! Over the last week I've been rewriting the core components of EZAudio to be faster and much more flexible. As EZAudio gets closer its 1.0 release the API has changed a little bit for each component and as a result this repo's README for the [Examples](#Examples) and [Core Components](#CoreComponents) are in a deprecated state, but will be updated tomorrow <b>July 3rd, 2015</b>. As of the `0.7.1` release you should be able to use EZAudio and the Amazing Audio Engine by using the `EZAudio/Core` Cocoapod (see [Using EZAudio & The Amazing Audio Engine](#AmazingAudioEngineCocoapod))
##Features ##Features
![alt text](https://s3-us-west-1.amazonaws.com/ezaudio-media/EZAudioSummary.png "EZAudioFeatures") ![alt text](https://s3-us-west-1.amazonaws.com/ezaudio-media/EZAudioSummary.png "EZAudioFeatures")
@@ -78,10 +78,10 @@ Shows how to calculate the real-time FFT of the audio data coming from the `EZMi
![alt text](https://s3-us-west-1.amazonaws.com/ezaudio-media/fftMacExample.png) ![alt text](https://s3-us-west-1.amazonaws.com/ezaudio-media/fftMacExample.png)
### Documentation ### Documentation
The official documentation for EZAudio can be found here: http://cocoadocs.org/docsets/EZAudio/0.7.1/ The official documentation for EZAudio can be found here: http://cocoadocs.org/docsets/EZAudio/0.9.0/
<br>You can also generate the docset yourself using appledocs by running the appledocs on the EZAudio source folder. <br>You can also generate the docset yourself using appledocs by running the appledocs on the EZAudio source folder.
##Getting Started ##<a name="GettingStarted">Getting Started
To begin using `EZAudio` you must first make sure you have the proper build requirements and frameworks. Below you'll find explanations of each component and code snippets to show how to use each to perform common tasks like getting microphone data, updating audio waveform plots, reading/seeking through audio files, and performing playback. To begin using `EZAudio` you must first make sure you have the proper build requirements and frameworks. Below you'll find explanations of each component and code snippets to show how to use each to perform common tasks like getting microphone data, updating audio waveform plots, reading/seeking through audio files, and performing playback.
###Build Requirements ###Build Requirements
@@ -105,11 +105,18 @@ To begin using `EZAudio` you must first make sure you have the proper build requ
- OpenGL - OpenGL
- GLKit - GLKit
###Adding To Project ###<a name="AddingToProject">Adding To Project
You can add EZAudio to your project in a few ways: <br><br>1.) The easiest way to use EZAudio is via <a href="http://cocoapods.org/", target="_blank">Cocoapods</a>. Simply add EZAudio to your <a href="http://guides.cocoapods.org/using/the-podfile.html", target="_blank">Podfile</a> like so: You can add EZAudio to your project in a few ways: <br><br>1.) The easiest way to use EZAudio is via <a href="http://cocoapods.org/", target="_blank">Cocoapods</a>. Simply add EZAudio to your <a href="http://guides.cocoapods.org/using/the-podfile.html", target="_blank">Podfile</a> like so:
` `
pod 'EZAudio', '~> 0.7.1' pod 'EZAudio', '~> 0.9.0'
`
####<a name="AmazingAudioEngineCocoapod">Using EZAudio & The Amazing Audio Engine
If you're also using the Amazing Audio Engine then use the `EZAudio/Core` subspec like so:
`
pod 'EZAudio/Core', '~> 0.9.0'
` `
2.) Alternatively, you could clone or fork this repo and just drag and drop the source into your project. 2.) Alternatively, you could clone or fork this repo and just drag and drop the source into your project.