Пример #1
0
        public override IBassStream CreateInteractiveStream(PlaylistItem playlistItem, IEnumerable <IBassStreamAdvice> advice, BassFlags flags)
        {
            var drive    = default(int);
            var id       = default(string);
            var track    = default(int);
            var fileName = this.GetFileName(playlistItem, advice);

            if (!CdUtils.ParseUrl(fileName, out drive, out id, out track))
            {
                //This shouldn't happen as CanCreateStream would have returned false.
                return(BassStream.Empty);
            }
            this.AssertDiscId(drive, id);
            var channelHandle = default(int);

            lock (SyncRoot)
            {
                if (this.GetCurrentStream(drive, track, out channelHandle))
                {
                    return(this.CreateInteractiveStream(channelHandle, advice, flags));
                }
                if (this.Output != null && this.Output.PlayFromMemory)
                {
                    Logger.Write(this, LogLevel.Warn, "This provider cannot play from memory.");
                }
                if (BassCd.FreeOld)
                {
                    Logger.Write(this, LogLevel.Debug, "Updating config: BASS_CONFIG_CD_FREEOLD = FALSE");
                    BassCd.FreeOld = false;
                }
                channelHandle = BassCd.CreateStream(drive, track, flags);
            }
            return(this.CreateInteractiveStream(channelHandle, advice, flags));
        }
 public override bool InitializeComponent()
 {
     Logger.Write(this, LogLevel.Debug, "Querying CDDB for drive: {0}", this.Drive);
     try
     {
         //The CDDB and Read must be executed together so synchronize.
         lock (SyncRoot)
         {
             var id       = BassCd.GetID(this.Drive, CDID.CDDB);
             var sequence = BassCd.GetID(this.Drive, CDID.Read);
             this.Parser = new CddbTextParser(id, sequence);
         }
         if (this.Parser.Count == 0)
         {
             Logger.Write(this, LogLevel.Debug, "CDDB did not return any information for drive: {0}", this.Drive);
             return(false);
         }
     }
     catch (Exception e)
     {
         Logger.Write(this, LogLevel.Warn, "Failed to query CDDB for drive {0}: {1}", this.Drive, e.Message);
         return(false);
     }
     return(base.InitializeComponent());
 }
Пример #3
0
 protected virtual bool GetCurrentStream(int drive, int track, out int channelHandle)
 {
     if (this.Output != null && this.Output.IsStarted)
     {
         var enqueuedChannelHandle = default(int);
         this.PipelineManager.WithPipeline(pipeline =>
         {
             if (pipeline != null)
             {
                 using (var sequence = pipeline.Input.Queue.GetEnumerator())
                 {
                     while (sequence.MoveNext())
                     {
                         if (BassCd.StreamGetTrack(sequence.Current) == track)
                         {
                             enqueuedChannelHandle = sequence.Current;
                             break;
                         }
                     }
                 }
             }
         });
         if (enqueuedChannelHandle != 0)
         {
             channelHandle = enqueuedChannelHandle;
             return(true);
         }
     }
     channelHandle = 0;
     return(false);
 }
Пример #4
0
 protected virtual void Dispose(bool disposing)
 {
     if (_source != 0)
     {
         if (_mixer != 0)
         {
             Stop();
         }
         RemoveEq(ref _mixer);
         Bass.StreamFree(_source);
         Bass.MusicFree(_source);
         Bass.StreamFree(_mixer);
         _mixer  = 0;
         _source = 0;
     }
     if (_handle.IsAllocated)
     {
         _handle.Free();
     }
     if (_initialized)
     {
         Bass.Free();
     }
     BassCd.Unload();
     BassFx.Unload();
     BassMix.Unload();
     Bass.PluginFree(0);
     GC.SuppressFinalize(this);
 }
Пример #5
0
 /// <summary>
 /// Free used resources
 /// </summary>
 public void Dispose()
 {
     if (_source != 0)
     {
         if (_mixer != 0)
         {
             Stop();
         }
         RemoveEq(ref _mixer);
         Bass.StreamFree(_source);
         Bass.MusicFree(_source);
         Bass.StreamFree(_mixer);
         _mixer  = 0;
         _source = 0;
     }
     if (_handle.IsAllocated)
     {
         _handle.Free();
     }
     if (_initialized)
     {
         Bass.Free();
     }
     BassCd.Unload();
     BassFx.Unload();
     BassMix.Unload();
     Bass.PluginFree(0);
 }
