/// <summary> /// Se encarga de comenzar a reproducir una cancion desde un archivo local /// </summary> /// <param name="ruta">La ruta de la cancion a reproducir</param> private void ReproducirCancionSinConexion(string ruta) { try { DetenerRecepcionDeCancion(); _waveOutEvent.Stop(); _bufferCancion = new MemoryStream(File.ReadAllBytes(ruta)); _mp3Reader = new Mp3FileReader(_bufferCancion); _blockAlignedStream = new WaveChannel32(_mp3Reader); _waveOutEvent = new WaveOut(WaveCallbackInfo.FunctionCallback()); _waveOutEvent.Init(_blockAlignedStream); _estadoReproductor = EstadoReproductor.Reproduciendo; _seguidorDeEventosDelReproductor.Start(); _waveOutEvent.Play(); } catch (Exception ex) { new MensajeEmergente().MostrarMensajeError(ex.Message); _waveOutEvent.Stop(); OnCambioEstadoReproduccion?.Invoke(false); _seguidorDeEventosDelReproductor.Stop(); _estadoReproductor = EstadoReproductor.Detenido; if (_bufferCancion != null && _blockAlignedStream != null) { _bufferCancion.Dispose(); _blockAlignedStream.Dispose(); } } }
/// <summary> /// Reproduce la cancion anterior de la cola o reinicia la reproduccion de la actual si el tiempo de reproduccion /// es menor o igual a 10 segundos /// </summary> public void ReproducirCancionAnterior() { try { if (_blockAlignedStream.CurrentTime.TotalSeconds <= 10) { switch (_colaDeReproduccion.ObtenerTipoDeCancionAnterior()) { case Cola.TipoCancionAReproducir.Cancion: var cancionAnterior = _colaDeReproduccion.ObtenerCancion(true); if (cancionAnterior != null) { EmpezarAReproducirCancion(cancionAnterior); } break; case Cola.TipoCancionAReproducir.CancionPersonal: var cancionPersonalAnterior = _colaDeReproduccion.ObtenerCancionPersonal(true); if (cancionPersonalAnterior != null) { EmpezarAReproducirCancionPersonal(cancionPersonalAnterior); } break; case Cola.TipoCancionAReproducir.CancionSinConexion: var cancionSinConexionAnteriror = _colaDeReproduccion.ObtenerCancionSinConexion(true); if (cancionSinConexionAnteriror != null) { EmpezarAReproducirCancionSinConexion(cancionSinConexionAnteriror); } break; } } else { if (_blockAlignedStream != null) { _blockAlignedStream.Seek(0, SeekOrigin.Begin); OnAvanceCancion?.Invoke(0); if (_estadoReproductor == EstadoReproductor.Detenido) { _waveOutEvent.Play(); if (_estadoReproductor == EstadoReproductor.Detenido || _estadoReproductor == EstadoReproductor.Pausado) { _seguidorDeEventosDelReproductor.Start(); _estadoReproductor = EstadoReproductor.Reproduciendo; } OnCambioEstadoReproduccion?.Invoke(true); } } } } catch (NullReferenceException) { } }
/// <summary> /// Empieza la reproduccion de una cancion sin conexion sin afectar a la cola de reproduccion /// </summary> /// <param name="cancion">La cancion sin conexion a reproducir</param> public void EmpezarAReproducirCancionSinConexion(CancionSinConexion cancion) { OnActualizacionCola?.Invoke(_colaDeReproduccion.ObtenerProximosElementosEnCola()); OnIniciaReproduccionCancion?.Invoke(cancion); OnCambioEstadoReproduccion?.Invoke(true); _estadoReproductor = EstadoReproductor.Reproduciendo; _duracionTotalDeCancionEnReproduccion = cancion.duracion; ReproducirCancionSinConexion(cancion.ruta_cancion); }
/// <summary> /// Empieza la reproduccion de una cancion personal sin afectar la cola de reproduccion /// </summary> /// <param name="cancionPersonal">La cancion personal a reproducir</param> public void EmpezarAReproducirCancionPersonal(CancionPersonal cancionPersonal) { OnActualizacionCola?.Invoke(_colaDeReproduccion.ObtenerProximosElementosEnCola()); OnIniciaReproduccionCancionPersonal?.Invoke(cancionPersonal); OnCambioEstadoReproduccion?.Invoke(true); _estadoReproductor = EstadoReproductor.Reproduciendo; _duracionTotalDeCancionEnReproduccion = cancionPersonal.duracion; ReproducirCancion(cancionPersonal.id, true); }
/// <summary> /// Sigue el tiempo de reproduccion de la cancion en reproduccion /// </summary> /// <param name="sender">El objeto que invoco el evento</param> /// <param name="e">El evento invocado</param> private void SeguidorDeTiempoReproduccion(object sender, EventArgs e) { OnAvanceCancion?.Invoke(_blockAlignedStream.CurrentTime.TotalSeconds); if ((int)Math.Ceiling(_blockAlignedStream.CurrentTime.TotalSeconds) >= (int)Math.Ceiling(_duracionTotalDeCancionEnReproduccion)) { _seguidorDeEventosDelReproductor.Stop(); _waveOutEvent.Stop(); _estadoReproductor = EstadoReproductor.Detenido; OnCambioEstadoReproduccion?.Invoke(false); if (_bufferCancion != null && _blockAlignedStream != null) { _bufferCancion.Dispose(); _blockAlignedStream.Dispose(); } ReproducirSiguienteCancion(); } }
/// <summary> /// Pausa, Reproduce o Inicia la siguiente cancion dependiento de _estadoReproductor /// </summary> public void Play() { if (_estadoReproductor == EstadoReproductor.Reproduciendo) { _waveOutEvent.Pause(); _seguidorDeEventosDelReproductor.Stop(); OnCambioEstadoReproduccion?.Invoke(false); _estadoReproductor = EstadoReproductor.Pausado; } else if (_estadoReproductor == EstadoReproductor.Pausado) { _waveOutEvent.Play(); _seguidorDeEventosDelReproductor.Start(); OnCambioEstadoReproduccion?.Invoke(true); _estadoReproductor = EstadoReproductor.Reproduciendo; } else if (_estadoReproductor == EstadoReproductor.Detenido) { ReproducirSiguienteCancion(); } }
/// <summary> /// Se encarga de manejar los errores que puedan ocurrir al recuperar una cancion del servidor /// </summary> /// <param name="message">El mensaje que recibe del cliente de canciones</param> private void ManejarErrores(string message) { if (message != "AuntenticacionFallida") { new MensajeEmergente().MostrarMensajeError(message); } else { new MensajeEmergente().MostrarMensajeError("No se logro logear con las credenciales proporcionadas " + "en el inicio de sesión, si continua obteniendo este " + "mensaje, cierre sesión y vuelva a logearse"); } _waveOutEvent.Stop(); OnCambioEstadoReproduccion?.Invoke(false); _seguidorDeEventosDelReproductor.Stop(); _estadoReproductor = EstadoReproductor.Detenido; if (_bufferCancion != null && _blockAlignedStream != null) { _bufferCancion.Dispose(); _blockAlignedStream.Dispose(); } ReproducirSiguienteCancion(); }