/ Published in: Objective C
URL: http://nekakkinich.tumblr.com/post/16829509474/reproductor-personalizado-de-audio-ios
Reproductor de audio creado para iOS que puede ser personalizado.
Expand |
Embed | Plain Text
//Reproductor.h // Created by J. Ramses RodrÃguez G. on 31/01/12. #import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> @interface Reproductor : UIView<AVAudioPlayerDelegate>{ AVAudioPlayer* _reproductor; UISlider* _volumen; UISlider* _avance; NSTimer* _tiempo; UILabel* _positivo; UILabel* _negativo; } @property (nonatomic,retain) AVAudioPlayer* reproductor; @property (nonatomic,retain) UISlider* volumen; @property (nonatomic,retain) UISlider* avance; @property (nonatomic,retain) UILabel* positivo; @property (nonatomic,retain) UILabel* negativo; -(void)reproducir; -(void)detener; -(void)ajustarVolumen; -(void)ajustarReproduccion; -(void)ajustarTiempo; -(float)redondear:(float)cifra; @end //Reproductor.m // Created by J. Ramses RodrÃguez G. on 31/01/12. #import "Reproductor.h" @implementation Reproductor @synthesize reproductor=_reproductor; @synthesize volumen=_volumen; @synthesize avance=_avance; @synthesize tiempo=_tiempo; @synthesize positivo=_positivo; @synthesize negativo=_negativo; -(id)initWithFrame:(CGRect)frame{ if (self=[super initWithFrame:frame]){ //Label de fondo para localizar el espacio del reproductor UILabel* fondo=[[UILabel alloc] initWithFrame:CGRectMake(0, 546, 1024, 202)]; fondo.backgroundColor=[UIColor grayColor]; fondo.userInteractionEnabled=YES; //Botón para reproducir el audio UIButton* botonRep=[[UIButton alloc] initWithFrame:CGRectMake(160, 45, 20, 17)]; [botonRep setTitle:@"R" forState:UIControlStateNormal]; botonRep.backgroundColor=[UIColor redColor]; //Botón para pausar la reproducción del audio UIButton* botonDet=[[UIButton alloc] initWithFrame:CGRectMake(120, 45, 17, 17)]; [botonDet setTitle:@"D" forState:UIControlStateNormal]; botonDet.backgroundColor=[UIColor blueColor]; //Métodos que se activarán cuando ocurra el evento de toque sobre alguno de los botones [botonRep addTarget:self action:@selector(reproducir) forControlEvents:UIControlEventTouchUpInside]; [botonDet addTarget:self action:@selector(detener) forControlEvents:UIControlEventTouchUpInside]; //UILabel que muestra que tanto tiempo se lleva de reproducción _positivo=[[UILabel alloc] initWithFrame:CGRectMake(195, 45, 50, 20)]; _positivo.textColor=[UIColor whiteColor]; _positivo.backgroundColor=[UIColor clearColor]; //UILabel que muestra el tiempo restante en la reproducción _negativo=[[UILabel alloc] initWithFrame:CGRectMake(830, 45, 50, 20)]; _negativo.textColor=[UIColor whiteColor]; _negativo.backgroundColor=[UIColor clearColor]; //Control del volumen _volumen=[[UISlider alloc] initWithFrame:CGRectMake(850, 100, 100, 40)]; //Solo se podrá tener el doble del volumen _volumen.maximumValue=2; //Valor en 0 es igual a mudo _volumen.minimumValue=0; //Volumen real del audio _volumen.value=1; //Cada que cambie el valor del slider se ajustará el volumen [_volumen addTarget:self action:@selector(ajustarVolumen) forControlEvents:UIControlEventValueChanged]; _volumen.minimumTrackTintColor=[UIColor blackColor]; _volumen.maximumTrackTintColor=[UIColor colorWithRed:1 green:1 blue:1 alpha:.5]; //Control del tiempo de reproducción _avance=[[UISlider alloc] initWithFrame:CGRectMake(230, 35, 600, 40)]; //Cada que cambie el valor del slider se ajustará el tiempo de reproducción [_avance addTarget:self action:@selector(ajustarReproduccion) forControlEvents:UIControlEventValueChanged]; _avance.minimumTrackTintColor=[UIColor blackColor]; _avance.maximumTrackTintColor=[UIColor colorWithRed:1 green:1 blue:1 alpha:.5]; [fondo addSubview:botonRep]; [fondo addSubview:botonDet]; [fondo addSubview:_volumen]; [fondo addSubview:_avance]; [fondo addSubview:_positivo]; [fondo addSubview:_negativo]; [self addSubview:fondo]; [fondo release]; [botonRep release]; [botonDet release]; } return self; } /* // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { // Drawing code } */ //Se establece el nombre del archivo a reproducir y se crea el reproductor NSError* error; //Buscamos el archivo con extensión .mp3 //NOTA: para otro tipo de archivo solo hay que cambiar la extensión //Creamos el reproductor _reproductor=[[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; //Checamos si hubo algún error al crear el reproductor, en caso de que no sea asà //preparamos el reproductor. if(error){ NSLog(@"Ocurrió un error: %@",[error localizedDescription]); }else{ _reproductor.delegate=self; [_reproductor prepareToPlay]; } } //Comienza la reproducción del audio -(void)reproducir{ //Checamos que exista el reproductor if(_reproductor!=nil){ //Creamos un reloj para actualizar el tiempo en el que se está reproduciendo el audio if (_tiempo==nil) { _tiempo=[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(ajustarTiempo) userInfo:nil repeats:YES]; } _avance.maximumValue=_reproductor.duration; _avance.minimumValue=0; [_reproductor play]; } } //Se pausa la reproducción -(void)detener{ if(_reproductor!=nil){ [_reproductor stop]; } } //Establecemos el volumen de la reproducción -(void)ajustarVolumen{ if(_reproductor!=nil){ _reproductor.volume=_volumen.value; } } //Establecemos el tiempo de la reproducción -(void)ajustarReproduccion{ if(_reproductor!=nil){ _reproductor.currentTime=_avance.value; } } //Cambiamos el tiempo mostrado en los labels y el slider. -(void)ajustarTiempo{ //Obtenemos la duración total del audio float duracion=_reproductor.duration; //Obtenemos el tiempo de reproducción actual float actual=_reproductor.currentTime; //Calculamos los minutos que lleva la reproducción //Calculamos los segundos que lleva la reproducción actual float segundos=actual-(minutos*60); //Establecemos el valor del slider del tiempo de reproducción _avance.value=actual; //Mostramos el tiempo transcurrido //Calculamos los minutos restantes //Calculamos los segundos restantes float restaSegundos=duracion-actual; restaSegundos=[self redondear:restaSegundos]; //Mostramos el tiempo restante //Checamos si terminó la reproducción, de ser asÃ, regresamos al principio el tiempo de reproducción if (actual==duracion) { [_tiempo invalidate]; _tiempo=nil; _avance.value=0; } } //Función que hace magia XD -(float)redondear:(float)cifra{ float aux; if (cifra>60.0) { aux=fmodf(cifra, 60); }else{ aux=cifra; } if (aux==60.0) { aux=0; } return aux; } -(void)dealloc{ [_reproductor release]; [_volumen release]; [_avance release]; [_tiempo invalidate]; _tiempo=nil; [_positivo release]; [_negativo release]; [super dealloc]; } #pragma mark - AVAudioPlayerDelegate //Necesaria en caso de que se interrumpa por algún otro evento como una llamada o algo asà -(void)audioPlayerBeginInterruption:(AVAudioPlayer *)player{ [player stop]; } @end //ReproductorViewController.m // Created by J. Ramses RodrÃguez G. on 31/01/12. Reproductor* audio=[[Reproductor alloc] initWithFrame:CGRectMake(0, 0, 1024, 748)]; [audio inicializarReproductorConAudio:@"Nombre archivo"]; [self.view addSubview:audio]; [audio release];
You need to login to post a comment.