Пример #6
0
            protected override async Task OnRun()
            {
                this.Name = "Opening CD";
                try
                {
                    if (!BassCd.IsReady(this.Drive))
                    {
                        throw new InvalidOperationException("Drive is not ready.");
                    }
                    var playlist      = this.PlaylistManager.SelectedPlaylist;
                    var playlistItems = await this.Factory.Create().ConfigureAwait(false);

                    using (var task = new SingletonReentrantTask(this, ComponentSlots.Database, SingletonReentrantTask.PRIORITY_HIGH, async cancellationToken =>
                    {
                        //Always append for now.
                        this.Sequence = this.PlaylistBrowser.GetInsertIndex(this.PlaylistManager.SelectedPlaylist);
                        await this.AddPlaylistItems(playlist, playlistItems).ConfigureAwait(false);
                        await this.ShiftItems(QueryOperator.GreaterOrEqual, this.Sequence, this.Offset).ConfigureAwait(false);
                        await this.SetPlaylistItemsStatus(PlaylistItemStatus.None).ConfigureAwait(false);
                    }))
                    {
                        await task.Run().ConfigureAwait(false);
                    }
                }
                finally
                {
                    //Ignoring result on purpose.
                    BassCd.Release(this.Drive);
                }
                await this.SignalEmitter.Send(new Signal(this, CommonSignals.PlaylistUpdated, new[] { this.Playlist })).ConfigureAwait(false);
            }
Пример #7
0
            private async Task AddOrUpdateMetaData()
            {
                Logger.Write(this, LogLevel.Debug, "Fetching meta data for new playlist items.");
                using (var transaction = this.Database.BeginTransaction(this.Database.PreferredIsolationLevel))
                {
                    var query = this.Database
                                .AsQueryable <PlaylistItem>(this.Database.Source(new DatabaseQueryComposer <PlaylistItem>(this.Database), transaction))
                                .Where(playlistItem => playlistItem.Status == PlaylistItemStatus.Import);
                    var info = default(CDInfo);
                    BassUtils.OK(BassCd.GetInfo(this.Drive, out info));
                    using (var writer = new MetaDataWriter(this.Database, this.Database.Queries.AddPlaylistMetaDataItem, transaction))
                    {
                        foreach (var playlistItem in query)
                        {
                            var metaData = await this.MetaDataSource.GetMetaData(playlistItem.FileName).ConfigureAwait(false);

                            foreach (var metaDataItem in metaData)
                            {
                                await writer.Write(playlistItem.Id, metaDataItem).ConfigureAwait(false);
                            }
                        }
                    }
                    transaction.Commit();
                }
            }
Пример #8
0
        private Player()
        {
            var enginedir = AppDomain.CurrentDomain.BaseDirectory;

            if (Is64Bit)
            {
                enginedir = Path.Combine(enginedir, @"Engine\x64");
            }
            else
            {
                enginedir = Path.Combine(enginedir, @"Engine\x86");
            }
            Bass.Load(enginedir);
            BassMix.Load(enginedir);
            BassCd.Load(enginedir);
            BassFx.Load(enginedir);
            Bass.PluginLoad(enginedir + "\\bass_aac.dll");
            Bass.PluginLoad(enginedir + "\\bass_ac3.dll");
            Bass.PluginLoad(enginedir + "\\bass_ape.dll");
            Bass.PluginLoad(enginedir + "\\bass_mpc.dll");
            Bass.PluginLoad(enginedir + "\\bass_spx.dll");
            Bass.PluginLoad(enginedir + "\\bass_tta.dll");
            Bass.PluginLoad(enginedir + "\\bassalac.dll");
            Bass.PluginLoad(enginedir + "\\bassdsd.dll");
            Bass.PluginLoad(enginedir + "\\bassflac.dll");
            Bass.PluginLoad(enginedir + "\\bassopus.dll");
            Bass.PluginLoad(enginedir + "\\basswma.dll");
            Bass.PluginLoad(enginedir + "\\basswv.dll");
            Bass.PluginLoad(enginedir + "\\bassmidi.dll");
            _callback = MyDownloadProc;
            _maxfft   = (int)(DataFlags.Available | DataFlags.FFT2048);
        }
 public virtual IEnumerable <MetaDataItem> GetProperties(int track)
 {
     yield return(new MetaDataItem(CommonProperties.Duration, MetaDataItemType.Property)
     {
         //What the f**k is this? Something to do with 44.1kHz/16bit?
         Value = ((BassCd.GetTrackLength(this.Drive, track) / 176400) * 1000).ToString()
     });
 }
