public static void Free() { if (!IsInitialized) { return; } if (Info != null) { var flags = AsioChannelResetFlags.Enable | AsioChannelResetFlags.Join | AsioChannelResetFlags.Format | AsioChannelResetFlags.Rate; Logger.Write(typeof(BassAsioDevice), LogLevel.Debug, "Resetting BASS ASIO channel attributes."); for (var channel = 0; channel < Info.Outputs; channel++) { BassAsio.ChannelReset(false, channel, flags); } } Logger.Write(typeof(BassAsioDevice), LogLevel.Debug, "Releasing BASS ASIO."); BassAsio.Free(); BassAsioHandler.Free(); IsInitialized = false; }
public static void Detect(int device) { if (IsInitialized) { throw new InvalidOperationException("Device is already initialized."); } IsInitialized = true; Logger.Write(typeof(BassAsioDevice), LogLevel.Debug, "Detecting ASIO device."); try { BassAsioUtils.OK(BassAsio.Init(device, AsioInitFlags.Thread)); BassAsioUtils.OK(BassAsioHandler.Init()); var info = default(AsioChannelInfo); BassAsioUtils.OK(BassAsio.ChannelGetInfo(false, PRIMARY_CHANNEL, out info)); Info = new BassAsioDeviceInfo( BassAsio.CurrentDevice, Convert.ToInt32(BassAsio.Rate), BassAsio.Info.Inputs, BassAsio.Info.Outputs, GetSupportedRates(), info.Format ); Logger.Write(typeof(BassAsioDevice), LogLevel.Debug, "Detected ASIO device: {0} => Inputs => {1}, Outputs = {2}, Rate = {3}, Format = {4}", BassAsio.CurrentDevice, Info.Inputs, Info.Outputs, Info.Rate, Enum.GetName(typeof(AsioSampleFormat), Info.Format)); Logger.Write(typeof(BassAsioDevice), LogLevel.Debug, "Detected ASIO device: {0} => Rates => {1}", BassAsio.CurrentDevice, string.Join(", ", Info.SupportedRates)); } finally { Free(); } }
public static void Init(int device) { if (device == BassAsioStreamOutputConfiguration.ASIO_NO_DEVICE) { throw new InvalidOperationException("A valid device must be provided."); } LogManager.Logger.Write(typeof(BassAsioDevice), LogLevel.Debug, "Initializing BASS ASIO."); BassAsioUtils.OK(BassAsio.Init(device, AsioInitFlags.Thread)); BassAsioUtils.OK(BassAsioHandler.Init()); IsInitialized = true; var info = default(AsioChannelInfo); BassAsioUtils.OK(BassAsio.ChannelGetInfo(false, PRIMARY_CHANNEL, out info)); Device = device; Devices[device] = new BassAsioDeviceInfo( info.Name, Convert.ToInt32(BassAsio.Rate), BassAsio.Info.Inputs, BassAsio.Info.Outputs, GetSupportedRates(), info.Format ); LogManager.Logger.Write(typeof(BassAsioDevice), LogLevel.Debug, "Detected ASIO device: {0} => Name => {1}, Inputs => {2}, Outputs = {3}, Rate = {4}, Format = {5}", Device, Info.Name, Info.Inputs, Info.Outputs, Info.Rate, Enum.GetName(typeof(AsioSampleFormat), Info.Format)); LogManager.Logger.Write(typeof(BassAsioDevice), LogLevel.Debug, "Detected ASIO device: {0} => Rates => {1}", Device, string.Join(", ", Info.SupportedRates)); }
public static void Free() { if (!IsInitialized) { return; } LogManager.Logger.Write(typeof(BassAsioDevice), LogLevel.Debug, "Releasing BASS ASIO."); BassAsio.Free(); BassAsioHandler.Free(); IsInitialized = false; }
protected virtual bool ConfigureASIO(IBassStreamComponent previous) { Logger.Write(this, LogLevel.Debug, "Configuring ASIO."); BassAsioUtils.OK(BassAsioHandler.StreamSet(previous.ChannelHandle)); BassAsioUtils.OK(BassAsioHandler.ChannelEnable(false, BassAsioDevice.PRIMARY_CHANNEL)); if (previous.Channels == 1) { Logger.Write(this, LogLevel.Debug, "Mirroring channel: {0} => {1}", BassAsioDevice.PRIMARY_CHANNEL, BassAsioDevice.SECONDARY_CHANNEL); BassAsioUtils.OK(BassAsio.ChannelEnableMirror(BassAsioDevice.SECONDARY_CHANNEL, false, BassAsioDevice.PRIMARY_CHANNEL)); } else { for (var channel = 1; channel < previous.Channels; channel++) { Logger.Write(this, LogLevel.Debug, "Joining channel: {0} => {1}", channel, BassAsioDevice.PRIMARY_CHANNEL); BassAsioUtils.OK(BassAsio.ChannelJoin(false, channel, BassAsioDevice.PRIMARY_CHANNEL)); } } return(true); }
public static void Init(int device, int rate, int channels, BassFlags flags) { if (IsInitialized) { throw new InvalidOperationException("Device is already initialized."); } IsInitialized = true; Logger.Write(typeof(BassAsioDevice), LogLevel.Debug, "Initializing BASS ASIO."); try { BassAsioUtils.OK(BassAsio.Init(device, AsioInitFlags.Thread)); BassAsioUtils.OK(BassAsioHandler.Init()); BassAsioUtils.OK(BassAsioHandler.ChannelEnable(false, PRIMARY_CHANNEL)); for (var channel = 1; channel < channels; channel++) { Logger.Write(typeof(BassAsioDevice), LogLevel.Debug, "Joining channel: {0} => {1}", channel, PRIMARY_CHANNEL); BassAsioUtils.OK(BassAsio.ChannelJoin(false, channel, PRIMARY_CHANNEL)); } if (flags.HasFlag(BassFlags.DSDRaw)) { InitDSD(device, rate, channels, flags); } else { InitPCM(device, rate, channels, flags); } BassAsio.Rate = rate; Logger.Write(typeof(BassAsioDevice), LogLevel.Debug, "Initialized BASS ASIO."); } catch { Free(); throw; } }
public override void Connect(IBassStreamComponent previous) { this.ConfigureASIO(previous); if (this.ShouldCreateMixer(previous)) { Logger.Write(this, LogLevel.Debug, "Creating BASS MIX stream with rate {0} and {1} channels.", this.Rate, this.Channels); this.ChannelHandle = BassMix.CreateMixerStream(this.Rate, this.Channels, this.Flags); if (this.ChannelHandle == 0) { BassUtils.Throw(); } Logger.Write(this, LogLevel.Debug, "Adding stream to the mixer: {0}", previous.ChannelHandle); BassUtils.OK(BassMix.MixerAddChannel(this.ChannelHandle, previous.ChannelHandle, BassFlags.Default | BassFlags.MixerBuffer)); BassUtils.OK(BassAsioHandler.StreamSet(this.ChannelHandle)); this.MixerChannelHandles.Add(previous.ChannelHandle); } else { Logger.Write(this, LogLevel.Debug, "The stream properties match the device, playing directly."); BassUtils.OK(BassAsioHandler.StreamSet(previous.ChannelHandle)); } this.UpdateVolume(); }