//mainview.m
#import "MainView.h"
#import <Audiotoolbox/AudioServices.h>
#import "TreeAppDelegate.h"
#define kFilteringFactor 0.1
#define kEraseAccelerationThreshold 2.0
@implementation MainView
#pragma mark Movie Player Routines
// Notification called when the movie finished preloading.
- (void) moviePreloadDidFinish:(NSNotification*)notification
{
/*
< add your code here >
*/
}
// Notification called when the movie finished playing.
- (void) moviePlayBackDidFinish:(NSNotification*)notification
{
/*
< add your code here >
For example:
MPMoviePlayerController* theMovie=[aNotification object];
etc.
*/
}
// Notification called when the movie scaling mode has changed.
- (void) movieScalingModeDidChange:(NSNotification*)notification
{
/*
< add your code here >
For example:
MPMoviePlayerController* theMovie=[aNotification object];
etc.
*/
}
-(void)initMoviePlayer
{
/*
Because it takes time to load movie files into memory, MPMoviePlayerController
automatically begins loading your movie file shortly after you initialize a new
instance. When it is done preloading the movie file, it sends the
MPMoviePlayerContentPreloadDidFinishNotification notification to any registered
observers. If an error occurred during loading, the userInfo dictionary of the
notification object contains the error information. If you call the play method
before preloading is complete, no notification is sent and your movie begins
playing as soon as it is loaded into memory.
*/
// Register to receive a notification when the movie is in memory and ready to play.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePreloadDidFinish:)
name:MPMoviePlayerContentPreloadDidFinishNotification
object:nil];
/*
Now create a MPMoviePlayerController object using the movie file provided in our bundle.
The MPMoviePlayerController class supports any movie or audio files that already play
correctly on an iPod or iPhone. For movie files, this typically means files with the extensions
.mov, .mp4, .mpv, and .3gp and using one of the following compression standards:
- H.264 Baseline Profile Level 3.0 video, up to 640 x 480 at 30 fps. Note that B frames
are not supported in the Baseline profile.
- MPEG-4 Part 2 video (Simple Profile)
If you use this class to play audio files, it displays a black screen while the audio plays. For
audio files, this class class supports AAC-LC audio at up to 48 kHz.
*/
mMoviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[self movieURL]];
/*
In addition to the MPMoviePlayerContentPreloadDidFinishNotification notification,
the MPMoviePlayerPlaybackDidFinishNotification notification is sent to
registered observers when the movie has finished playing, and the
MPMoviePlayerScalingModeDidChangeNotification notification is sent when the
movie scaling mode has changed.
*/
// Register to receive a notification when the movie has finished playing.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayBackDidFinish:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:mMoviePlayer];
// Register to receive a notification when the movie scaling mode has changed.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(movieScalingModeDidChange:)
name:MPMoviePlayerScalingModeDidChangeNotification
object:mMoviePlayer];
/* Set movie player settings (scaling, controller type and background color) to the currently set values
as specified in the Settings application */
/*
Movie scaling mode can be one of: MPMovieScalingModeNone, MPMovieScalingModeAspectFit,
MPMovieScalingModeAspectFill, MPMovieScalingModeFill.
*/
TreeAppDelegate *appDelegate = (TreeAppDelegate *)[[UIApplication sharedApplication] delegate];
mMoviePlayer.scalingMode = appDelegate.scalingMode;
/*
Movie control mode can be one of: MPMovieControlModeDefault, MPMovieControlModeVolumeOnly,
MPMovieControlModeHidden.
*/
mMoviePlayer.movieControlMode = appDelegate.controlMode;
/*
The color of the background area behind the movie can be any UIColor value.
*/
UIColor *colors[15] = {[UIColor blackColor], [UIColor darkGrayColor], [UIColor lightGrayColor], [UIColor whiteColor],
[UIColor grayColor], [UIColor redColor], [UIColor greenColor], [UIColor blueColor], [UIColor cyanColor],
[UIColor yellowColor], [UIColor magentaColor],[UIColor orangeColor], [UIColor purpleColor], [UIColor brownColor],
[UIColor clearColor]};
mMoviePlayer.backgroundColor = colors[ [appDelegate backgroundColor] ];
}
-(IBAction)playMovie:(id)sender
{
/*
As soon as you call the play: method, the player initiates a transition that fades
the screen from your current window content to the designated background
color of the player. If the movie cannot begin playing immediately, the player
object continues displaying the background color and may also display a progress
indicator to let the user know the movie is loading. When playback finishes, the
player uses another fade effect to transition back to your window content.
*/
[mMoviePlayer play];
}
#pragma mark View Controller Routines
// return a URL for the movie file in our bundle
-(NSURL *)movieURL
{
if (mMovieURL == nil)
{
NSBundle *bundle = [NSBundle mainBundle];
if (bundle)
{
NSString *moviePath = [bundle pathForResource:@"Movie" ofType:@"m4v"];
if (moviePath)
{
mMovieURL = [NSURL fileURLWithPath:moviePath];
[mMovieURL retain];
}
}
}
return mMovieURL;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return YES;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
// Low on memory: Release anything that's not essential, such as cached data, or perhaps
// unload the movie, etc.
}
- (void)dealloc {
[super dealloc];
[mMovieURL release];
// remove movie notifications
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMoviePlayerContentPreloadDidFinishNotification
object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMoviePlayerPlaybackDidFinishNotification
object:mMoviePlayer];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMoviePlayerScalingModeDidChangeNotification
object:mMoviePlayer];
// free our movie player
[mMoviePlayer release];
}
-(void)awakeFromNib {
NSBundle *mainBundle = [NSBundle mainBundle];
soundEffect = [[SoundEffect alloc] initWithContentsOfFile:[mainBundle pathForResource:@"phone" ofType:@"wav"]];
[UIAccelerometer sharedAccelerometer].delegate = self;
}
- (void) accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration
{
UIAccelerationValue length,
x,
y,
z;
//Use a basic high-pass filter to remove the influence of the gravity
myAccelerometer[0] = acceleration.x * kFilteringFactor + myAccelerometer[0] * (1.0 - kFilteringFactor);
myAccelerometer[1] = acceleration.y * kFilteringFactor + myAccelerometer[1] * (1.0 - kFilteringFactor);
myAccelerometer[2] = acceleration.z * kFilteringFactor + myAccelerometer[2] * (1.0 - kFilteringFactor);
// Compute values for the three axes of the acceleromater
x = acceleration.x - myAccelerometer[0];
y = acceleration.y - myAccelerometer[0];
z = acceleration.z - myAccelerometer[0];
//Compute the intensity of the current acceleration
length = sqrt(x * x + y * y + z * z);
// If above a given threshold, play the erase sounds and erase the drawing view
if(length >= kEraseAccelerationThreshold) {
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
[mainView playMovie:self];
}
}
@end
//mainview.h
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <MediaPlayer/MediaPlayer.h>
@class SoundEffect;
@interface MainView :UIView {
UIAccelerationValue myAccelerometer[3];
SoundEffect *soundEffect;
MPMoviePlayerController *mMoviePlayer;
NSURL *mMovieURL;
MainView *mainView;
}
-(NSURL *)movieURL;
-(void)initMoviePlayer;
-(IBAction)playMovie:(id)sender;
@end