/**************************************************************************/1/* audio_driver_alsa.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 ALSA_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 "asound-so_wrap.h"41#else42#include <alsa/asoundlib.h>43#endif4445class AudioDriverALSA : public AudioDriver {46Thread thread;47Mutex mutex;4849snd_pcm_t *pcm_handle = nullptr;5051String output_device_name = "Default";52String new_output_device = "Default";5354Vector<int32_t> samples_in;55Vector<int16_t> samples_out;5657Error init_output_device();58void finish_output_device();5960static void thread_func(void *p_udata);6162unsigned int mix_rate = 0;63SpeakerMode speaker_mode;6465snd_pcm_uframes_t buffer_frames;66snd_pcm_uframes_t buffer_size;67snd_pcm_uframes_t period_size;68int channels = 0;6970SafeFlag active;71SafeFlag exit_thread;7273public:74virtual const char *get_name() const override {75return "ALSA";76}7778virtual Error init() override;79virtual void start() override;80virtual int get_mix_rate() const override;81virtual SpeakerMode get_speaker_mode() const override;8283virtual void lock() override;84virtual void unlock() override;85virtual void finish() override;8687virtual PackedStringArray get_output_device_list() override;88virtual String get_output_device() override;89virtual void set_output_device(const String &p_name) override;9091AudioDriverALSA() {}92~AudioDriverALSA() {}93};9495#endif // ALSA_ENABLED969798