コード例 #1
0
 public PendingQueue(int encodedBuffersCount, iAudioDecoder decoder, iPlayerQueues queues)
 {
     this.decoder         = decoder;
     this.queues          = queues;
     encodedFrames        = new Queue <AudioFrame>(encodedBuffersCount);
     copiesCompressedData = decoder.copiesCompressedData;
 }
コード例 #2
0
ファイル: Setup.cs プロジェクト: zeta1999/Vrmac
        public static void setupHardware(IntPtr pcm, iAudioDecoder decoder, int decodedBuffers)
        {
            Span <byte> hw_params = stackalloc byte[libasound.pcm_hw_params_sizeof()];

            libasound.snd_pcm_hw_params_any(pcm, hw_params);

            libasound.snd_pcm_hw_params_set_access(pcm, hw_params, ePcmAccessType.MemoryMapInterleaved);
            libasound.snd_pcm_hw_params_set_format(pcm, hw_params, ePcmFormat.S16);
            // See ConfigureDecoder.configureAacDecoder method
            libasound.snd_pcm_hw_params_set_channels(pcm, hw_params, 2);

            int sampleRate = decoder.sampleRate;

            if (libasound.snd_pcm_hw_params_test_rate(pcm, hw_params, sampleRate, eDirection.Exact))
            {
                libasound.snd_pcm_hw_params_set_rate(pcm, hw_params, sampleRate, eDirection.Exact);
                Logger.logVerbose("The audio hardware supports {0}Hz sample rate of the audio track", sampleRate);
            }
            else
            {
                // Enable software resampling
                libasound.snd_pcm_hw_params_set_rate_resample(pcm, hw_params, true);
                libasound.snd_pcm_hw_params_set_rate(pcm, hw_params, sampleRate, eDirection.Exact);
                Logger.logVerbose("The audio driver will resample {0}Hz sample rate of the audio track", sampleRate);
            }

            libasound.snd_pcm_hw_params_set_period_size(pcm, hw_params, decoder.blockSize, eDirection.Exact);
            libasound.snd_pcm_hw_params_set_buffer_size(pcm, hw_params, decoder.blockSize * decodedBuffers);

            libasound.snd_pcm_hw_params(pcm, hw_params);
        }
コード例 #3
0
ファイル: Setup.cs プロジェクト: zeta1999/Vrmac
        public static void setupSoftware(IntPtr pcm, iAudioDecoder decoder, int decodedBuffers)
        {
            Span <byte> sw_params = stackalloc byte[libasound.pcm_sw_params_sizeof()];

            libasound.snd_pcm_sw_params_current(pcm, sw_params);

            libasound.snd_pcm_sw_params_set_avail_min(pcm, sw_params, decoder.blockSize);

            // libasound.snd_pcm_sw_params_set_start_threshold( pcm, sw_params, trackInfo.samplesPerFrame * ( decodedBuffers - 1 ) );
            libasound.snd_pcm_sw_params_set_start_threshold(pcm, sw_params, 0);
            // libasound.snd_pcm_sw_params_set_period_event( pcm, sw_params, true );
            libasound.snd_pcm_sw_params(pcm, sw_params);
        }
コード例 #4
0
ファイル: AlsaPlayer.cs プロジェクト: zeta1999/Vrmac
        public AlsaPlayer(iAudioDecoder decoder)
        {
            try
            {
                handle = new PcmHandle(Setup.openDefaultOutput());
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Unable to open the default audio device", ex);
            }

            int computedCount  = (int)Math.Ceiling(0.001 * msDecodedBufferLength * decoder.sampleRate / decoder.blockSize);
            int decodedBuffers = Math.Max(computedCount, minDecodedBuffers);

            // Logger.logVerbose( "Got the wave output device" );
            try
            {
                Setup.setupHardware(handle, decoder, decodedBuffers);
                Setup.setupSoftware(handle, decoder, decodedBuffers);
                // Logger.logVerbose( "Set up the wave output device" );
                handle.prepare();
            }
            catch (Exception ex)
            {
                // Logger.logError( "Unable to setup audio playback\n" + ex.ToString() );
                throw new ApplicationException("Unable to setup audio playback", ex);
            }

            // handle.dbgDumpPcm();
            // handle.dbgDumpSetup();
            // handle.dbgDumpStatus();

            pollHandlesCount = handle.pollDescriptorsCount;
            samplesPerFrame  = decoder.blockSize;
            queue            = new Queue(decodedBuffers);
            state            = eState.Prepared;
            Logger.logVerbose("Initialized ALSA player with {0} decoded buffers; state = {1}; poll handles count {2}", decodedBuffers, handle.state, pollHandlesCount);

            // handle.dbgLogAvailableSamples();
        }
コード例 #5
0
 public static extern void createDcaDecoder([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Marshaler <iAudioDecoder>))] out iAudioDecoder decoder, byte channels, int sampleRate);