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); } }
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)); }
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)); }