Path: blob/master/drivers/pulseaudio/audio_driver_pulseaudio.h
9973 views
/**************************************************************************/1/* audio_driver_pulseaudio.h */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#pragma once3132#ifdef PULSEAUDIO_ENABLED3334#include "core/os/mutex.h"35#include "core/os/thread.h"36#include "core/templates/safe_refcount.h"37#include "servers/audio_server.h"3839#ifdef SOWRAP_ENABLED40#include "pulse-so_wrap.h"41#else42#include <pulse/pulseaudio.h>43#endif4445class AudioDriverPulseAudio : public AudioDriver {46Thread thread;47Mutex mutex;4849pa_mainloop *pa_ml = nullptr;50pa_context *pa_ctx = nullptr;51pa_stream *pa_str = nullptr;52pa_stream *pa_rec_str = nullptr;53pa_channel_map pa_map = {};54pa_channel_map pa_rec_map = {};5556String output_device_name = "Default";57String new_output_device = "Default";58String default_output_device;5960String input_device_name;61String new_input_device;62String default_input_device;6364Vector<int32_t> samples_in;65Vector<int16_t> samples_out;6667unsigned int mix_rate = 0;68unsigned int buffer_frames = 0;69unsigned int pa_buffer_size = 0;70int channels = 0;71int pa_ready = 0;72int pa_status = 0;73PackedStringArray pa_devices;74PackedStringArray pa_rec_devices;7576SafeFlag active;77SafeFlag exit_thread;7879float latency = 0;8081static void pa_state_cb(pa_context *c, void *userdata);82static void pa_sink_info_cb(pa_context *c, const pa_sink_info *l, int eol, void *userdata);83static void pa_source_info_cb(pa_context *c, const pa_source_info *l, int eol, void *userdata);84static void pa_server_info_cb(pa_context *c, const pa_server_info *i, void *userdata);85static void pa_sinklist_cb(pa_context *c, const pa_sink_info *l, int eol, void *userdata);86static void pa_sourcelist_cb(pa_context *c, const pa_source_info *l, int eol, void *userdata);8788Error init_output_device();89void finish_output_device();9091Error init_input_device();92void finish_input_device();9394Error detect_channels(bool capture = false);9596static void thread_func(void *p_udata);9798public:99virtual const char *get_name() const override {100return "PulseAudio";101}102103virtual Error init() override;104virtual void start() override;105virtual int get_mix_rate() const override;106virtual SpeakerMode get_speaker_mode() const override;107virtual float get_latency() override;108109virtual void lock() override;110virtual void unlock() override;111virtual void finish() override;112113virtual PackedStringArray get_output_device_list() override;114virtual String get_output_device() override;115virtual void set_output_device(const String &p_name) override;116117virtual Error input_start() override;118virtual Error input_stop() override;119120virtual PackedStringArray get_input_device_list() override;121virtual String get_input_device() override;122virtual void set_input_device(const String &p_name) override;123124AudioDriverPulseAudio();125~AudioDriverPulseAudio() {}126};127128#endif // PULSEAUDIO_ENABLED129130131