示例#1
0
        public BASSOutput(OutputDevice.StreamProc proc, uint freq, uint chans, string preferredDeviceName, int buflen)
        {
            var outdev = GetInitializedBassRealOutputDevice();

            if (outdev == 0)
            {
                int deviceid = -1;
                var devices  = BASS.GetDevices();
                for (int i = 0; i < devices.Length; i++)
                {
                    var device = devices[i];
                    if (device.Name == preferredDeviceName)
                    {
                        deviceid = i;
                        Logger.Debug("Found preferred output device:" + device.ToString());
                        break;
                    }
                }
                BASS.BASS_Init(deviceid, freq, 1500);
                outdev = GetInitializedBassRealOutputDevice();
            }
            BASS.BASS_SetDevice(outdev);
            StreamProc = proc;
            Bassout    = new BASS.UserSampleStream(freq, chans, (x, y) => StreamProc(x, y), (BASS.Stream.StreamFlag.BASS_STREAM_FLOAT) | BASS.Stream.StreamFlag.BASS_STREAM_AUTOFREE);
            Logger.Debug("Use Float Output");
        }
示例#2
0
        public static IOutputDevice CreateOutputDevice(OutputDevice.StreamProc streamProc, uint freq, uint chans, bool useFloat, int bufferLen, string preferredDeviceName = null)
        {
            lock (outputChannelLock)
            {
                Logger.Debug("Rebuild output");
                if (Lutea.Core.AppCore.EnableWASAPIExclusive)
                {
                    try
                    {
                        var ret = new BASSWASAPIOutputChannel(streamProc, true, freq, chans, preferredDeviceName, (uint)bufferLen);
                        BASS.SetPriority(System.Diagnostics.ThreadPriorityLevel.TimeCritical);
                        BASSWASAPIOutput.SetPriority(System.Diagnostics.ThreadPriorityLevel.TimeCritical);
                        return(ret);
                    }
                    catch (BASSWASAPIOutput.BASSWASAPIException) { }
                }

                try
                {
                    var ret = new BASSWASAPIOutputChannel(streamProc, false, freq, chans, preferredDeviceName, (uint)bufferLen);
                    BASS.SetPriority(System.Diagnostics.ThreadPriorityLevel.TimeCritical);
                    BASSWASAPIOutput.SetPriority(System.Diagnostics.ThreadPriorityLevel.TimeCritical);
                    return(ret);
                }
                catch (BASSWASAPIOutput.BASSWASAPIException) { }

                try
                {
                    var ret = new BASSOutput(streamProc, freq, chans, preferredDeviceName, bufferLen);
                    BASS.SetPriority(System.Diagnostics.ThreadPriorityLevel.TimeCritical);
                    return(ret);
                }
                catch (BASS.BASSException) { }

                throw new NotSupportedException();
            }
        }
示例#3
0
        public BASSWASAPIOutputChannel(OutputDevice.StreamProc proc, bool exclusive, uint freq, uint chans, string preferredDeviceName, uint bufLen)
        {
            this.Exclusive = exclusive;
            BASS.BASS_SetDevice(0);

            int deviceid = -1;
            var devices  = BASSWASAPIOutput.GetDevices();

            for (int i = 0; i < devices.Length; i++)
            {
                var device = devices[i];
                if ((device.Name == preferredDeviceName) &&
                    ((device.Flag & BASSWASAPIOutput.BASS_WASAPI_DEVICEINFO.Flags.BASS_DEVICE_INPUT) == 0) &&
                    (device.Mixchans >= chans))
                {
                    deviceid = i;
                    Logger.Debug("Found preferred output device:" + device.ToString());
                    break;
                }
            }
            StreamProc       = proc;
            BassWasapiOutput = new BASSWASAPIOutput(freq, chans, (x, y) => StreamProc(x, y), BASSWASAPIOutput.InitFlags.Buffer | (exclusive ? BASSWASAPIOutput.InitFlags.Exclusive : 0), deviceid, bufLen);
            Logger.Log("Use WASAPI Exclusive Output: freq=" + BassWasapiOutput.Info.Freq + ", format=" + BassWasapiOutput.Info.Format);
        }