How to install a hardware volume in an iPhone application?

Some iPhone apps like Pandora seem to directly manipulate the hardware volume and respond to the physical volume button. How it's done?

AudioSessionServices allows you to get the current amount of hardware output with the kAudioSessionProperty_CurrentHardwareOutputVolume property, but it is (supposedly) read-only.

+6
iphone cocoa-touch audio volume
Oct 18 '08 at 20:12
source share
2 answers

They use MPVolumeView, just add it, and it does the rest when the user touches it. Note. Doesn't work on iPhone Simulator. I think the mention of the release is also mentioned not to use it directly in Interface Builder.

 MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(25, 378, 270, 30)]; [self.view addSubview:volumeView]; [volumeView release]; 
+7
Oct 18 '08 at 21:48
source share

Here is another (complete) example of installing a hardware volume AND retrieving the volume after pressing the hardware keys:

 // AVAudiosession Delegate Method - (void)endInterruptionWithFlags:(NSUInteger)flags { // When interruption ends - set the apps audio session active again [[AVAudioSession sharedInstance] setActive:YES error:nil]; if( flags == AVAudioSessionInterruptionFlags_ShouldResume ) { // Resume playback of song here!!! } } // Hardware Button Volume Callback void audioVolumeChangeListenerCallback ( void *inUserData, AudioSessionPropertyID inID, UInt32 inDataSize, const void *inData) { UISlider * volumeSlider = (__bridge UISlider *) inUserData; Float32 newGain = *(Float32 *)inData; [volumeSlider setValue:newGain animated:YES]; } // My UISlider Did Change Callback - (IBAction)volChanged:(id)sender { CGFloat oldVolume = [[MPMusicPlayerController applicationMusicPlayer] volume]; CGFloat newVolume = ((UISlider*)sender).value; // Don't change the volume EVERYTIME but in discrete steps. // Performance will say "THANK YOU" if( fabsf(newVolume - oldVolume) > 0.05 || newVolume == 0 || newVolume == 1 ) [[MPMusicPlayerController applicationMusicPlayer] setVolume:newVolume]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // Set the volume slider to the correct value on appearance of the view volSlider.value = [[MPMusicPlayerController applicationMusicPlayer] volume]; } - (void)viewDidLoad { [super viewDidLoad]; self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; // Activate the session and set teh delegate [[AVAudioSession sharedInstance] setActive:YES error:nil]; [[AVAudioSession sharedInstance] setDelegate:self]; // Create a customizable slider and add it to the view volSlider = [[UISlider alloc] init]; CGRect sliderRect = volSlider.frame; sliderRect.origin.y = 50; sliderRect.size.width = self.view.bounds.size.width; volSlider.frame = sliderRect; [volSlider addTarget:self action:@selector(volChanged:) forControlEvents:UIControlEventValueChanged]; [self.view addSubview:volSlider]; // Regoister the callback to receive notifications from the hardware buttons AudioSessionAddPropertyListener ( kAudioSessionProperty_CurrentHardwareOutputVolume , audioVolumeChangeListenerCallback, (__bridge void*)volSlider ); [...] } - (void)viewDidUnload { [super viewDidUnload]; // Remove the Hardware-Button-Listener AudioSessionRemovePropertyListenerWithUserData( kAudioSessionProperty_CurrentHardwareOutputVolume, audioVolumeChangeListenerCallback, (__bridge void*)volSlider); } 
+6
Feb 29 2018-12-12T00:
source share



All Articles