Пример #10
0
 public static IEnumerable <string> GetDrives()
 {
     for (int a = 0, b = BassCd.DriveCount; a < b; a++)
     {
         var cdInfo = default(CDInfo);
         BassUtils.OK(BassCd.GetInfo(a, out cdInfo));
         yield return(GetDriveName(cdInfo));
     }
 }
Пример #11
0
        public static void ReleaseCDDrives()
        {
            int driveCount = BassCd.BASS_CD_GetDriveCount();

            for (int i = 0; i < driveCount; i++)
            {
                BassCd.BASS_CD_Release(i);
            }
        }
 private static IEnumerable <SelectionConfigurationOption> GetDrives()
 {
     for (int a = 0, b = BassCd.DriveCount; a < b; a++)
     {
         var cdInfo = default(CDInfo);
         BassUtils.OK(BassCd.GetInfo(a, out cdInfo));
         LogManager.Logger.Write(typeof(BassCdStreamProviderBehaviourConfiguration), LogLevel.Debug, "CD Drive: {0} => {1} => {2}", a, cdInfo.Name, cdInfo.Manufacturer);
         yield return(new SelectionConfigurationOption(cdInfo.Name, string.Format("{0} ({1}:\\)", cdInfo.Name, cdInfo.DriveLetter), cdInfo.Name));
     }
 }
Пример #13
0
        protected virtual void AssertDiscId(int drive, string expected)
        {
            var actual = BassCd.GetID(drive, CDID.CDPlayer);

            if (string.Equals(expected, actual, StringComparison.OrdinalIgnoreCase))
            {
                return;
            }
            throw new InvalidOperationException(string.Format("Found disc with identifier \"{0}\" when \"{1}\" was required.", actual, expected));
        }
        private BassCDTrackInputSource(char drive, uint trackNo)
        {
            _drive   = drive;
            _trackNo = trackNo;
            int bassDrive = BassUtils.Drive2BassID(_drive);
            // Note: CD audio is always 44100hz stereo 16-bit. That's 176400 bytes per second. So dividing the track length by 176400 gives the length in seconds.
            int cdLength = BassCd.BASS_CD_GetTrackLength(bassDrive, BassTrackNo);

            _length = TimeSpan.FromSeconds((double)cdLength / 176400);
        }
Пример #15
0
        public static bool GetDiscMatchAndUpdate(string fileName, TrackInfo trackInfo)
        {
            int trackNo = 1; //TODO: Detect track from filename?

            if (trackInfo.TrackNum > 0)
            {
                trackNo = trackInfo.TrackNum;
            }

            string root = Path.GetPathRoot(fileName);

            if (string.IsNullOrEmpty(root))
            {
                return(false);
            }
            char rootLetter = root[0];

            if (PHYSICAL_DISK_ROOTS.Contains(rootLetter) == false)
            {
                int drive = BassUtils.Drive2BassID(rootLetter);
                if (drive > -1)
                {
                    string cdDbId        = BassCd.BASS_CD_GetID(drive, BASSCDId.BASS_CDID_CDDB);
                    string musicBrainzId = BassCd.BASS_CD_GetID(drive, BASSCDId.BASS_CDID_MUSICBRAINZ);
                    string upc           = BassCd.BASS_CD_GetID(drive, BASSCDId.BASS_CDID_UPC);
                    string irsc          = BassCd.BASS_CD_GetID(drive, BASSCDId.BASS_CDID_ISRC + (trackNo - 1));
                    BassCd.BASS_CD_Release(drive);

                    if (!string.IsNullOrEmpty(cdDbId))
                    {
                        trackInfo.AlbumCdDdId = cdDbId;
                    }
                    if (!string.IsNullOrEmpty(musicBrainzId))
                    {
                        trackInfo.AlbumMusicBrainzDiscId = musicBrainzId;
                    }
                    if (!string.IsNullOrEmpty(upc))
                    {
                        trackInfo.AlbumUpcEanId = upc;
                    }
                    if (!string.IsNullOrEmpty(irsc))
                    {
                        trackInfo.IsrcId = irsc;
                    }

                    return(true);
                }
                else
                {
                    PHYSICAL_DISK_ROOTS.Add(rootLetter);
                }
            }
            return(false);
        }
