Added [audioPlayer volume].

Tweaked the volume control a little.
CQTexperiment
vspader 2008-02-13 01:50:39 +00:00
parent 26d2b28484
commit 010f7de448
6 changed files with 2290 additions and 2287 deletions

View File

@ -30,8 +30,6 @@
int playbackStatus; int playbackStatus;
double currentVolume;
BOOL showTimeRemaining; BOOL showTimeRemaining;
AudioScrobbler *scrobbler; AudioScrobbler *scrobbler;

View File

@ -10,6 +10,24 @@
#define DEFAULT_SEEK 10 #define DEFAULT_SEEK 10
//MAX_VOLUME is in percent
#define MAX_VOLUME 400
//These functions are helpers for the process of converting volume from a linear to logarithmic scale.
//Numbers that goes in to audioPlayer should be logarithmic. Numbers that are displayed to the user should be linear.
//Here's why: http://www.dr-lex.34sp.com/info-stuff/volumecontrols.html
//We are using the approximation of X^4.
//Input/Output values are in percents.
double logarithmicToLinear(double logarithmic)
{
return pow((logarithmic/MAX_VOLUME), 0.25) * 100.0;
}
double linearToLogarithmic(double linear)
{
return (linear/100) * (linear/100) * (linear/100) * (linear/100) * MAX_VOLUME;
}
//End helper volume function thingies. ONWARDS TO GLORY!
- (id)init - (id)init
{ {
self = [super init]; self = [super init];
@ -51,15 +69,12 @@
nil]; nil];
} }
- (void)awakeFromNib - (void)awakeFromNib
{ {
[volumeSlider setDoubleValue:pow(10.0, log10(0.5)/4.0)*100];
double percent; [volumeSlider setDoubleValue:logarithmicToLinear(100.0)];
percent = (float)[volumeSlider doubleValue]/[volumeSlider maxValue];//100.0; [audioPlayer setVolume: 100];
percent = percent * percent * percent * percent;
currentVolume = ((float)[volumeSlider doubleValue]/100.0)*[volumeSlider maxValue];//percent * 1000;//0;//[volumeSlider doubleValue];
[positionSlider setEnabled:NO]; [positionSlider setEnabled:NO];
} }
@ -158,7 +173,6 @@
[self updateTimeField:0.0f]; [self updateTimeField:0.0f];
[audioPlayer play:[pe url] withUserInfo:pe]; [audioPlayer play:[pe url] withUserInfo:pe];
[audioPlayer setVolume:currentVolume];
if([[NSUserDefaults standardUserDefaults] boolForKey:@"enableAudioScrobbler"]) { if([[NSUserDefaults standardUserDefaults] boolForKey:@"enableAudioScrobbler"]) {
[scrobbler start:pe]; [scrobbler start:pe];
@ -251,24 +265,16 @@
- (IBAction)changeVolume:(id)sender - (IBAction)changeVolume:(id)sender
{ {
double percent; double oneLog = logarithmicToLinear(100.0);
double distance = [sender frame].size.height*([sender doubleValue] - oneLog)/100.0;
//Approximated log if (fabs(distance) < 2.0)
percent = (float)[sender doubleValue]/100.0;
percent = percent * percent * percent * percent;
//gravitates at the 100% mark
float v = [sender frame].size.width - ([sender frame].size.width*(percent*[sender maxValue])/100.0);
if (fabs(v) < 10.0)
{ {
percent = 0.5; [sender setDoubleValue:oneLog];
v = pow(10.0, log10(percent)/4.0);
[sender setDoubleValue:v*100.0];
} }
currentVolume = percent * 100.0; NSLog(@"VOLUME: %lf, %lf", [sender doubleValue], linearToLogarithmic([sender doubleValue]));
[audioPlayer setVolume:currentVolume]; [audioPlayer setVolume:linearToLogarithmic([sender doubleValue])];
} }
/* selector for NSTimer - gets passed the Timer object itself /* selector for NSTimer - gets passed the Timer object itself
@ -276,21 +282,18 @@
containing the current volume before we start fading. */ containing the current volume before we start fading. */
- (void)audioFader:(NSTimer *)audioTimer - (void)audioFader:(NSTimer *)audioTimer
{ {
double volume = currentVolume; double volume = [audioPlayer volume];
NSArray *origValues = [audioTimer userInfo]; double originalVolume = [[audioTimer userInfo] doubleValue];
id originalVolume = [origValues objectAtIndex:0]; NSLog(@"VOLUME IS %lf", volume);
id origSliderVolume = [origValues objectAtIndex:1]; if (volume > 0.0001) //YAY! Roundoff error!
if (volume > 0)
{ {
[self volumeDown:self]; [self volumeDown:self];
} }
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];
currentVolume = [originalVolume doubleValue]; [audioPlayer setVolume:originalVolume];
[audioPlayer setVolume:currentVolume]; [volumeSlider setDoubleValue: logarithmicToLinear(originalVolume)];
[volumeSlider setDoubleValue:[origSliderVolume doubleValue]];
[audioTimer invalidate]; [audioTimer invalidate];
} }
@ -298,51 +301,36 @@
- (IBAction)fadeOut:(id)sender withTime:(double)time - (IBAction)fadeOut:(id)sender withTime:(double)time
{ {
id origCurrentVolume = [NSNumber numberWithDouble: currentVolume]; NSNumber *originalVolume = [NSNumber numberWithDouble: [audioPlayer volume]];
id origSliderVolume = [NSNumber numberWithDouble: [volumeSlider doubleValue]];
NSArray *originalValues = [NSArray arrayWithObjects:origCurrentVolume,origSliderVolume,nil];
NSTimer *fadeTimer; NSTimer *fadeTimer;
NSLog(@"currentVolume here%f", [volumeSlider doubleValue]); NSLog(@"currentVolume here%f", [volumeSlider doubleValue]);
fadeTimer = [NSTimer scheduledTimerWithTimeInterval:time fadeTimer = [NSTimer scheduledTimerWithTimeInterval:time
target:self target:self
selector:@selector(audioFader:) selector:@selector(audioFader:)
userInfo:originalValues userInfo:originalVolume
repeats:YES]; repeats:YES];
} }
- (IBAction)volumeDown:(id)sender - (IBAction)volumeDown:(id)sender
{ {
double percent; double newVolume = linearToLogarithmic(logarithmicToLinear([audioPlayer volume]) - 5.0);
[volumeSlider setDoubleValue:([volumeSlider doubleValue] - 5)]; if (newVolume < 0)
newVolume = 0.0;
percent = (float)[volumeSlider doubleValue]/[volumeSlider maxValue];//100.0; [volumeSlider setDoubleValue:logarithmicToLinear(newVolume)];
percent = percent * percent * percent * percent; [audioPlayer setVolume:newVolume];
currentVolume = (percent * [volumeSlider maxValue]) + [volumeSlider doubleValue];//100.0;
NSLog(@"currentVolume %f", currentVolume);
[audioPlayer setVolume:currentVolume];
} }
- (IBAction)volumeUp:(id)sender - (IBAction)volumeUp:(id)sender
{ {
double percent; double newVolume = linearToLogarithmic(logarithmicToLinear([audioPlayer volume]) + 5.0);
if (newVolume > MAX_VOLUME)
newVolume = MAX_VOLUME;
[volumeSlider setDoubleValue:([volumeSlider doubleValue] + 5)]; [volumeSlider setDoubleValue:logarithmicToLinear(newVolume)];
[audioPlayer setVolume:newVolume];
percent = (float)[volumeSlider doubleValue]/[volumeSlider maxValue];//100.0;
percent = percent * percent * percent * percent;
currentVolume = (percent * [volumeSlider maxValue]) + [volumeSlider doubleValue];//100.0);
if (currentVolume > 400)
currentVolume = 400;
NSLog(@"%f", currentVolume);
[audioPlayer setVolume:currentVolume];
} }

View File

@ -16,6 +16,8 @@
BufferChain *bufferChain; BufferChain *bufferChain;
OutputNode *output; OutputNode *output;
double volume;
NSMutableArray *chainQueue; NSMutableArray *chainQueue;
NSURL *nextStream; NSURL *nextStream;
@ -40,6 +42,7 @@
- (void)seekToTime:(double)time; - (void)seekToTime:(double)time;
- (void)setVolume:(double)v; - (void)setVolume:(double)v;
- (double)volume;
- (double)amountPlayed; - (double)amountPlayed;

View File

@ -53,6 +53,7 @@
} }
output = [[OutputNode alloc] initWithController:self previous:nil]; output = [[OutputNode alloc] initWithController:self previous:nil];
[output setup]; [output setup];
[output setVolume: volume];
@synchronized(chainQueue) { @synchronized(chainQueue) {
NSEnumerator *enumerator = [chainQueue objectEnumerator]; NSEnumerator *enumerator = [chainQueue objectEnumerator];
@ -134,9 +135,16 @@
- (void)setVolume:(double)v - (void)setVolume:(double)v
{ {
volume = v;
[output setVolume:v]; [output setVolume:v];
} }
- (double)volume
{
return volume;
}
//This is called by the delegate DURING a requestNextStream request. //This is called by the delegate DURING a requestNextStream request.
- (void)setNextStream:(NSURL *)url - (void)setNextStream:(NSURL *)url

File diff suppressed because it is too large Load Diff

View File

@ -72,7 +72,7 @@
NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:filename createFile:YES]; NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:filename createFile:YES];
if (!fileHandle) { if (!fileHandle) {
NSLog(@"Error saving m3u!"); NSLog(@"Error saving m3u!");
return nil; return NO;
} }
[fileHandle truncateFileAtOffset:0]; [fileHandle truncateFileAtOffset:0];