Example #1
0
        /// <summary>
        ///
        /// </summary>
        private void PlayAudioFile()
        {
            // Create a stream channel from a file.

            if ((new FileInfo(_fileName)).Extension != ".cda")
            {
                _stream = Bass.BASS_StreamCreateFile(_fileName, 0L, 0L, BASSFlag.BASS_DEFAULT);
            }
            else
            {
                var driveIndex  = _audioCdService.GetCdDriveIndex(_fileName[0]);
                var trackNumber = _audioCdService.GetTrackNumberFromCdaFilename(_fileName);

                _stream = BassCd.BASS_CD_StreamCreate(driveIndex, trackNumber, BASSFlag.BASS_DEFAULT);
            }

            if (_stream != 0)
            {
                if ((new FileInfo(_fileName)).Extension == ".cda")
                {
                    Thread.Sleep(1000);
                }

                // Play the channel.
                Bass.BASS_ChannelPlay(_stream, false);

                Finished = false;

                Playing = true;
                Stopped = false;

                StartPlayingTrack.Invoke(this, EventArgs.Empty);
            }
            else // Error.
            {
                string msg = string.Format("Error playing file '{0}' [BASS error code: {1}]", _fileName.Split('\\').LastOrDefault(), Bass.BASS_ErrorGetCode().ToString());
                logger.Error(msg);

                MessageBox.Show(msg, "Dukebox: Error Playing File", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            // Maintain parent thread while audio is playing.
            while (Bass.BASS_ChannelIsActive(_stream) == BASSActive.BASS_ACTIVE_PLAYING &&
                   !Stopped)
            {
                // Pause audio if flagged to do so.
                if (!Playing && !Stopped)
                {
                    Bass.BASS_ChannelPause(_stream);

                    if (TrackPaused != null)
                    {
                        TrackPaused(this, EventArgs.Empty);
                    }

                    // Wait while audio is paused.
                    while (!Playing && !Stopped)
                    {
                        Thread.Sleep(10);
                    }

                    // Resume playback if audio is not flagged to stop.
                    if (!Stopped)
                    {
                        Bass.BASS_ChannelPlay(_stream, false);

                        if (TrackResumed != null)
                        {
                            TrackResumed(this, EventArgs.Empty);
                        }
                    }
                }

                if (_newPosition != -1)
                {
                    Bass.BASS_ChannelSetPosition(_stream, _newPosition);
                    _newPosition = -1;
                }

                AudioPositionChanged?.Invoke(this, EventArgs.Empty);
            }

            if (Stopped)
            {
                // Stop audio before freeing channel.
                Bass.BASS_ChannelStop(_stream);
            }

            Finished = true;

            // Free the stream channel.
            if (_stream != 0)
            {
                Bass.BASS_StreamFree(_stream);
                _stream = 0;
            }

            Playing = false;
            Stopped = false;

            if (FinishedPlayingTrack != null)
            {
                FinishedPlayingTrack(this, EventArgs.Empty);
            }
        }
Example #2
0
 public void Handle(AudioPositionChanged message)
 {
 }