Пример #16
0
        void Refresh()
        {
            AvailableDrives.Clear();

            CDInfo devInfo;

            for (var i = 0; BassCd.GetInfo(i, out devInfo); ++i)
            {
                AvailableDrives.Add(devInfo);
            }
        }
 public override bool InitializeComponent()
 {
     Logger.Write(this, LogLevel.Debug, "Querying CDDB for drive: {0}", this.Drive);
     this.Parser = new CddbTextParser(BassCd.GetID(this.Drive, CDID.CDDB), BassCd.GetID(this.Drive, CDID.Read));
     if (this.Parser.Count == 0)
     {
         Logger.Write(this, LogLevel.Debug, "CDDB did not return any information for drive: {0}", this.Drive);
         return(false);
     }
     return(base.InitializeComponent());
 }
 private int Drive2BassID(char driveLetter)
 {
     for (int i = 0; i < 25; i++)
     {
         if (BassCd.BASS_CD_GetInfo(i).DriveLetter == driveLetter)
         {
             return(i);
         }
     }
     return(-1);
 }
Пример #19
0
        public IEnumerable <string> JobFunction(string inputdata, IProgress <float> progress, CancellationToken ct)
        {
            var list = new List <string>();

            int drivecount = BassCd.DriveCount;
            int driveindex = 0;

            for (int i = 0; i < drivecount; i++)
            {
                ct.ThrowIfCancellationRequested();
                var info = BassCd.GetInfo(i);
                if (info.DriveLetter == inputdata[0])
                {
                    driveindex = i;
                    break;
                }
            }

            if (BassCd.IsReady(driveindex))
            {
                ct.ThrowIfCancellationRequested();
                var numtracks = BassCd.GetTracks(driveindex);

                if (numtracks < 2)
                {
                    return(list);
                }

                var discid = BassCd.GetID(0, CDID.CDDB); //cddb connect
                if (App.DiscID != discid)
                {
                    ct.ThrowIfCancellationRequested();
                    var datas = BassCd.GetIDText(driveindex);
                    App.DiscID = discid;
                    App.CdData.Clear();
                    foreach (var data in datas)
                    {
                        ct.ThrowIfCancellationRequested();
                        var item = data.Split('=');
                        App.CdData.Add(item[0], item[1]);
                    }
                }
                for (int i = 0; i < numtracks; i++)
                {
                    ct.ThrowIfCancellationRequested();
                    var entry = string.Format("cd://{0}/{1}", driveindex, i);
                    list.Add(entry);
                    progress.Report((float)i / numtracks);
                }
            }
            BassCd.Release(driveindex);
            return(list);
        }
Пример #20
0
 protected virtual void OnFree(object sender, EventArgs e)
 {
     if (!this.IsInitialized)
     {
         return;
     }
     BassGaplessCd.Disable();
     BassGaplessCd.Free();
     //Ignoring result on purpose.
     BassCd.Release(this.Drive);
     this.IsInitialized = false;
 }
Пример #21
0
 /// <inheritdoc />
 private void LoadLibs()
 {
     Log.Info("Loading bass.dll...");
     Bass.Load(NativeLibPath);
     Log.Info("Loading bassmix.dll...");
     BassMix.Load(NativeLibPath);
     Log.Info("Loading basscd.dll...");
     BassCd.Load(NativeLibPath);
     LoadPlugins("bass_aac.dll", "bass_ac3.dll",
                 "bassalac.dll", "bassflac.dll",
                 "basswma.dll", "basswv.dll");
 }
Пример #22
0
        public CdMetadata GetMetadataForCd(char driveLetter)
        {
            driveLetter = Char.ToLower(driveLetter);

            // Not a valid drive letter.
            if (driveLetter < 'a' || driveLetter > 'z')
            {
                throw new ArgumentException(string.Format("'{0}' is not a valid drive letter! Drive letter should be a letter between a-z.", driveLetter));
            }

            CheckForCddbServerConnection();

            // Find drive details.
            int driveIndex = _audioCdService.GetCdDriveIndex(driveLetter);

            string cddbResponse = BassCd.BASS_CD_GetID(driveIndex, BASSCDId.BASS_CDID_CDDB_QUERY);
            string entries      = BassCd.BASS_CD_GetID(driveIndex, BASSCDId.BASS_CDID_CDDB_QUERY + 1);

            // Get album name from server response.
            string album          = string.Empty;
            Match  albumInfoMatch = Regex.Match(entries, "DTITLE=");

            if (albumInfoMatch != null)
            {
                int ablumIdx = albumInfoMatch.Index;
                album = entries.Substring(ablumIdx, entries.Substring(ablumIdx).IndexOf("\r")).Split('=').LastOrDefault().Split('/').LastOrDefault();
                album = album.Substring(1);
            }

            // Get artist name from server response.
            string artist = string.Empty;

            if (albumInfoMatch != null)
            {
                int artistIdx = albumInfoMatch.Index;
                artist = entries.Substring(artistIdx, entries.Substring(artistIdx).IndexOf("\r")).Split('=').LastOrDefault().Split('/').FirstOrDefault();
                artist = artist.Substring(0, artist.Length - 1);
            }

            // Get track names from server response.
            var           matches    = Regex.Matches(entries, "TTITLE");
            List <string> trackNames = new List <string>();

            foreach (Match m in matches)
            {
                trackNames.Add(entries.Substring(m.Index, entries.Substring(m.Index).IndexOf('\r')).Split('=')[1]);
            }

            return(new CdMetadata {
                Artist = artist, Album = album, Tracks = trackNames
            });
        }
Пример #23
0
 public static int GetDrive(string name)
 {
     for (int a = 0, b = BassCd.DriveCount; a < b; a++)
     {
         var cdInfo = default(CDInfo);
         BassUtils.OK(BassCd.GetInfo(a, out cdInfo));
         if (string.Equals(GetDriveName(cdInfo), name, StringComparison.OrdinalIgnoreCase))
         {
             return(a);
         }
     }
     return(NO_DRIVE);
 }
Пример #24
0
        public string GetCDDBDiscIDInfo(char driveLetter, char separator)
        {
            string retval = null;
            int    drive  = BassUtils.Drive2BassID(driveLetter);

            if (drive > -1)
            {
                string id = BassCd.BASS_CD_GetID(drive, BASSCDId.BASS_CDID_CDDB);
                retval = id.Replace(' ', separator);
                BassCd.BASS_CD_Release(drive);
            }
            return(retval);
        }
 public static int GetDrive(SelectionConfigurationOption option)
 {
     for (int a = 0, b = BassCd.DriveCount; a < b; a++)
     {
         var cdInfo = default(CDInfo);
         BassUtils.OK(BassCd.GetInfo(a, out cdInfo));
         if (string.Equals(cdInfo.Name, option.Id, StringComparison.OrdinalIgnoreCase))
         {
             return(a);
         }
     }
     return(CD_NO_DRIVE);
 }
