Added incremental seeking with remote, volumeUp/Down now take an amount argument, seekForward/Backward now take an amount argument, fixed incremental fadeout that will not register more than one timer, added status kCogStatusFading
parent
3c712e2e45
commit
f64ebf597f
|
@ -44,33 +44,47 @@
|
||||||
increase/decrease as long as the user holds the left/right, plus/minus button */
|
increase/decrease as long as the user holds the left/right, plus/minus button */
|
||||||
- (void) executeHoldActionForRemoteButton: (NSNumber*) buttonIdentifierNumber
|
- (void) executeHoldActionForRemoteButton: (NSNumber*) buttonIdentifierNumber
|
||||||
{
|
{
|
||||||
|
static int incrementalSearch = 1;
|
||||||
|
|
||||||
if (remoteButtonHeld)
|
if (remoteButtonHeld)
|
||||||
{
|
{
|
||||||
switch([buttonIdentifierNumber intValue])
|
switch([buttonIdentifierNumber intValue])
|
||||||
{
|
{
|
||||||
case kRemoteButtonRight_Hold:
|
case kRemoteButtonRight_Hold:
|
||||||
//Seek forward?
|
[playbackController seekForward:incrementalSearch];
|
||||||
break;
|
break;
|
||||||
case kRemoteButtonLeft_Hold:
|
case kRemoteButtonLeft_Hold:
|
||||||
//Seek back
|
[playbackController seekBackward:incrementalSearch];
|
||||||
break;
|
break;
|
||||||
case kRemoteButtonVolume_Plus_Hold:
|
case kRemoteButtonVolume_Plus_Hold:
|
||||||
//Volume Up
|
//Volume Up
|
||||||
[playbackController volumeUp: self];
|
[playbackController volumeUp:DEFAULT_VOLUME_UP];
|
||||||
break;
|
break;
|
||||||
case kRemoteButtonVolume_Minus_Hold:
|
case kRemoteButtonVolume_Minus_Hold:
|
||||||
//Volume Down
|
//Volume Down
|
||||||
[playbackController volumeDown: self];
|
[playbackController volumeDown:DEFAULT_VOLUME_DOWN];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (remoteButtonHeld)
|
if (remoteButtonHeld)
|
||||||
{
|
{
|
||||||
|
/* there should perhaps be a max amount that incrementalSearch can
|
||||||
|
be, so as to not start skipping ahead unreasonable amounts, even
|
||||||
|
in very long files. */
|
||||||
|
if ((incrementalSearch % 3) == 0)
|
||||||
|
incrementalSearch += incrementalSearch/3;
|
||||||
|
else
|
||||||
|
incrementalSearch++;
|
||||||
|
|
||||||
/* trigger event */
|
/* trigger event */
|
||||||
[self performSelector:@selector(executeHoldActionForRemoteButton:)
|
[self performSelector:@selector(executeHoldActionForRemoteButton:)
|
||||||
withObject:buttonIdentifierNumber
|
withObject:buttonIdentifierNumber
|
||||||
afterDelay:0.25];
|
afterDelay:0.25];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
// if we're not holding the search button, reset the incremental search
|
||||||
|
// variable, making it ready for another search
|
||||||
|
incrementalSearch = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Apple Remote callback */
|
/* Apple Remote callback */
|
||||||
|
@ -85,10 +99,10 @@ increase/decrease as long as the user holds the left/right, plus/minus button */
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case kRemoteButtonVolume_Plus:
|
case kRemoteButtonVolume_Plus:
|
||||||
[playbackController volumeUp: self];
|
[playbackController volumeUp:DEFAULT_VOLUME_UP];
|
||||||
break;
|
break;
|
||||||
case kRemoteButtonVolume_Minus:
|
case kRemoteButtonVolume_Minus:
|
||||||
[playbackController volumeDown: self];
|
[playbackController volumeDown:DEFAULT_VOLUME_DOWN];
|
||||||
break;
|
break;
|
||||||
case kRemoteButtonRight:
|
case kRemoteButtonRight:
|
||||||
[self clickNext];
|
[self clickNext];
|
||||||
|
|
|
@ -8,6 +8,9 @@
|
||||||
#import "TrackingSlider.h"
|
#import "TrackingSlider.h"
|
||||||
#import "AudioScrobbler.h"
|
#import "AudioScrobbler.h"
|
||||||
|
|
||||||
|
#define DEFAULT_VOLUME_DOWN 5
|
||||||
|
#define DEFAULT_VOLUME_UP DEFAULT_VOLUME_DOWN
|
||||||
|
|
||||||
@class PlaylistController;
|
@class PlaylistController;
|
||||||
@class PlaylistView;
|
@class PlaylistView;
|
||||||
|
|
||||||
|
@ -38,9 +41,10 @@
|
||||||
- (IBAction)toggleShowTimeRemaining:(id)sender;
|
- (IBAction)toggleShowTimeRemaining:(id)sender;
|
||||||
- (IBAction)changeVolume:(id)sender;
|
- (IBAction)changeVolume:(id)sender;
|
||||||
|
|
||||||
- (IBAction)volumeDown:(id)sender;
|
- (void)volumeDown:(double)amount;
|
||||||
- (IBAction)volumeUp:(id)sender;
|
- (IBAction)eventVolumeDown:(id)sender;
|
||||||
|
- (void)volumeUp:(double)amount;
|
||||||
|
- (IBAction)eventVolumeUp:(id)sender;
|
||||||
- (IBAction)playPauseResume:(id)sender;
|
- (IBAction)playPauseResume:(id)sender;
|
||||||
- (IBAction)pauseResume:(id)sender;
|
- (IBAction)pauseResume:(id)sender;
|
||||||
|
|
||||||
|
@ -54,8 +58,10 @@
|
||||||
- (IBAction)next:(id)sender;
|
- (IBAction)next:(id)sender;
|
||||||
- (IBAction)prev:(id)sender;
|
- (IBAction)prev:(id)sender;
|
||||||
- (IBAction)seek:(id)sender;
|
- (IBAction)seek:(id)sender;
|
||||||
- (IBAction)seekForward:(id)sender;
|
- (IBAction)eventSeekForward:(id)sender;
|
||||||
- (IBAction)seekBackward:(id)sender;
|
- (void)seekForward:(double)sender;
|
||||||
|
- (IBAction)eventSeekBackward:(id)sender;
|
||||||
|
- (void)seekBackward:(double)amount;
|
||||||
- (IBAction)fadeOut:(id)sender withTime:(double)time;
|
- (IBAction)fadeOut:(id)sender withTime:(double)time;
|
||||||
|
|
||||||
- (void)initDefaults;
|
- (void)initDefaults;
|
||||||
|
|
|
@ -216,9 +216,14 @@ double linearToLogarithmic(double linear)
|
||||||
[self updateTimeField:time];
|
[self updateTimeField:time];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)seekForward:(id)sender
|
- (IBAction)eventSeekForward:(id)sender
|
||||||
{
|
{
|
||||||
double seekTo = [audioPlayer amountPlayed] + DEFAULT_SEEK;
|
[self seekForward:DEFAULT_SEEK];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)seekForward:(double)amount
|
||||||
|
{
|
||||||
|
double seekTo = [audioPlayer amountPlayed] + amount;
|
||||||
|
|
||||||
if (seekTo > (int)[positionSlider maxValue])
|
if (seekTo > (int)[positionSlider maxValue])
|
||||||
{
|
{
|
||||||
|
@ -232,9 +237,14 @@ double linearToLogarithmic(double linear)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)seekBackward:(id)sender
|
- (IBAction)eventSeekBackward:(id)sender
|
||||||
{
|
{
|
||||||
double seekTo = [audioPlayer amountPlayed] - DEFAULT_SEEK;
|
[self seekBackward:DEFAULT_SEEK];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)seekBackward:(double)amount
|
||||||
|
{
|
||||||
|
double seekTo = [audioPlayer amountPlayed] - amount;
|
||||||
|
|
||||||
if (seekTo < 0)
|
if (seekTo < 0)
|
||||||
{
|
{
|
||||||
|
@ -282,18 +292,22 @@ double linearToLogarithmic(double linear)
|
||||||
containing the current volume before we start fading. */
|
containing the current volume before we start fading. */
|
||||||
- (void)audioFader:(NSTimer *)audioTimer
|
- (void)audioFader:(NSTimer *)audioTimer
|
||||||
{
|
{
|
||||||
|
static int incrementalFader = 10;
|
||||||
double volume = [audioPlayer volume];
|
double volume = [audioPlayer volume];
|
||||||
double originalVolume = [[audioTimer userInfo] doubleValue];
|
double originalVolume = [[audioTimer userInfo] doubleValue];
|
||||||
|
|
||||||
NSLog(@"VOLUME IS %lf", volume);
|
NSLog(@"VOLUME IS %lf", volume);
|
||||||
|
|
||||||
if (volume > 0.0001) //YAY! Roundoff error!
|
if (volume > 0.0001) //YAY! Roundoff error!
|
||||||
{
|
{
|
||||||
[self volumeDown:self];
|
[self volumeDown:incrementalFader++];
|
||||||
}
|
}
|
||||||
else // volume is at 0 or below, we are ready to release the timer and move on
|
else // volume is at 0 or below, we are ready to release the timer and move on
|
||||||
{
|
{
|
||||||
[audioPlayer pause];
|
[audioPlayer pause];
|
||||||
[audioPlayer setVolume:originalVolume];
|
[audioPlayer setVolume:originalVolume];
|
||||||
[volumeSlider setDoubleValue: logarithmicToLinear(originalVolume)];
|
[volumeSlider setDoubleValue: logarithmicToLinear(originalVolume)];
|
||||||
|
incrementalFader = 10;
|
||||||
[audioTimer invalidate];
|
[audioTimer invalidate];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -301,11 +315,15 @@ double linearToLogarithmic(double linear)
|
||||||
|
|
||||||
- (IBAction)fadeOut:(id)sender withTime:(double)time
|
- (IBAction)fadeOut:(id)sender withTime:(double)time
|
||||||
{
|
{
|
||||||
NSNumber *originalVolume = [NSNumber numberWithDouble: [audioPlayer volume]];
|
// we can not allow multiple fade timers to be registered
|
||||||
|
if (playbackStatus != kCogStatusPlaying)
|
||||||
|
return;
|
||||||
|
|
||||||
|
NSNumber *originalVolume = [NSNumber numberWithDouble: [audioPlayer volume]];
|
||||||
NSTimer *fadeTimer;
|
NSTimer *fadeTimer;
|
||||||
|
|
||||||
NSLog(@"currentVolume here%f", [volumeSlider doubleValue]);
|
playbackStatus = kCogStatusFading;
|
||||||
|
|
||||||
fadeTimer = [NSTimer scheduledTimerWithTimeInterval:time
|
fadeTimer = [NSTimer scheduledTimerWithTimeInterval:time
|
||||||
target:self
|
target:self
|
||||||
selector:@selector(audioFader:)
|
selector:@selector(audioFader:)
|
||||||
|
@ -313,19 +331,30 @@ double linearToLogarithmic(double linear)
|
||||||
repeats:YES];
|
repeats:YES];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)volumeDown:(id)sender
|
- (IBAction)eventVolumeDown:(id)sender
|
||||||
{
|
{
|
||||||
double newVolume = linearToLogarithmic(logarithmicToLinear([audioPlayer volume]) - 5.0);
|
[self volumeDown:DEFAULT_VOLUME_DOWN];
|
||||||
if (newVolume < 0)
|
}
|
||||||
|
|
||||||
|
- (void)volumeDown:(double)amount
|
||||||
|
{
|
||||||
|
double newVolume;
|
||||||
|
if (amount > [audioPlayer volume])
|
||||||
newVolume = 0.0;
|
newVolume = 0.0;
|
||||||
|
else
|
||||||
|
newVolume = linearToLogarithmic(logarithmicToLinear([audioPlayer volume]) - amount);
|
||||||
|
|
||||||
[volumeSlider setDoubleValue:logarithmicToLinear(newVolume)];
|
[volumeSlider setDoubleValue:logarithmicToLinear(newVolume)];
|
||||||
[audioPlayer setVolume:newVolume];
|
[audioPlayer setVolume:newVolume];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)volumeUp:(id)sender
|
- (IBAction)eventVolumeUp:(id)sender
|
||||||
{
|
{
|
||||||
double newVolume = linearToLogarithmic(logarithmicToLinear([audioPlayer volume]) + 5.0);
|
[self volumeUp:DEFAULT_VOLUME_UP];
|
||||||
|
}
|
||||||
|
- (void)volumeUp:(double)amount
|
||||||
|
{
|
||||||
|
double newVolume = linearToLogarithmic(logarithmicToLinear([audioPlayer volume]) + amount);
|
||||||
if (newVolume > MAX_VOLUME)
|
if (newVolume > MAX_VOLUME)
|
||||||
newVolume = MAX_VOLUME;
|
newVolume = MAX_VOLUME;
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ enum
|
||||||
kCogStatusPaused = 0,
|
kCogStatusPaused = 0,
|
||||||
kCogStatusStopped,
|
kCogStatusStopped,
|
||||||
kCogStatusPlaying,
|
kCogStatusPlaying,
|
||||||
|
kCogStatusFading,
|
||||||
// kCogStatusEndOfFile,
|
// kCogStatusEndOfFile,
|
||||||
// kCogStatusEndOfPlaylist,
|
// kCogStatusEndOfPlaylist,
|
||||||
// kCogStatusPlaybackEnded
|
// kCogStatusPlaybackEnded
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,8 +1,2 @@
|
||||||
Undo is broken badly when filtering.
|
Undo is broken badly when filtering.
|
||||||
|
|
||||||
Fade to pause is severely broken now that it uses volumeDown, since
|
|
||||||
this will not take into account the time used to fade.
|
|
||||||
|
|
||||||
volumeUp and volumeDown of playbackController aren't quite right, and
|
|
||||||
the slider sets the volume differently.
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue