protected virtual bool ConfigureASIO_PCM(IBassStreamComponent previous)
        {
            Logger.Write(this, LogLevel.Debug, "Configuring PCM.");
            BassAsioUtils.OK(BassAsio.SetDSD(false));
            if (!this.CheckFormat(this.Rate, this.Channels))
            {
                Logger.Write(this, LogLevel.Warn, "PCM format {0}:{1} is unsupported.", this.Rate, this.Channels);
                return(false);
            }
            else
            {
                BassAsio.Rate = this.Rate;
            }
            var format = default(AsioSampleFormat);

            if (previous.Flags.HasFlag(BassFlags.Float))
            {
                format = AsioSampleFormat.Float;
            }
            else
            {
                format = AsioSampleFormat.Bit16;
            }
            Logger.Write(this, LogLevel.Debug, "PCM: Rate = {0}, Format = {1}", BassAsio.Rate, Enum.GetName(typeof(AsioSampleFormat), format));
            BassAsioUtils.OK(BassAsio.ChannelSetRate(false, BassAsioDevice.PRIMARY_CHANNEL, previous.Rate));
            BassAsioUtils.OK(BassAsio.ChannelSetFormat(false, BassAsioDevice.PRIMARY_CHANNEL, format));
            return(true);
        }
 protected virtual bool ConfigureASIO_DSD(IBassStreamComponent previous)
 {
     try
     {
         Logger.Write(this, LogLevel.Debug, "Configuring DSD RAW.");
         try
         {
             BassAsioUtils.OK(BassAsio.SetDSD(true));
         }
         catch
         {
             //If we get here some drivers (at least Creative) will crash when BassAsio.Start is called.
             //I can't find a way to prevent it but it seems to be related to the allocated buffer size
             //not being what the driver *thinks* it is and over-flowing.
             //
             //It should be unlikely in real life as the device would have to report capability of some
             //very high PCM frequencies.
             Logger.Write(this, LogLevel.Error, "Failed to enable DSD RAW on the device. Creative ASIO driver becomes unstable and usually crashes soon...");
             return(false);
         }
         if (!this.CheckFormat(this.Rate, previous.Channels))
         {
             Logger.Write(this, LogLevel.Warn, "DSD format {0}:{1} is unsupported.", previous.Rate, previous.Channels);
             return(false);
         }
         else
         {
             BassAsio.Rate = this.Rate;
         }
         //It looks like BASS DSD always outputs 8 bit/MSB data so we don't need to determine the format.
         //var format = default(AsioSampleFormat);
         //switch (this.Depth)
         //{
         //    case BassAttribute.DSDFormat_LSB:
         //        format = AsioSampleFormat.DSD_LSB;
         //        break;
         //    case BassAttribute.DSDFormat_None:
         //    case BassAttribute.DSDFormat_MSB:
         //        format = AsioSampleFormat.DSD_MSB;
         //        break;
         //    default:
         //        throw new NotImplementedException();
         //}
         Logger.Write(this, LogLevel.Debug, "DSD: Rate = {0}, Format = {1}", BassAsio.Rate, Enum.GetName(typeof(AsioSampleFormat), AsioSampleFormat.DSD_MSB));
         BassAsioUtils.OK(BassAsio.ChannelSetFormat(false, BassAsioDevice.PRIMARY_CHANNEL, AsioSampleFormat.DSD_MSB));
         return(true);
     }
     catch (Exception e)
     {
         Logger.Write(this, LogLevel.Warn, "Failed to configure DSD RAW: {0}", e.Message);
         return(false);
     }
 }
示例#3
0
        private static void InitPCM(int device, int rate, int channels, BassFlags flags)
        {
            BassAsioUtils.OK(BassAsio.SetDSD(false));
            BassAsioUtils.OK(BassAsio.ChannelSetRate(false, BassAsioDevice.PRIMARY_CHANNEL, rate));
            var format = default(AsioSampleFormat);

            if (flags.HasFlag(BassFlags.Float))
            {
                format = AsioSampleFormat.Float;
            }
            else
            {
                format = AsioSampleFormat.Bit16;
            }
            BassAsioUtils.OK(BassAsio.ChannelSetFormat(false, BassAsioDevice.PRIMARY_CHANNEL, format));
        }
示例#4
0
 private static void InitDSD(int device, int rate, int channels, BassFlags flags)
 {
     BassAsioUtils.OK(BassAsio.SetDSD(true));
     //It looks like BASS DSD always outputs 8 bit/MSB data so we don't need to determine the format.
     //var format = default(AsioSampleFormat);
     //switch (this.Depth)
     //{
     //    case BassAttribute.DSDFormat_LSB:
     //        format = AsioSampleFormat.DSD_LSB;
     //        break;
     //    case BassAttribute.DSDFormat_None:
     //    case BassAttribute.DSDFormat_MSB:
     //        format = AsioSampleFormat.DSD_MSB;
     //        break;
     //    default:
     //        throw new NotImplementedException();
     //}
     BassAsioUtils.OK(BassAsio.ChannelSetFormat(false, BassAsioDevice.PRIMARY_CHANNEL, AsioSampleFormat.DSD_MSB));
 }