Пример #26
0
        public GridViewRip(Main main)
        {
            _main = main;

            // Setup message queue for receiving Messages
            IMessageQueue queueMessage = ServiceScope.Get <IMessageBroker>().GetOrCreate("message");

            queueMessage.OnMessageReceive += OnMessageReceive;

            InitializeComponent();

            dataGridViewRip.CurrentCellDirtyStateChanged += dataGridViewRip_CurrentCellDirtyStateChanged;

            // Listen to Messages
            IMessageQueue queueMessageEncoding = ServiceScope.Get <IMessageBroker>().GetOrCreate("encoding");

            queueMessageEncoding.OnMessageReceive += OnMessageReceiveEncoding;

            audioEncoder       = ServiceScope.Get <IAudioEncoder>();
            mediaChangeMonitor = ServiceScope.Get <IMediaChangeMonitor>();
            mediaChangeMonitor.MediaInserted += mediaChangeMonitor_MediaInserted;
            mediaChangeMonitor.MediaRemoved  += mediaChangeMonitor_MediaRemoved;

            // Get number of CD Drives found and initialise a Bindinglist for every drove
            int driveCount = BassCd.BASS_CD_GetDriveCount();

            if (driveCount == 0)
            {
                bindingList.Add(new SortableBindingList <CDTrackDetail>()); // In case of no CD, we want a Dummy List
            }
            _main.RipButtonsEnabled = false;

            for (int i = 0; i < driveCount; i++)
            {
                bindingList.Add(new SortableBindingList <CDTrackDetail>());
                if (BassCd.BASS_CD_IsReady(i))
                {
                    _main.RipButtonsEnabled = true;
                }
            }

            // Prepare the Gridview
            gridColumns = new GridViewColumnsRip();
            dataGridViewRip.AutoGenerateColumns = false;
            dataGridViewRip.DataSource          = bindingList[0];

            // Now Setup the columns, we want to display
            CreateColumns();

            SetStatusLabel("");
        }
Пример #27
0
        public string GetCDDBDiscID(char driveLetter)
        {
            string retval = null;
            int    drive  = BassUtils.Drive2BassID(driveLetter);

            if (drive > -1)
            {
                string id = BassCd.BASS_CD_GetID(drive, BASSCDId.BASS_CDID_CDDB);
                retval = id.Substring(0, 8);
                BassCd.BASS_CD_Release(drive);
            }

            return(retval);
        }
 public override bool InitializeComponent()
 {
     Logger.Write(this, LogLevel.Debug, "Querying CD-TEXT for drive: {0}", this.Drive);
     lock (SyncRoot)
     {
         this.Parser = new CdTextParser(BassCd.GetIDText(this.Drive));
     }
     if (this.Parser.Count == 0)
     {
         Logger.Write(this, LogLevel.Debug, "CD-TEXT did not return any information for drive: {0}", this.Drive);
         return(false);
     }
     return(base.InitializeComponent());
 }
Пример #29
0
        public void WriteCdaFileToWavFile(string inCdaFile, string outWavFile, BaseEncoder.ENCODEFILEPROC progressCallback)
        {
            var measuringStream = BassCd.BASS_CD_StreamCreateFile(inCdaFile, BASSFlag.BASS_DEFAULT);

            if (measuringStream == 0)
            {
                return;
            }

            var totalLength = Bass.BASS_ChannelGetLength(measuringStream, BASSMode.BASS_POS_BYTES);

            Bass.BASS_StreamFree(measuringStream);

            var stream = BassCd.BASS_CD_StreamCreateFile(inCdaFile, BASSFlag.BASS_STREAM_DECODE);

            if (stream == 0)
            {
                return;
            }

            try
            {
                var ww   = new WaveWriter(outWavFile, stream, true);
                var data = new short[32768];

                var bytesSoFar = 0;

                while (Bass.BASS_ChannelIsActive(stream) == BASSActive.BASS_ACTIVE_PLAYING)
                {
                    var length = Bass.BASS_ChannelGetData(stream, data, 32768);

                    if (length > 0)
                    {
                        ww.Write(data, length);

                        bytesSoFar += length;

                        progressCallback.Invoke(totalLength, bytesSoFar);
                    }
                }

                // finilize the wave file!
                ww.Close();
                Bass.BASS_StreamFree(stream);
            }
            catch (Exception ex)
            {
                throw new Exception(string.Format("Error copying cda file '{0}' to wav file '{1}'", inCdaFile, outWavFile), ex);
            }
        }
Пример #30
0
        private static void GetCDDrives()
        {
            // Get the number of CD/DVD drives
            int           driveCount         = BassCd.BASS_CD_GetDriveCount();
            StringBuilder builderDriveLetter = new StringBuilder();

            // Get Drive letters assigned
            for (int i = 0; i < driveCount; i++)
            {
                builderDriveLetter.Append(BassCd.BASS_CD_GetInfo(i).DriveLetter);
                BassCd.BASS_CD_Release(i);
            }
            _cdDriveLetters = builderDriveLetter.ToString();
        }