public PendingQueue(int encodedBuffersCount, iAudioDecoder decoder, iPlayerQueues queues) { this.decoder = decoder; this.queues = queues; encodedFrames = new Queue <AudioFrame>(encodedBuffersCount); copiesCompressedData = decoder.copiesCompressedData; }
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); }
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); }
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(); }
public static extern void createDcaDecoder([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Marshaler <iAudioDecoder>))] out iAudioDecoder decoder, byte channels, int sampleRate);