From 9c40abea0adfee5c8adacad1ca6eb49ddf355fd4 Mon Sep 17 00:00:00 2001 From: NMagic Date: Thu, 12 Oct 2023 00:47:18 -0300 Subject: [PATCH 01/20] Add files via upload --- v-0.02/Makefile | 20 + .../pa_context -- interface overview.docx | Bin 0 -> 33970 bytes .../pavucontrol sink update flow.txt | 41 ++ .../pulseaudio/introspect.c summary | 79 +++ .../pulseaudio/mainloop code flow.txt | 17 + v-0.02/easypulse_core.c | 594 ++++++++++++++++++ v-0.02/easypulse_core.h | 77 +++ v-0.02/examples/Makefile | 19 + v-0.02/examples/switch-sink-pulseaudio.c | 62 ++ v-0.02/examples/switch-sink.c | 72 +++ v-0.02/examples/volume-change | Bin 0 -> 47760 bytes v-0.02/examples/volume-change-pulseaudio | Bin 0 -> 49944 bytes v-0.02/examples/volume-change-pulseaudio.c | 101 +++ v-0.02/examples/volume-change.c | 79 +++ 14 files changed, 1161 insertions(+) create mode 100644 v-0.02/Makefile create mode 100644 v-0.02/documentation/pa_context -- interface overview.docx create mode 100644 v-0.02/documentation/pavucontrol/pavucontrol sink update flow.txt create mode 100644 v-0.02/documentation/pulseaudio/introspect.c summary create mode 100644 v-0.02/documentation/pulseaudio/mainloop code flow.txt create mode 100644 v-0.02/easypulse_core.c create mode 100644 v-0.02/easypulse_core.h create mode 100644 v-0.02/examples/Makefile create mode 100644 v-0.02/examples/switch-sink-pulseaudio.c create mode 100644 v-0.02/examples/switch-sink.c create mode 100644 v-0.02/examples/volume-change create mode 100644 v-0.02/examples/volume-change-pulseaudio create mode 100644 v-0.02/examples/volume-change-pulseaudio.c create mode 100644 v-0.02/examples/volume-change.c diff --git a/v-0.02/Makefile b/v-0.02/Makefile new file mode 100644 index 0000000..b1c5107 --- /dev/null +++ b/v-0.02/Makefile @@ -0,0 +1,20 @@ +CC = gcc +CFLAGS = -Wall -g -Wextra + +LIB_NAME = easypulse_core +LIB_SRC = easypulse_core.c +LIB_OBJ = easypulse_core.o +LIB_OUT = lib$(LIB_NAME).a + +all: $(LIB_OUT) + +$(LIB_OUT): $(LIB_OBJ) + ar rcs $(LIB_OUT) $(LIB_OBJ) + +$(LIB_OBJ): $(LIB_SRC) + $(CC) $(CFLAGS) -c $(LIB_SRC) -o $(LIB_OBJ) + +clean: + rm -f $(LIB_OBJ) $(LIB_OUT) + +.PHONY: all clean diff --git a/v-0.02/documentation/pa_context -- interface overview.docx b/v-0.02/documentation/pa_context -- interface overview.docx new file mode 100644 index 0000000000000000000000000000000000000000..6cbe2d09c38dfcab843409c88d5b9d8666c90192 GIT binary patch literal 33970 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 literal 0 HcmV?d00001 diff --git a/v-0.02/documentation/pavucontrol/pavucontrol sink update flow.txt b/v-0.02/documentation/pavucontrol/pavucontrol sink update flow.txt new file mode 100644 index 0000000..9428de8 --- /dev/null +++ b/v-0.02/documentation/pavucontrol/pavucontrol sink update flow.txt @@ -0,0 +1,41 @@ ++----------------+ +| pavucontrol | +| (initial file)| ++----------------+ + | + | Callback function triggered when there's info/change related to a sink + V ++----------------+ +| sink_cb | +| (pavucontrol.cc)| ++----------------+ + | + | - If error, show error and return + | - If end-of-list (eol) is reached, decrease outstanding tasks count and return + | - Update GUI representation of a sink using w->updateSink() + V ++---------------------------+ +| MainWindow::updateSink | +| (mainwindow.cc & .h) | ++---------------------------+ + | + | - Retrieve or create SinkWidget for the sink + | - Update SinkWidget properties (e.g., volume, mute state, active port, etc.) + | - Prepare context menu for the sink + | - Ensure the sink is displayed correctly via updateDeviceVisibility + V ++-------------------------------------+ +| MainWindow::updateDeviceVisibility | +| (mainwindow.cc & .h) | ++-------------------------------------+ + | + | - If idle source/callback is already queued, return + | - Schedule the idle_cb function to be called when the app is idle + V ++----------------+ +| idle_cb | +| (mainwindow.cc)| ++----------------+ + | + V + ... (Specific steps and logic for updating device visibility) diff --git a/v-0.02/documentation/pulseaudio/introspect.c summary b/v-0.02/documentation/pulseaudio/introspect.c summary new file mode 100644 index 0000000..d9616f2 --- /dev/null +++ b/v-0.02/documentation/pulseaudio/introspect.c summary @@ -0,0 +1,79 @@ +* !pa_tagstruct_eof (context_string_callback): this function seems to be a callback function for processing string responses from the server. It examines the incoming command and checks for errors. If there's an error or if the command isn't a reply, it sets the success flag to 0 and prepares an empty response string. If the command is a reply, it extracts the response string from the tag structure. If there's any issue with extracting the string or if there's unexpected data in the tag structure, it flags a protocol error. + +* pa_context_stat: this function sends a simple command to request statistics. It leverages another function pa_context_send_simple_command and provides the context_stat_callback as the callback function to handle the response. It's used to retrieve statistical information. + +* pa_context_get_server_info: similar to the previous function, this function sends a command to get server information. It again uses pa_context_send_simple_command, but this time with a different callback, context_get_server_info_callback, to process the server information response. + +* context_get_sink_info_callback: this function is a callback that processes information about a sink. It first ensures that the operation and context are valid. If the received command is not a reply, it handles the error. If it is a reply, it starts parsing the sink information from the tag structure, extracting details like the sink's name, description, sample specification, channel map, owner module, volume, mute status, monitor source, latency, and more. The function seems to account for different versions of the context and extracts varying levels of information based on that. + +* pa_tagstruct_getu32: this function seems to be a snippet or part of another function and is possibly not a standalone function. It attempts to retrieve a 32-bit unsigned integer from a tag structure. If unsuccessful, it returns an error indicating a protocol issue. + +* pa_context_get_sink_info_list: this function sends a command to retrieve a list of sink information. It utilizes the pa_context_send_simple_command function and provides the context_get_sink_info_callback as the callback to process the list of sinks. + +* pa_context_get_sink_info_by_index: this function requests information about a specific sink identified by its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SINK_INFO) with the specified sink index and sends it to the server. The response from the server is expected to be handled by the context_get_sink_info_callback. + +* pa_context_get_sink_info_by_name: similar to the previous function, this one requests information about a sink, but it identifies the sink by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SINK_INFO) with the specified sink name to the server. The server's response will be processed by the context_get_sink_info_callback. + +* pa_context_set_sink_port_by_index: this function is designed to set the port for a specific sink identified by its index. After some validity checks, it builds a command (PA_COMMAND_SET_SINK_PORT) with the given sink index and port information, then sends this command to the server. The acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_sink_port_by_name: this function sets the port of a sink based on its name. It first performs some validation checks, then constructs a command with the sink's name and desired port. This command is sent to the PulseAudio server, and the response will be handled by a generic acknowledgment callback. + +* context_get_source_info_callback: this callback function processes information about a source. It starts by performing some initializations and checks. If the received command is a reply, it begins parsing the source information from the tag structure. This includes extracting details like the source's name, description, sample specification, volume, mute status, latency, and more. It appears to accommodate different versions of the context, extracting varying levels of information based on that. + +* pa_context_get_source_info_list: this function sends a command to retrieve a list of source information. It employs the pa_context_send_simple_command function, providing the context_get_source_info_callback as the callback to process the list of sources. + +* pa_context_get_source_info_by_index: this function retrieves information about a specific audio source based on its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source index and sends it to the server. The response from the server is expected to be handled by the context_get_source_info_callback. + +* pa_context_get_source_info_by_name: similar to the previous function, this one retrieves information about a source but identifies the source by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source name to the server. The server's response is again expected to be processed by the context_get_source_info_callback. + +* pa_context_set_source_port_by_index: this function sets the port of a specific source based on its index. After performing some validity checks and ensuring that the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source index. This command is sent to the server, and the acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_source_port_by_name: this function is designed to set the port of a specific audio source based on its name. It constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source name and sends this command to the PulseAudio server. The server's response will be handled by a generic acknowledgment callback. + +* context_get_client_info_callback: This callback function processes client-related information. It first performs checks to ensure the received command is a reply. If it is, the function begins parsing the client information, extracting details like client index, name, owner module, and driver. The function appears to be prepared to handle multiple client records in the same response and will loop through them until the end of the tag structure. + +* pa_context_get_client_info: this function requests information about a specific client based on its index. It constructs and sends a command (PA_COMMAND_GET_CLIENT_INFO) with the specified client index to the server. The server's response is expected to be processed by the context_get_client_info_callback. + +* pa_context_get_client_info_list: this function requests a list of client information from the PulseAudio server. It utilizes the pa_context_send_simple_command function and specifies the PA_COMMAND_GET_CLIENT_INFO_LIST command. The response from the server is expected to be handled by the context_get_client_info_callback. + + +* card_info_free: this is a utility function designed to free the memory associated with a pa_card_info structure. It releases memory for various properties and profiles associated with the card, such as its property list (proplist), profiles (profiles), and extended profile information (profiles2). + +* fill_card_port_info: this function populates the port information for a given card. It starts by extracting the number of ports (n_ports) for the card from a tag structure. If the card has ports, it then proceeds to fill in details about each port. If there's a protocol error while fetching the details, it returns an error. + +* fill_card_profile_info: this function is responsible for populating the profile information of a given card. It begins by allocating memory for the profiles and then proceeds to iterate through each profile, extracting details like name, description, number of sinks, number of sources, and priority. It also accounts for different versions of the context, fetching additional details if the version is >= 29. + + +* context_get_card_info_callback: this callback function processes card-related information. It starts by performing initialization checks and then examines the received command. If the command is a reply, the function starts parsing card details like index, name, owner module, driver, and the number of profiles. It then calls the fill_card_profile_info function to populate the profiles for the card. If there are any protocol errors during this process, the function handles them accordingly. + + +* pa_tagstruct_get_proplist: This function seems to be a snippet or a partial representation of a larger function. Its purpose appears to be to extract a property list (proplist) from a tag structure. If there's any issue during this extraction, it flags an error. + + +* pa_context_get_card_info_by_index: this function requests information about a specific card based on its index. After performing several validity checks, it constructs a command (PA_COMMAND_GET_CARD_INFO) with the specified card index and sends it to the server. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_by_name: similar to the previous function, this one requests information about a card, but it identifies the card by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_CARD_INFO) with the specified card name to the server. Again, the server's response is expected to be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_list: this function requests a list of all card information from the PulseAudio server. It employs the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_CARD_INFO_LIST command. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_set_card_profile_by_index: this function sets the profile of a specific card based on its index. After checking the validity of the context and ensuring the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the specified card index and desired profile. This command is sent to the server, and the response is handled by a generic acknowledgment callback. + +* pa_context_set_card_profile_by_name: this function sets the profile of a card identified by its name. Like the previous function, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the card name and desired profile, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_module_info_callback: this callback function processes module-related information. It checks if the received command is a reply and, if so, starts parsing the module details. This includes extracting details like the module's index, name, argument, and usage count. If there's an error or unexpected end of file in the tag structure, it flags a protocol error. + +* pa_context_get_module_info: this function retrieves information about a specific module based on its index. After conducting various validity checks, it constructs a command (PA_COMMAND_GET_MODULE_INFO) with the specified module index and sends it to the server. The response from the server will be processed by the context_get_module_info_callback. + +* pa_context_get_module_info_list: this function requests a list of all module information from the PulseAudio server. It uses the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_MODULE_INFO_LIST command. The server's response will be processed by the context_get_module_info_callback. + +* context_get_sink_input_info_callback: this callback function processes information related to sink inputs. It checks if the received command is a reply and, if so, starts parsing the sink input details. This includes extracting details like the sink input's index, name, owner module, client, sink, sample specification, channel map, volume, buffer usec, sink usec, resample method, driver, and more. It also accounts for different versions of the context, extracting varying levels of information based on that. + +* pa_context_set_source_output_volume: this function sets the volume of a specific source output based on its index. It starts by performing various checks, including verifying the validity of the provided volume. It then constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_VOLUME) with the specified source output index and volume and sends it to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_set_source_output_mute: this function mutes or unmutes a specific source output based on its index. It constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_MUTE) with the desired mute status and the source output index, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_sample_info_callback: this callback function processes sample-related information. It checks if the received command is a reply and, if so, begins parsing the sample details, extracting attributes like the sample's index, name, volume, mute status, proplist, and more. The function also handles possible protocol errors and is prepared to process multiple sample records in the same response. + +* pa_context_suspend_source_by_index: this function suspends or resumes a specific source based on its index. It verifies the server version, constructs a command (PA_COMMAND_SUSPEND_SOURCE) with the desired suspend status and source index, and then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_send_message_to_object: this function sends a message to a specific object within the PulseAudio server. After checking the server version and other conditions, it constructs a command (PA_COMMAND_SEND_OBJECT_MESSAGE) with the object's path, the message, and any additional parameters. The server's response will be processed by a callback function. diff --git a/v-0.02/documentation/pulseaudio/mainloop code flow.txt b/v-0.02/documentation/pulseaudio/mainloop code flow.txt new file mode 100644 index 0000000..f4c8b96 --- /dev/null +++ b/v-0.02/documentation/pulseaudio/mainloop code flow.txt @@ -0,0 +1,17 @@ ++---------------------------------------------+ +| Mainloop | +| | +| +--------------+ +-------------------+ | +| | I/O Events | | Timers | | +| +--------------+ +-------------------+ | +| | +| +--------------+ +-------------------+ | +| | Signals | | Deferred Callbacks| | +| +--------------+ +-------------------+ | +| | +| +---------------------+ | +| | Other Asynchronous | | +| | Tasks | | +| +---------------------+ | +| | ++---------------------------------------------+ diff --git a/v-0.02/easypulse_core.c b/v-0.02/easypulse_core.c new file mode 100644 index 0000000..d1de775 --- /dev/null +++ b/v-0.02/easypulse_core.c @@ -0,0 +1,594 @@ +/** + * @file easypulse_core.c + * @brief Implementation of the easypulse core functions. + * + * This file provides the core functionality to interact with PulseAudio, + * allowing operations like setting the default sink and adjusting volume. + */ + +#include "easypulse_core.h" +#include +#define INITIAL_ALLOCATION_SIZE 5 +#include +#include + +/** + * @brief Callback function for retrieving sink information. + * @param c The PulseAudio context. + * @param i The sink information. + * @param eol End of list flag. + * @param userdata User-provided data (expected to be a pointer to PulseAudioManager). + */ +static void sink_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + PulseAudioManager *manager = (PulseAudioManager *)userdata; + + // Check if we need to resize the sinks array + if (manager->sink_count % INITIAL_ALLOCATION_SIZE == 0) { // Resize every time we hit a multiple of INITIAL_ALLOCATION_SIZE + size_t newSize = (manager->sink_count + INITIAL_ALLOCATION_SIZE) * sizeof(PulseAudioSink); + PulseAudioSink *new_sinks = realloc(manager->sinks, newSize); + + if (!new_sinks) { + fprintf(stderr, "[ERROR]: Failed to resize the sinks array.\n"); + free(manager->sinks); // Free old memory + manager->sinks = NULL; + manager->sink_count = 0; // Reset sink_count to prevent out-of-bounds access + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + manager->sinks = new_sinks; + } + + if (eol < 0) { + if (pa_context_errno(c) != PA_ERR_NOENTITY) + fprintf(stderr, "Sink callback failure\\n"); + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + + if (eol > 0) { + manager->sinks_loaded = 1; + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + + // Store the sink's information + PulseAudioSink sink; + sink.index = i->index; + sink.name = strdup(i->name); + sink.description = strdup(i->description); + sink.volume = i->volume; + sink.channel_map = i->channel_map; + sink.mute = i->mute; + + // Add the sink to the manager's list + manager->sinks[manager->sink_count++] = sink; +} + + +/** + * @brief Callback function to check the state of the PulseAudio context. + * @param c The PulseAudio context. + * @param userdata User-provided data (expected to be a pointer to an int indicating readiness). + */ +static void context_state_cb(pa_context *c, void *userdata) { + pa_context_state_t state; + PulseAudioManager *manager = (PulseAudioManager *) userdata; + int *pa_ready = &(manager->pa_ready); + pa_threaded_mainloop *m = manager->mainloop; + + state = pa_context_get_state(c); + switch (state) { + // There are other states you can handle, but these are the important ones + case PA_CONTEXT_CONNECTING: + case PA_CONTEXT_AUTHORIZING: + case PA_CONTEXT_SETTING_NAME: + default: + break; + case PA_CONTEXT_READY: + *pa_ready = 1; + pa_threaded_mainloop_signal(m, 0); + break; + case PA_CONTEXT_FAILED: + case PA_CONTEXT_TERMINATED: + *pa_ready = 2; + pa_threaded_mainloop_signal(m, 0); + break; + } +} + +/** + * @brief Initializes the PulseAudioManager. + * + * @param self Pointer to the PulseAudioManager instance. + * @return Boolean indicating success or failure. + */ +bool initialize(PulseAudioManager *self) { + // 1. Create the threaded mainloop + self->mainloop = pa_threaded_mainloop_new(); + if (!self->mainloop) { + return false; + } + + // Get the mainloop API + pa_mainloop_api *mlapi = pa_threaded_mainloop_get_api(self->mainloop); + + // Create the context + self->context = pa_context_new(mlapi, "PulseAudio Manager"); + if (!self->context) { + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // Set the state callback + pa_context_set_state_callback(self->context, context_state_cb, self); + + // Lock the mainloop and connect the context + pa_threaded_mainloop_lock(self->mainloop); + + if (pa_context_connect(self->context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) { + pa_threaded_mainloop_unlock(self->mainloop); + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // 2. Start the threaded mainloop + pa_threaded_mainloop_start(self->mainloop); + + // 4. Wait for the context to be ready + while (self->pa_ready == 0) { + pa_threaded_mainloop_wait(self->mainloop); + } + + pa_threaded_mainloop_unlock(self->mainloop); + + if (self->pa_ready == 2) { + return false; + } + + return true; +} + + +/** + * @brief Cleans up the PulseAudioManager. + * + * @param self Pointer to the PulseAudioManager instance. + * @return Boolean indicating success or failure. + */ +bool cleanup(PulseAudioManager *self) { + // Lock the mainloop before making changes to the context + pa_threaded_mainloop_lock(self->mainloop); + + // Disconnect the context + pa_context_disconnect(self->context); + + // Unlock the mainloop before stopping it + pa_threaded_mainloop_unlock(self->mainloop); + + // Stop the threaded mainloop + pa_threaded_mainloop_stop(self->mainloop); + + // Unreference the context + pa_context_unref(self->context); + + // Free the threaded mainloop + pa_threaded_mainloop_free(self->mainloop); + + return true; +} + +/** + * @brief Load available sound cards (sinks). + * @param self The PulseAudioManager instance. + * @return true on success, false otherwise. + */ +bool loadSinks(PulseAudioManager *self) { + pa_operation *op; + op = pa_context_get_sink_info_list(self->context, sink_cb, self); + + if (!op) { + return false; + } + + self->iterate(self, op); + return true; +} + +/** + * @brief Callback function handling the completion of the "unmute" operation. + * + * @param c The PulseAudio context. + * @param success A flag indicating the success or failure of the operation. + * @param userdata User-provided data, expected to be a pointer to a PulseAudioManager instance. + */ +static void operation_complete_unmute_cb(pa_context *c, int success, void *userdata) { + (void)c; // Suppress unused parameter warning + + PulseAudioManager* manager = (PulseAudioManager*) userdata; + manager->operations_pending--; + + if (!success) { + fprintf(stderr, "Failed to unmute the sink input.\n"); + } + + // Signal the mainloop to resume any waiting threads. + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + +/** + * @brief Callback function handling the completion of the "move" operation. + * + * @param c The PulseAudio context. + * @param success A flag indicating the success or failure of the operation. + * @param userdata User-provided data, expected to be a pointer to a PulseAudioManager instance. + */ +static void operation_complete_move_cb(pa_context *c, int success, void *userdata) { + PulseAudioManager* manager = (PulseAudioManager*) userdata; + + if (success) { + pa_operation* unmute_op = pa_context_set_sink_input_mute(c, manager->current_sink_index, 0, operation_complete_unmute_cb, manager); + pa_operation_unref(unmute_op); + } else { + // Handle error... + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + +/** + * @brief Callback function handling the completion of the "mute" operation. + * + * @param c The PulseAudio context. + * @param success A flag indicating the success or failure of the operation. + * @param userdata User-provided data, expected to be a pointer to a PulseAudioManager instance. + */ +static void operation_complete_mute_cb(pa_context *c, int success, void *userdata) { + PulseAudioManager* manager = (PulseAudioManager*) userdata; + uint32_t target_sink_index = manager->current_sink_index; + + if (success) { + pa_operation* move_op = pa_context_move_sink_input_by_index(c, manager->current_sink_index, target_sink_index, operation_complete_move_cb, manager); + pa_operation_unref(move_op); + } else { + // Handle error... + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + +/** + * @brief Callback function to handle each sink input. + * @param c The PulseAudio context. + * @param i The sink input information. + * @param eol End of list flag. + * @param userdata User-provided data (expected to be a pointer to the target sink index). + */ +static void switch_sink_cb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata) { + PulseAudioManager* manager = (PulseAudioManager*) userdata; + + if (!eol && i) { + // Move this sink input to the desired sink + pa_operation* move_op = pa_context_move_sink_input_by_index(c, i->index, manager->sinks[manager->current_sink_index].index, NULL, NULL); + pa_operation_unref(move_op); + } + + if (eol) { + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + +/** + * @brief Switches the sink (audio source) for the PulseAudioManager. + * + * @param self Pointer to the PulseAudioManager instance. + * @param sink_index Index of the sink to switch to. + * @return Boolean indicating success or failure. + */ +bool switchSink(PulseAudioManager *self, uint32_t sink_index) { + // Ensure the context is valid + if (!self || !self->context) { + return false; + } + + // Check if sink_index is out of bounds + if (sink_index >= self->sink_count) { + fprintf(stderr, "[ERROR]: sink_index out of bounds.\n"); + return false; + } + + self->current_sink_index = sink_index; + + // Set the desired sink as the default sink + /*fprintf(stderr, "[DEBUG]: self->context = %p\n", self->context); + fprintf(stderr, "[DEBUG]: self->sinks = %p\n", self->sinks); + fprintf(stderr, "[DEBUG]: sink_index = %d\n", sink_index);*/ + + if (self->sinks) { + // Check if the name attribute is NULL + if (!self->sinks[sink_index].name) { + fprintf(stderr, "[ERROR]: Sink's name is NULL.\n"); + return false; + } + //fprintf(stderr, "[DEBUG]: self->sinks[sink_index].name = %s\n", self->sinks[sink_index].name); + } + pa_operation* set_default_op = pa_context_set_default_sink(self->context, self->sinks[sink_index].name, NULL, NULL); + pa_operation_unref(set_default_op); + + // Use the introspect API to get a list of all sink inputs + pa_operation *op = pa_context_get_sink_input_info_list(self->context, switch_sink_cb, self); + + if (!op) { + return false; + } + + while (pa_operation_get_state(op) == PA_OPERATION_RUNNING) { + self->iterate(self, op); + } + + pa_operation_unref(op); + + return true; +} +/** + * @brief Callback function to check the volume of the PulseAudio context. + * + * @param c Pointer to the PulseAudio context. + * @param i Information about the sink. + * @param eol End of list flag. + * @param userdata User-provided data. + */ +void volume_check_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + PulseAudioManager *self = (PulseAudioManager *)userdata; + + if (eol > 0) { + printf("[DEBUG, volume_check_cb()]: End-of-list reached.\n"); + self->operations_pending--; + return; + } + + if (!i) { + fprintf(stderr, "[ERROR, volume_check_cb()]: Null pointer for pa_sink_info.\n"); + self->operations_pending--; + return; + } + + if (!i->name) { + fprintf(stderr, "[ERROR, volume_check_cb()]: Null pointer for sink name.\n"); + self->operations_pending--; + return; + } + + printf("[DEBUG, volume_check_cb()]: Processing sink info for sink: %s\n", i->name); + + // Update the volume values in the manager's sinks structure + self->sinks[self->active_sink_index].volume = i->volume; + + // Print the volume for each channel + for (int channel = 0; channel < i->volume.channels; channel++) { + //float volume_percentage = (float)i->volume.values[channel] / PA_VOLUME_NORM * 100.0; + //printf("Channel %d Volume: %.2f%%\n", channel, volume_percentage); + } + + //Signaling to continue. + pa_threaded_mainloop_signal(self->mainloop, 0); +} + +// Completion callback for volume set operation +static void volume_set_complete_cb(pa_context *c, int success, void *userdata) { + (void)c; + PulseAudioManager* manager = (PulseAudioManager*) userdata; + + //printf("[DEBUG, volume_set_complete_cb()]: inside volume_set_complete_cb()\n"); + //printf("[DEBUG, volume_set_complete_cb()]: sink name is, %s\n", manager->active_sink_name); + + if (!success) { + fprintf(stderr, "[ERROR]: Failed to set volume. Reason: %s\n", pa_strerror(pa_context_errno(c))); + } + + // Debug: Print cvolume values for each channel as percentages + pa_cvolume cvolume = manager->sinks[manager->active_sink_index].volume; + + /*for (int i = 0; i < cvolume.channels; i++) { + float percentage = (cvolume.values[i] / (float)PA_VOLUME_NORM) * 100; + //printf("[DEBUG, volume_set_complete_cb()]: Channel %d cvolume value: %u (%.2f%%)\n", i, cvolume.values[i], percentage); + } + //printf("[DEBUG, volume_set_complete_cb invoked. Success: %d\n", success);*/ + + // Decrease the operations count and potentially signal the condition variable. + manager->operations_pending--; + + // Signal the main loop to continue + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + + +/** + * @brief Set the volume for a specified sink. + * + * This function allows setting the volume for a specific sink based on the given percentage. + * The function performs various checks to ensure valid inputs and that the PulseAudio system is ready. + * It will adjust the volume for all channels of the sink to the desired level. + * + * @param self Pointer to the PulseAudioManager instance. + * @param sink_index Index of the sink to set the volume for. + * @param percentage Desired volume level as a percentage. + * @return Boolean indicating success or failure. + */ +bool setVolume(PulseAudioManager *self, uint32_t sink_index, float percentage) { + if (!self || percentage < 0.0f || percentage > 100.0f || sink_index >= self->sink_count) { + return false; + } + + // Convert percentage to volume + pa_volume_t volume = (percentage / 100.0) * PA_VOLUME_NORM; + if (volume >= PA_VOLUME_NORM) { + volume = PA_VOLUME_NORM - 1; + } + + // Debug: show index and desired volume. + //printf("[DEBUG, setVolume()] Index is: %i\n", sink_index); + //printf("[DEBUG, setVolume()] Desired volume: %f%% (value: %u)\n", percentage, volume); + + // Ensure PulseAudio is ready and sinks are loaded + if (self->pa_ready != 1 || self->sinks_loaded != 1) { + return false; + } + + // Debug: Show channel volumes before the change. + /*for (int channel = 0; channel < self->sinks[sink_index].channel_map.channels; channel++) { + printf("[DEBUG, setVolume()]: Channel %d Before volume: %f%%\n", + channel, + 100.0 * self->sinks[sink_index].volume.values[channel] / PA_VOLUME_NORM); + }*/ + + // Create a pa_cvolume structure and set the volume for all channels + pa_cvolume cvolume; + pa_cvolume_init(&cvolume); + cvolume.channels = self->sinks[sink_index].channel_map.channels; // Manually set channels + pa_cvolume_set(&cvolume, cvolume.channels, volume); + + printf("[DEBUG, setVolume()] channels: %d\n", cvolume.channels); + + // Apply the volume change to the specific sink by index and wait for the operation to complete + const char *sink_name_to_change = self->sinks[sink_index].name; + self->operations_pending++; + pa_operation *op = pa_context_set_sink_volume_by_name(self->context, sink_name_to_change, &cvolume, volume_set_complete_cb, self); + self->iterate(self, op); + + // Fetch the updated volume for the sink and wait for the operation to complete + pa_operation *op2 = pa_context_get_sink_info_by_name(self->context, sink_name_to_change, volume_check_cb, self); + self->iterate(self, op2); + + return true; +} + + +/** + * @brief Iterates through operations in the PulseAudioManager. + * + * @param manager Pointer to the PulseAudioManager instance. + * @param op Pointer to the pa_operation instance. + */ +void iterate(PulseAudioManager *manager, pa_operation *op) { + if (!op) { + return; + } + + const int MAX_WAIT_CYCLES = 100; // For example, wait for 100 cycles + int wait_cycles = 0; + + pa_threaded_mainloop_lock(manager->mainloop); + + // Wait for the operation to complete, but not indefinitely + while (pa_operation_get_state(op) == PA_OPERATION_RUNNING) { + if (wait_cycles >= MAX_WAIT_CYCLES) { + fprintf(stderr, "Error: Operation timeout. Exiting loop.\\n"); + break; // Exit the loop if we've waited for too long + } + + pa_threaded_mainloop_wait(manager->mainloop); + wait_cycles++; + } + + // pa_operation_unref(op); // Commented out to prevent early unreference + pa_threaded_mainloop_unlock(manager->mainloop); +} + + +/** + * @brief Create a new PulseAudioManager instance. + * @return A pointer to the newly created PulseAudioManager instance. + */ +PulseAudioManager* newPulseAudioManager() { + PulseAudioManager *manager = (PulseAudioManager *)malloc(sizeof(PulseAudioManager)); + if (!manager) return NULL; + + manager->sinks = (PulseAudioSink *)malloc(5 * sizeof(PulseAudioSink)); + manager->sink_count = 0; + manager->sinks_loaded = 0; // Initialize to 0 + manager->initialize = initialize; + manager->cleanup = cleanup; + manager->loadSinks = loadSinks; + manager->switchSink = switchSink; + manager->setVolume = setVolume; + manager->getActiveSink = getActiveSink; + manager->iterate = iterate; + + + return manager; +} + +/** + * @brief Request the default sink name from the PulseAudio server and determine the active sink. + * + * This function initiates a request to retrieve the default sink name (active sink) from the PulseAudio server. + * Once the server provides this information, the server_info_cb callback is triggered to process the response. + * + * @param manager Pointer to the PulseAudioManager instance. + */ +void getActiveSink(PulseAudioManager *manager) { + // Request server information to get the default sink name + pa_context_get_server_info(manager->context, server_info_cb, manager); + + // Wait for the active sink name to be set + int timeout = 50; // Number of iterations or timeout value + + while (!manager->active_sink_name && timeout-- > 0) { + manager->iterate(manager, NULL); + //fprintf(stderr, "[DEBUG, getActiveSink]: Iterating to get active sink info.\n"); + usleep(1000); // Sleep for 1ms + } +} + + +/** + * @brief Callback function to process the PulseAudio server information. + * + * This callback is invoked once the server information is available. It retrieves the default sink name + * from the server response and determines the active sink by matching the name with the available sinks + * in the manager's list. + * + * @param c Pointer to the PulseAudio context. + * @param info Pointer to the pa_server_info structure containing the server's information. + * @param userdata User-provided data (expected to be a pointer to PulseAudioManager). + */ +void server_info_cb(pa_context *c, const pa_server_info *info, void *userdata) { + if (!info || !info->default_sink_name) { + fprintf(stderr, "[ERROR]: Null pointer in server_info_cb.\n"); + return; + } + (void) c; + PulseAudioManager *manager = (PulseAudioManager *)userdata; + + // Get the default sink name from the server information + const char *default_sink_name = info->default_sink_name; + //fprintf(stderr, "[DEBUG]: Default sink name from server: %s\n", default_sink_name); + + // Iterate over the available sinks to find the active one + for (int i = 0; i < manager->sink_count; i++) { + //fprintf(stderr, "[DEBUG]: Comparing with sink %d: %s\n", i, manager->sinks[i].name); + if (strcmp(manager->sinks[i].name, default_sink_name) == 0) { + // Set the active sink index when a match is found + manager->active_sink_index = i; + manager->active_sink_name = manager->sinks[i].name; // Set the active sink name here + break; + } + } + //printf("[DEBUG, server_info_cb()]: Active sink index is, %i\n", manager->active_sink_index); + //printf("[DEBUG, server_info_cb()]: Active sink name is, %s\n", manager->active_sink_name); +} + + +/** + * @brief Deletes and cleans up a PulseAudioManager instance. + * + * @param manager Pointer to the PulseAudioManager instance to be deleted. + */ +void deletePulseAudioManager(PulseAudioManager *manager) { + if (manager) { + for (int i = 0; i < manager->sink_count; i++) { + free(manager->sinks[i].name); + free(manager->sinks[i].description); + } + free(manager->sinks); + free(manager); + } +} diff --git a/v-0.02/easypulse_core.h b/v-0.02/easypulse_core.h new file mode 100644 index 0000000..daadbab --- /dev/null +++ b/v-0.02/easypulse_core.h @@ -0,0 +1,77 @@ +/** + * @file core.h + * @brief EasyPulse Library Header. + * + * EasyPulse is a library designed to provide pseudo-object oriented programming + * functions to simplify access to PulseAudio. + */ + +#ifndef EASPYPULSE_CORE_H +#define EASPYPULSE_CORE_H +#define DEBUG_MODE 0 // Debug mode flag + +#include +#include +#include +#include + + +// Forward declaration +typedef struct PulseAudioManager PulseAudioManager; + +/** + * @brief Represents a PulseAudio sink. + */ +typedef struct { + uint32_t index; ///< Index of the sink. + char *name; ///< Name of the sink. + char *description; ///< Description of the sink. + pa_cvolume volume; ///< Volume of the sink. + pa_channel_map channel_map; ///< Channel map of the sink. + int mute; ///< Mute status of the sink (1 for muted, 0 for unmuted). + int number_of_channels; //The number of channels of the sink. +} PulseAudioSink; + +/** + * @brief Represents the main manager for PulseAudio operations. + */ +struct PulseAudioManager { + pa_threaded_mainloop *mainloop; ///< Mainloop for PulseAudio operations. + pa_context *context; ///< PulseAudio context. + PulseAudioSink *sinks; ///< Array of available sinks. + int sink_count; ///< Count of available sinks. + int pa_ready; ///< Indicates if PulseAudio is ready (1 for ready, 2 for error). + int sinks_loaded; ///< Indicates if sinks are loaded (0 for not loaded, 1 for loaded successfully, 2 for error). + int operations_pending; // Counter for pending operations. + int active_sink_index; // The active sink index, i.e, the sink being used for playback. + char *active_sink_name; // The name of the active sink. + uint32_t current_sink_index; // The sink being processed right now by the program. It's not necessarily the same as the playback sink. + + + bool (*initialize)(PulseAudioManager *self); ///< Function to initialize the manager. + bool (*cleanup)(PulseAudioManager *self); ///< Function to cleanup the manager. + bool (*loadSinks)(PulseAudioManager *self); ///< Function to load available sinks. + bool (*switchSink)(PulseAudioManager *self, uint32_t sink_index); ///< Function to switch to a specified sink. + bool (*setVolume)(PulseAudioManager *self, uint32_t sink_index, float percentage); // Function to set the volume to a specified percentage. + void (*getActiveSink)(PulseAudioManager *manager); // Function to set the volume to a specified percentage. + void (*iterate)(PulseAudioManager *manager, pa_operation *op); + +}; + +/** + * @brief Create a new PulseAudioManager instance. + * @return A pointer to the newly created PulseAudioManager instance. + */ +PulseAudioManager* newPulseAudioManager(); + +/** + * @brief Free the memory associated with a PulseAudioManager instance. + * @param manager The PulseAudioManager instance to delete. + */ +void deletePulseAudioManager(PulseAudioManager *manager); +void server_info_cb(pa_context *c, const pa_server_info *info, void *userdata); +void getActiveSink(PulseAudioManager *manager); +bool setVolume(PulseAudioManager *self, uint32_t sink_index, float percentage); +void iterate(PulseAudioManager *manager, pa_operation *op); + +#endif // CORE_H diff --git a/v-0.02/examples/Makefile b/v-0.02/examples/Makefile new file mode 100644 index 0000000..1543a8e --- /dev/null +++ b/v-0.02/examples/Makefile @@ -0,0 +1,19 @@ +CC = gcc +CFLAGS = -Wall -Wextra -g + +LIB_DIR = ../ +LIB_SRC = $(LIB_DIR)easypulse_core.c + +EXAMPLES_DIR = . +EXAMPLES_SRC = $(wildcard $(EXAMPLES_DIR)/*.c) +EXAMPLES_OUT = $(patsubst $(EXAMPLES_DIR)/%.c,$(EXAMPLES_DIR)/%,$(EXAMPLES_SRC)) + +all: $(EXAMPLES_OUT) + +$(EXAMPLES_DIR)/%: $(EXAMPLES_DIR)/%.c + $(CC) $(CFLAGS) $< $(LIB_SRC) -o $@ -lpulse + +clean: + rm -f $(EXAMPLES_DIR)/*~ $(EXAMPLES_OUT) + +.PHONY: all clean diff --git a/v-0.02/examples/switch-sink-pulseaudio.c b/v-0.02/examples/switch-sink-pulseaudio.c new file mode 100644 index 0000000..0a0c85a --- /dev/null +++ b/v-0.02/examples/switch-sink-pulseaudio.c @@ -0,0 +1,62 @@ +#include +#include +#include +#include + +static pa_threaded_mainloop *mainloop; +static pa_context *context; +static int sink_count = 0; +static char **sink_names = NULL; + +void sink_list_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + (void) userdata; + if (eol > 0) { + int chosen; + printf("Enter the number of the sink to set as default: "); + scanf("%d", &chosen); + + if (chosen >= 0 && chosen < sink_count) { + pa_context_set_default_sink(c, sink_names[chosen], NULL, NULL); + } + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + sink_names = realloc(sink_names, sizeof(char*) * (sink_count + 1)); + sink_names[sink_count] = strdup(info->name); + printf("%d: %s (%s)\n", sink_count++, info->name, info->description); +} + +void context_state_cb(pa_context *c, void *userdata) { + (void) userdata; + + if (pa_context_get_state(c) == PA_CONTEXT_READY) { + pa_operation_unref(pa_context_get_sink_info_list(c, sink_list_cb, NULL)); + } +} + +int main(void) { + mainloop = pa_threaded_mainloop_new(); + pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "sink_switcher_threaded"); + + pa_context_set_state_callback(context, context_state_cb, NULL); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + pa_threaded_mainloop_start(mainloop); + + pa_threaded_mainloop_lock(mainloop); + pa_threaded_mainloop_wait(mainloop); // Wait until sink_list_cb signals completion + + for (int i = 0; i < sink_count; i++) { + free(sink_names[i]); + } + free(sink_names); + + pa_context_disconnect(context); + pa_context_unref(context); + pa_threaded_mainloop_unlock(mainloop); + pa_threaded_mainloop_stop(mainloop); + pa_threaded_mainloop_free(mainloop); + return 0; +} diff --git a/v-0.02/examples/switch-sink.c b/v-0.02/examples/switch-sink.c new file mode 100644 index 0000000..cc0a1ac --- /dev/null +++ b/v-0.02/examples/switch-sink.c @@ -0,0 +1,72 @@ +/** + * Demo Code: PulseAudio Sink Switcher + * + * This demonstration code showcases the functionality of switching audio sinks + * using the PulseAudio API. It initializes the PulseAudio manager, loads available + * audio sinks, prompts the user to select a sink, and then switches to the chosen sink. + * + * Note: Ensure the PulseAudio server is running and in a good state before executing. + */ +#include "../easypulse_core.h" +#include +#include + +int main() { + // Initialize the PulseAudio Manager + PulseAudioManager *manager = newPulseAudioManager(); + if (!manager->initialize(manager)) { + fprintf(stderr, "Failed to initialize PulseAudio Manager.\n"); + return 1; + } + + // Load available sinks + //printf("[DEBUG, main()]: trying to load sinks...\n"); + + if (!manager->loadSinks(manager)) { + fprintf(stderr, "Failed to load sinks.\n"); + manager->cleanup(manager); + return 1; + } + + // Display available sinks to the user + printf("Available Sinks:\n"); + for (int i = 0; i < manager->sink_count; i++) { + printf("%d. %s - %s\n", i + 1, manager->sinks[i].name, manager->sinks[i].description); + } + + // Prompt the user to select a sink + printf("Enter the number of the sink you want to switch to: "); + int choice; + scanf("%d", &choice); + + + // Validate the user's choice + if (choice < 1 || choice > manager->sink_count) { + fprintf(stderr, "Invalid choice.\n"); + manager->cleanup(manager); + return 1; + } + + + + // Switch to the selected sink + if (manager->switchSink(manager, choice - 1)) { + printf("Successfully switched to the selected sink.\n"); + + //Get active sink. + manager->getActiveSink(manager); + + // Debug code to print the default sink after the switch + fprintf(stderr, "[DEBUG]: Default sink after switch: %s\n", manager->active_sink_name); + } + else { + fprintf(stderr, "Failed to switch to the selected sink.\n"); + return 1; + } + + // Cleanup + manager->cleanup(manager); + deletePulseAudioManager(manager); + + return 0; +} diff --git a/v-0.02/examples/volume-change b/v-0.02/examples/volume-change new file mode 100644 index 0000000000000000000000000000000000000000..376eb3066464ef362435d5c26f8df0f17602328b GIT binary patch literal 47760 zcmeIb3w%`7wLg9ybCO9i$xK2L62fD`Gl1j)2mwVC$lwG+67x{-H3`WCQbUp^6CSN7 zCDNKkTClZJFGckBT5Yu#TWhV48mtwpwxuu2Rd1zU)TG#6>g!T#&F}l&`GMWP(z8ozP-aw~5!0vR)1|`^j69?c-6lVY5m`{ zS8LWgu}bn8n?54Zij`XJU4eSk%RhRVW>@OW_Tt&0%=AwyHPx#Wb+m6-vbdK-hI&mfVzv1S) zZd~@xpf!wuiM>7m19Qm46#M|tc=!+m9uJ=thY!W^$8eTFTO2;0MuqYCFO5Ur3wGnt zKM+Tr&&T2aS{!=n-!Dauxjz<%Pe&X+;W+d!#KCWj!{>rH^6UYAJU!IK;q&V_^aarK z^q8JXz!itj#5i`D7N=jA#G$_^4*fUd$hkL;Jd5JsSI6Pg6bFAp965g+hyR^%=-0&Q z*U32etK#svD-Qjq;?PfsL%%l;eNPOflIQTPh^jRn9)0F3DfB@HIa}pZ>K3&OG znwllvT9=eiXyfLt&QNcpxhE0|DWS@SwV~EIpZuhFe3Mo7+1(y1KeU9bGLqC@AUb4)-)i+R;c~XHU3|sB?*XBVFC&muw72 zLe1UnENtoOjD)vELY?8QPLLG6;hrtwo=|&dTi5t(dfPX4Hg`Cy^|D%f=MAAPT^)U! z!=Vk^L!Hf=!zAgA^n`nQx_ZWE)rbDcuCZtv{wi?F}#ovq<* zP8!=nmZ}9ODv6p6b-*c{p?i92)hPqlM8$|TMzwbCfoB`AnD@UM%%1mwt7MR4>e z<{Yl;wfKKz-&YVeB`8BCZen|TDxy?4n0>nGxyPXa^_Yu~0Ym>~8 zKFdNP-PIY z#5*@3Lk|2DNh0pY9QdgY{BZ|S zj#Kt)mILp0;AcDVJ_mk|1E1r-7dY^K2Y#*tU*N#cbKr{|`1uZesRPfwgLRcT@Cz&? z(x3xh4&c@3P`z4&c@6x3TLbTUr+yghf7=}# zG#V>2k3`2tFZ>D6qqAPb-8-!eIl`M*Hga+l*Q{pz&(Uh2p0?Z6NGt$GvXKU2Esf#8}SMFYQj9q8BqjWN0>)A zBWFGaV%8eMJh~Yo90VfmYQO!t`fHlHAq8X_b@Q0TG=F!YZnSkFR%p;kRVgdhw zFppwJ`~rTRFppqHd;)%%@KnNzfPYDN8sRg4WB-3b*iZPRfS)0pPx!ciA1BPCm60I< ze}^!SR7MU9_?v`zlrnNi!1og75z5G30pCTKM<*jY1$;YU9+`}E3;6Sdc~mmeB;Z|y zc|P&4zpk%1z`QV-vFN0<@>-5En@?Kk^ciJrg;qZG_ ztOtYO9;1%Qva^va425rlh(jT1^rUy%PSX9zOhG?a&|f&6$=r{F180Iq{&Z>Z$XPw8 zJ{SDO$B|4h=rb9(M^CnSr&UDjQ@))m{&vU^@kkJP{~_xo8Z9F;f-(vv&!&1xFR2Z z!(15DCd1k>4A+36W-_EJTMVBz8D?7y2Wx|NRjY+#s3BV@jJB{ThHS8`U?A|eKn<1^ z2M3;mu%D8=WrzFzIy!nZa0*Q;BL{Jlq(R>xYPB2>4jd02ISG3)(PRSX*kI$SV9PIq z{m-}tEB1N@hTsC*Qrf)#IrL7@J8$T8ZgAk4;4l8re^L!5J!7GtdB?kM=pC;w^&PbT zj(7bL=Kmz}*B@yMdT)AWFmMWK=QBdew=puIQqjNRpMN+y+8;Qj{$tX4AKiHXUGY9T zv@CGSd)r(X{U56s>>tXZ8TX>O|6!-5I69T<=+qE@@c{L*@>w zFT(MIgNahm}4>_p<6 zI)+Pzf`hw>4G!$SpUI#|27@`lmLtLTp^a^AZNVeM{()zH@!`O+BWI`0eP-Y|Mw5Dc z;3spR+5JoJ?pI(9t5#V~|Bw-Px zU6^4Gm9jfW9_M+tHN)JPBNRUT2WsXFXvV5Ic!v;Upw`#_6ji5euSb#8=+WV+wD4IYGK2G7gMs;p=g!cSY@>okOmzra}VquqNWCS6GmsK!YuZEVD~X+0o06= zzk&fujyp?keNbp)|07HW_MBkZz}HR+l3SmYWzWj8VOe%Ymc1y;_~9bdJ1ff=Mg<3N zeN~omPDYuV$bqjh_VHyQe^wF_c4@hseSGnX;@@mX*n} z$+B#wEDOrAS|o!zF92>}_c}pmYAHA~IJoWt2zIR`Y!!vU#lT(+Y=^`~B(?(BDqwFE z*z0Zy4h9>5x;8kl_O{@_bzcUIv9zuO@BzSI2OI%>Bj5)CKLW{bk-fT2^my%)z&;D? zmnD|dJZN78_Sb_uzYb_1@TzIh!JWmF9uunN4BZ$ma%`66>{N!1T8x9U=ActTK;rfyvLv>|js_+Jh zg;*DoR*HExxF_rLnbd)pZ2rmSveGTtl)1?#*W!uViJ*~ek4o9l7^v9xp449num2f4 zKPq_Hjdt5$nfnKn>T%xeK40 z2FoTRhJDjf@&%J0O8U=geTkBpA)*mmn?7ih_QOAva&-6yvJyb_5%BZx2%)Uv<#w^4 zzT7UA)PJ>MQT!sn*yj8+o|Mtn;pJk+7dm|6&!(mNcbru$iKj^VU^mx0kr&1r{Y5Nm zI_vO2->Kk0;|Wl~A%$a}9W0x9!oFf5o#4ph`7{dLg%R*>Y~`&fzYre41}dl~%OL?b06v|` zs?O!;Ae0epvJBljG0^vGbnh4_kD)$WKoC`m=(vB!ua(FWyYaPW1{)bMpQs!-1}|ML z+CMsc@tAgBMGNP)J3FRb(N)X=CkGl|#WZysT#vKu{vEF>eW76gj+07c9UI2H=Mw@z zAVhO~Y2Z0~hEUZ=ZFb+p%Jw)X+LBio~c{6mbpG5^SJMyD2v{=%PxW5E{C7~sGD zrx?9bA#%o=6`isET~eQg<}li($@u}>LvlWMv;i;d@;TIk1~|q9d?(s)jKq4Z8>RGB zt{Vf5Sk~4KfpiEyGu*%9MdhYh7-@qzVxfGm{87qhkI`X_(Gh-38ZsSM`nXs920o!g z)m`LJUB6lX3A2B(^#`Tdj+=`DnQSnblscH)WHQ+@E|b*`CSo)9MM*BSG_09|n@&HB ztxVhncuyub0gxs((!!EGaJ3)Um>6qK0k9Yzx5h+QYoO7q%YcoEtJVa8tpzqFqFS>K z*d}0OVyQKofb9l0CW>0KEjV!3PT_U8#)MFxzm>>=yY?b6L#SQ*kvF&5r(Nbw_Bi&b z4+1ausW*!f7_ECo1kH`p5L~i|0 zky7bfir_~EcbG508ZLA{Eiv#6Y<$xN5P47P931Bb2e_O_Q+;2U$_xNGMTzWxXE5~` z%$kE3&X2IKNr?EhO-u%Z1;AoP+|wXbBE~S;P>bja>?KG5gNttcpk!G$0xkl?mFgyJDeCZ zp0ahr(CiM`h+v8B0-~6yI9?#jH{TL0H&G8UES(r|h6=ei0EOzQBxs zQt{rh6V7-v@KLKs&f*SBi#df&=b`55GAuk71wOhFv9s~{0xJ5*<2(|!*72M0Jb=Up zNsL&}uAK@*f8Z=<|^*oAWnG*{ziheCULIVuh(M! z5Ou4BQEM@|3lPUm=x8lw69Ilptn9TgZXmja^9%I~9oPZ)m7<;qxaYmev$T&83@fM2 zy@+5iYz4lfzkGTa2eXfXKpC!LKP9hX##gC>fsYVd4>W$Xd+6pPQLU9(>%RzAxsr>x z>^PiT)GL7Hj^osStmWQwOUs=?J0o0H(3lnI%E}0uj|RBhDW`8n;TcSxf9IH23@C0K zT}M7N5@S54=q;Lhy}<@@?;JpTt-g|45o-@3gVeyzx5Q5!k)j*Yv8;F{{N-{ew&8ZYJ8a|-0F{X`S~TUcJXZ@e=Wb+ zQ{LCw-nF*5vw35gN~LdVyZm*V7a3jQHyTFZa*tgz_HA}Q0wB>K^>1o~$ol#eQ z>zi|aex0hXCwy(E5>>n3)VovOzD|Cf&1MIC;agnbCNH~vHYLAD=kMx^_`BNt8@l>B zTWKp^HXVhS)9dFq4E^oB{_4i6Dw14N5m?!H*#)M~@qMo_zxB1DU@p2A=xklk)rK#| z_eT8q))>lKg-)Y<$FElnqxieK@Xa$Q5>DXfHyWjwZCx>P{e$&cSx9bo|G$;Hwx^4} z(cZaHxGgl-)+OX1AJb`Vy+rMYul1Q~DD>Bbn|r%D9S&~k2}II)p&{WUaQa@*wVH+r z@N1jP{WaEiPW_Sg&0!d(&>z@_@dlCj-PA%@UtYExF-mLi^gFVWCxKekfViu$3N zr(g64ko;gt@YT`LVWek&H#&M8>7QR49ra-!lzM7(ln)cGK!n?X^i8A@q>HgZ_%hOe zM*0ZSkCFZw=_jytd=KfrBhAFL(TH8+Vx%7+Z9sY}j)5XbzkX(PbU)HkoGm_yl!y7R zBCW^6gpZJBelR*Z84=_F(u&@>J)XGPtEfry7!_@;wR(Zk3R6j zAxcFe&dL4+)cXqT6v zyc6ZUG3A|hc@xTypqzV{X#2f(`A(GQ!ru49lpnCm525@nl;4ijuCMPA{qqAg1iT0S zFqyWnbQpjRGc>`2G^ar0g0IlWY#QqMbApY~lN4&c@3P`z|E%#`t~^D@bl;gG~)85Y+Wv%rcU`GIj>);kVL@d${Qg>N!DZpnQ@7AyQ9IWMby zd_+-%YCs869H(*o>1;DyVy3Ij^hz^rGt(_*`dKsm zikaSLrjMHGb7uOInZ9YJADC&vbhCXkoo%K|%yhMxUTLOnX1c{pKWnC6G1L3Z^ieZ? z&P-)1*pD>J+-0j)E%z7T?QL`YC5s9d7MA!I7B5^>Tv}YBTmTA9P)R3zeuk`Ky&6eE z(YvHy0Afl1#vEC;!1DPhsmRR*nW3nHI9*p2WeU;UHI3Jji{~fWOB0tPG2Ds&!Nip~ zj3mQtsP6nkz*-`=YlfOI1CZ+*DAQ+8TtiCDs03<)%fRMdab1Eo^?BLlEO8spqiNR& zCIWqb?rxx5l`Q^h9`pJGq)`**p>`VcDJMaA!d2qF7^=~($MoP@l-Pp;MdKNRYe^D6 z4(Hay9%88geA>e-DHTADHj{Oh3Ba$t4lb_c0w~a)25Z+v0w~s=W}S-#P^$fzBCZfX znYI&sbd?Dps7=Cz;3^kDt@cR>?pi5;b=nn}%3KxMjcB1syNKLYXI>3pllDt;3ks>b zwQrDHr2rz@3W~EPM??A1I3u9?UWjPBR|N^LY(`xA(CC66hxiF+MVn|D4Du^ zO#3qx(j;UX((Yr)1~)f8&nm7{C^8arzX!U^pOS2TTH^Omq}TFBbP~-)sgmh3Kn9Ud zOkyz)0TRzb2K^@F1R>7@1mOflKTK-cH|t-~X6jeczJ|Pu>=JS&a9($n0iQ4_b35|z z#ovjJxtm&E2dfa3N7Y1rk;507g^445qqz6X;d7NMOP+ zg|7aMy-{ByAN3IO32G%IO;qcFNmM6*#;tw^m?ZTGFv;pX7&>FU+U&rl<{&s4vF`z-Z-+-IxL z;66uv754)51Kj7TFQeD<)c0_ouilCK1?oD;zd&6HRTZk6aW7K2OckqVfG<%ep}z~& zuR@256xT5-We^v+-)pLQd7STtTJhHbGMS{QS(^jQj%zrTktPz zJx$4D)xe9Q9Kkg1UH5K_p<_(`K z4K%JdK;g-pz6AIb=C^rfyYrz#?cYG;nUl8%Un0*8qI%tK_Wzg)qA-Io%6k6+H>?l&N5v z`g7I8H}bS2N?4nJC2dA2Lx=U}N{AXmLRrThjJ5C^LUDTNYY0qC8-hbI~c9 z3LPR?;QT#b1PjX`K7)m^Va7wir^4~%cH?b#E#(xl4p-~t&Q zq_+ZPFhc;{|Ph?v2bdUeLapC-Qr-AqWbF z8uJU>uII=}MiS}F8xP>7=S<-GYH&f(CuMdse;Cc^d71slXTFJTfzRc3^W)+A5H>%q zG!F$=^bfi0deeEn=T_1`Kw`A<_R>VkhrV)Eg5+G43SBF3&wd&580=iaXTJ?tOXD6x z%gBMzwd=uK(=;}%y$|!bv^TNUF|@D3of0%RY9?y0gWjz@gwdCzeHs&Uvi50&b}8C1 zh~m-y33XF*uR#BAR*b8_G~xUDDm0V%CI@B0M?MBI`YCWq_*)L!R}$_)uM-qCjiR~| zIB_QEYU(cmxs_yAOE6UZagZk82(}4sHRBH`%T~cW@nYl>XYrdQ+E&qzbjYG=MUX|) zo`sCMmPCDNRk$14vruG$Vl<*ti3{`;RLeffP6;;G^^wg&?(MYa(J@tf2;_J@-wgCA zu}$YoYO_x=FUWhpPV$u?QM6RFr)q`J63A1KB;Kfh2F24qWS-=|RoiuxehILm9fdHe zb_#81+G-)>&n8mH|Ag>{_QebcseKiFP1Jsf?z^?+z$9r?Q8!up1iGD~tp}w?D?zPP z?MEn0(*_}!SGx;5ecBhGigb-%C(h6|f^vd32i!8Xw;*Pg_677fTQg8PQTu0b$kE;a zhg|Iylupu?qcl&MaR?&jB)+fR1E~`}gp7$FXr4=iy?#pVeJCM!LM}KYek>uMlFWLE zE?sAD(^+}?Rp^3H!4zG^?4zwlGm7?_@VCE0ET{k!F6{~A-P#6p(x)AU5PmHYm@;h= zIPNUcsb^J5zM0K6==yibx)gE=SKg?v0_)tx=>5%FKd^8Iuu!!}A*+@<75%#@*N>_@ zl;mv`f0wSOp@#9V(2jeF|61fTneTRA<@R%iehF0W^(l8fE;~3nsION{5t@@{t9GqhqD#Ta0Pk~ns#sWWC1AF?YM1*ssk;8eYHny!Ruj2Yg0d|#ba6T~?x)h%`lh1HH3K(yX>29g z)~(c1?X(J%WiW5FQ15lVMpk32>h7|uiJWYPyo@GVzd?{rV#nzQQmUv1I)FDt+evQp z4pnH03Q}AQe%i5vHR^qWc8VPXSM2Pw6zW1<~byk1~Iq_2@>btr5j#0Cv-z z1X6KLB215xL>c7h;@))x#Nb|W z?IM!i7gdSkVjQ2WLB&bg>f|2)$RHrMMdY1aH4D>xuGkc5VpF7vO_3%xMViG6oDbmEINE4ePO>BxZu_@BTrbrW; zB28?HG_fht#HL6Sn<7nYiZrn)(!{1n6PqGUY>G6oDbmEINE4ePO>BxZu_@BTrbrW; zB28?HG_fht#HL6Sn<7nYiZuGgY)x#6G_fht#HL7l89JM%iA|9vHbt7)6lp7=yh3d= z?nN4g48m}+DbmEINRyi)gPWq{J9KJyhS(G(yVYyBtcpzu_C&u#O{JK7qGareSmaWs z&>}bBf9fg}PE(RuGZ}lL65z6bg;_()v?;S*0IdB6LsilGG25ux8kkno`Y;Z4?Ms+@ zv5p~cXj{41YCqtDsa?W(Rx1O2Qto<`A~?7V!!TuyPMI4BaKyd%C! z2%~eiE-?$)_ii?2kzlGE=`B#NIy%vYdo_z{P9GD9aDK zgSj_B)!zoq>?h$$htw4H5u^#CC66kbN;tu$Qe`zUH7VXSS>{U^A%Cx$$&fB5fg3Ha zPtBwc%}h8!{^_#b{R!NWc{5ZW`}JTVcVQD$A!MQL`9R)T)UF{3KTuezHzY+>CmYWW6ReaVseE)O0F* zlbTot6-`#N7%+6GiG%3!6xn*Wn)m=(pDLk-P$KH}OE*jDGBj#KXBbgfa&Q$d)flfaLAUO=Q zcaG|Ni!^WJ=1xGDq-Tnp!|{HD;u&uvSUBc=T)h)y39kU~K4BT{7A)W1Cne-gI1B>s zQxfteY=siNKa^08G~v_Ig#LtstT!afiW9y_$2uaR(uAkzS8wqX1k_;O0J#o9vFr$szQ0AZLG!X1A%I)n0>6rNezr6aH*E zb?H$_25L#CI+7ouxejQ)j{&%JaB@$0-c9P z=|w3=fGgH{c$8i&j9jYo@F;ze=Q*@frZXH&Uo3#2&cmbh3k6WC^YAEriRU$tt$=_@3Wm!PbPp(IuDQ1mwDy_=vGP!)b!k>J5WXEOqM=L`jwbY)ANKdZZVyv zPZoer=TwzGML0)}&N(f8s_>fwbHw2h)$Ld3h{Gf1ad>2Wi`vN7sZG~(=-0*eCOwWD z|J5V7Vb3oPk6g=H{w=GVeG%mrRhm;#lck}406T&DoI*;mQgm4vLD-IbhX zqXUX77jWiD=<-BHiTisnq|T=l8H*Arw4xW{ma!y>#&GMWpv#P<0`Tb%v!ql2IXa(G zWGoYaU*}VbjO79-(D{@i<01hR>m17&7Ym?N=W39#LI7p@PAE5{OaMWhPbo6W1yHN= zDMiLg0j$%nKp2!!k^M8s*`)I+MaJsPUjf*p^C?9}P)Oaa^C?9}r2ry2pHgJ3N%yy~w!#bZ*WQ3AupzX(WKBdTL60!~H zd`gkA!L4FAKdTsgN--fZw-6>-$fpz;^V2f;l*08q8gLOktYWp{-W}Rv9*ko3c29sYcC} z6Hp_{rYUJpW47`BMD@~hwvb$eLl1Di7PEBP8<-=r4rytG_K<*GR?#J)wFM<>R3SduZkOwP*g79ii=sq@`y!&V+1~A_Fir8k$mk(ImEv8&GBFU+cu<;+gHl56M6(>! zbCCBe&gPNO%|!F2xF(}8jYH3SuO`&>FDw)4`ZFe9*$rfvo7ix+2HSM$L zf%ksN<$arq(}0)@)F`R{Yp{f8UIL7uiou=sC$#1Lwyax1w2(m5Wj`Es)AHF&vDAK@ zO&T?izX!cZeWb-IQYJQnxi3jg*g}+875q6+W9n}{7o{m6%``RPE}JH839>#z6`O>I zZS=%np=-WOHQ`wsX8K5-%90iUKO6xr0?JZLWU!BkSNAyynguqh?25sZ8nsu@Hz+chqvB7A?F z$bNe_u-iv7dAcZeI=m^arKs+G2-(ah(vARekd*~b??k92^@!*h*KJi)n79rO?VGJ8 z&;dm+r0Y#QfI*t|uUhJB#LKbrGUUzrmKnZdWeXGUyxHz77P#^U%&*tyw-2RX(~W3z$%Q8AWi zX;O@9A;$Z_d$qTh$>KhfNlih=tI^tll3gK(h}#qHVw$7 ze6XRur)HADe6tDKi-!$LDWwV$+^tqH4$$`1hjlS>Mo05J2$)Aw> zD}CR|o09$rL;gsH?)tuCH%*4LKUODDT7BPff(w=BE%?Mu%G^BIb*p;gVkw;X$g>dc zSqKM**s2!OA%tjrtg}^JN-GM{=n`91(0G7#ipS)SPVx4-qbj8CrCsBpzDKYnbgKb|^6(?kNw-=h zhe(y^qg%a-eS`{xYLl!kHf60hxvw+1CyipVO;smKr`&`M>es;bz3&yt@@=*d4?~EY z7UjLgrlNhc>3bK+Rx5n8=zD9dG4A0Qf8QG7o(C{NejuV~Jn_pqY4SFet#~NHUmOyA z0r2lvnpC~E1T!ZK34U)%uue$udsBi2A;Is31ek+_0IypDWVM*g%pt9K?tt)bIGTJI zzW?G&g|aQocH&YGY?V#ExWrVvX!6AsveUB37ptVEWs^U*Cx)5ahx~xU_tPfZYizdP z1zR6|?+0S^V)mT}S9n~EHIDt6+|V3kU5{C}%dY#nRrjDdt$>`Hp>~r0@B&FEzN3Mx zdSDtp8YP-)w|vs`0Mz@*Y_4H!E8mT-SI#vn-eI?M8!E!ymGdln)54XDOtv_%7Lu!+qol$BRTt0R@e7^bfYkKw&`wXZWQfL6z%K#_V4g;U%xa{?BMnt z-jNk5kPW;d6UFl@_+y@r0ja+4&<>A=WnywJx2*cU`?>t71&W?F8U4ixw4Sy+<)V~j zDU}mSfxvD$CEs0%VeHCw6k!iNQ%Om=B!!Qh5)6d|iTFHF+Qpa)-HSKRF+yMc|t*G*_q?<(+Bl^2MSvQ|$ui zK8l`Zqd^}<`)#zKmMrp}NQ>|ESR@rymUAOIJ|jgXz)sDSSvrC=rDpkqKGq*xwm%qA z#nSq4T&r7BF^K|^?=>|8!?`WPC0Pz4bVLV9j#XNUVS12F;IXO*&t#R8e3DXu{Dk3$LS$tV!MbnH1ktqIZrnS zg6K$oBKj_SGQ;jVFh1cfQ2{Y3!Mk#TQ^Z+I#mJp4>KV(02gr(Zq)Vhb26I7_7ucV} zYi=P%r?kXadFNT0u$4Lg-1*>w=tQtUP7Q@w${cuqkx)FGvKTVOjNg*j0lP5j<~TnP zUKlffEOr{&8gv&HD&{DMaB|ct%962^n6qP1PA!&-o{OfUc7k0Wz$9+qG0#mLt*ZK0 zd@=0|BGfjM%aw*`A_}`BIefa-6{=b2LO`WEBF=boVBgm*v;imlpHIjE3Ns8uD_Zn^{7aK{J zYcnPoz9)?Id&es@d@N4dwT~p8dkq8izhoGPj5PPZ8AimIa*Z)_ml1FuGcsQ?lC-5h z>>V|it`(&l7qEdf#v&%Wj5;PDo5A#;alxI&qFu&JAhOmN6C{bDElto9Z}-&iz`Wh@$w z2D6Qob1`(Sikq;Lu+CcGblT2!JxbaPK#A-ZPT>jl3s})NdOGWN>#F6N@36dx9~sM5OxGLVRE<#c#~3FtVRC zGTFj9BdyN>7vFkg>b*vmyF_}88~A?14X<2p_}(y#d)+S>NpDK$cEckthf;vvW~97j zBo!IH|1k0*hEZ*#f<`d&Y=u7 zUElLAORgkw4kYmO8-DobA-JbuXfv|W#T7<_o^&xviwr1y#ztsz!30Bn+DN(prI$oY zDfJ;Ep9BR?f@WDAy1&IpW5?T!^;?WhyNss2Mm|KYEHv`lj3oEnhWjbDOQx5yj{8kx zBIzTRd7!Dhd)Z5>hGw67kCFN>)K$jSM(!?SmiwULSwm}Qvb6qQC7>4_K zBj+i*_o>@31sI+`8*|vg<5ZyMNvfhzssfg|g~Fu1VdSGd$aam9)MuoUuSBF=V@l${ z)n3E#oaAmdvUbtAN+4RA_Pm-!bQxOG3ynfHxJJ$zFB!)5LdCW1?o&n%Ecl9%w2uS{ zr*PK}8ulijp4U;LLd*7GE~OFdj5=sU>Zp$a~yZQ=b>>N$_a*yN35L z6=-as-+GFS)PAZmsl>>91HIb5#x{hWvc^c#J0Q8LXZel!7aB|9SidzUQNT#TI-?-r zYB_+88MzpB4;i@+8QE`evd9&8hz`*6mZ4s56zjh$R|Kn{FfxB{%-Lm> z$c_sK*lXZZQ?=MnVB%OY#_N*SQ_`GkjP%_`+7GFMykcWIz3rHhy2hGf3aX6ayN#v0 zpr&KS95^9nD>R_#pDHx`Y-x?f7W2SfWBC%p{e+S6kdYKIa*GWAE@Osdhb~0{t~B~i zX`(eo9@#{UtZUJUenWjy!;ccHt>NC5p7w738o5$i9$FPFudWVMg=%Z+D;p|nszVJm zwV}E|d0nU~u(|<1cwQ62i#J+B-H{#z@8;kyJIAZFx~`_WAyij+S+GIjdq_f&zeBnz zP~8xyQ$oF)x_TlT`q~t{dd2)Ha{T;rAHLvI3Ldry8=8Ch3+y!^kcI@%+!ASz{-QU3 z$QwV^&i7m3*4N43JI5T%m*@_oh1&2!9sEGI{bG=)%0O>xOynUgenTFwzUdVBmaf)t z%NDSR{Uz@4L@94vSE7WvI$A?rZEa{u{0O>y(U%-Obec>2&irQiuAg!1 z%6gWI!0NEZ4PiJTe@GoKx}g`0`?KewW8yc&h0~7L7u(0BvyMj+6+2Y3I%J9=95vRn z@M0O~PuPn$2KA2HAxBqwo8h&>gU4$cnl45+JDNB4E*zH=2;vqjidSQCyaN0z`Z&`7 z+E@~=U}?O9(s%{S;uS26+mVvucy&rj;+8B_TEiXTNch}g8mEsXan({1S1%=T6;l#d zGbM3VQ?d+`CEjcm;!Cc=t>bo0%*WDKIsZxLw#Ifx7v7f?QCd2}&7FPS!uwZORs}Go zF;F>wZpI*2+Q5GN`B*SFoimP>7RI&3Ld*$rV2nxiGHs7sgfo!nn#`7+3iV z<0^llR6eG}K2D@7yKt&$FC19ydd4@0T;jNDiPa^vCDOd1BWz8KG$hxV@iihR7HQ1r z3(&@Ghtrg47|6nxn~h6WS$$=BRb|DvWzhekxW-#lB3F{uu0DuAZhd>Ev}P}{EH7F} zzhZxvEJkiTuc>cbc~wo#YA)~aSTW(zVaFqtfkvpix%EP&9WU%^j$oPZ>+I_dw=PtA zBdy_{9eaJO11( z8j8PaRILt>pS@%&oqd}(gnOVVtKGlr6prO4I*W<0#a{XNIy9k?FdQmH^16zv%Iie0 zIgQC>i^2(r?>)o2!yp(LS+N}|!zTh)BK!+gR@XK*V9fDNbI_a8yag|(Yu?b_(H_|z z+St>D8EtEGdnDAd9TS{r7q7hwHB_z*)S%wxF1$jpt0&ak)z{M!787X*e$yfZXx`k7 zLD}04km8oFt*r`#>Pwca3=k%p>KZTtb}a+Z3dIcC5ZquwU}cEZvVp`kwSl^F5gyky zR##V6U&aQ)od};0j-hveTDtJExowe9Zv_4;Eg>YWsi`WjyDX|8s~lBY!)@@5@D{wy zP~l73gn^aF_U^EP07r_yIUL#4CB}`=cYR}hZJ@dW!hW)^9qo4YM(}#O8x(Z9M;Nv@ z($lh8L}O-$S69`PH!NC+1;Ht#G@~?)6ob9S-XPM`wOv8j8M>;xvLUo;{i>=!y=`rC zrU}(Ils5=|LTcFoaF1-_Knk~FMQHEjOXlDN8#|jZrS^7&!%m^<7cPbsI!%Xw&cfZc zZL4c4${WflZF`qgj&v%iX4|b|%~DZQ9gsRikZzfGRn6M9<<%9U<5AlZ?C$Bp`x-Hd zqK?s6>QoT9#J>NIq_)@c-G!o+>QyxraEDO&szss7z^WxB%N8vqABSnBl2LmVwnu?= z4WULK`D6mxsQ_C%i%i#xkT4Vd18*I0%);ly^Oys@FCzP9|TYGqS%uVb#VnnHQ7rmpg8 z4u4C9mI69M7>1jh(a|x+H;0t$4jh_}HLhwI#zpsf(FsUQjF^Q?2ew|1>9q2~#UWv6 z)0tK_)~{!=oZ;YcfokDgku7p=r0n)&DCY%xq=~sY#tW_aN-hFYgAk_$vkszFkXm+= z9@f^}*CF-nEEBHEd{y*`Lq>Gf_Up>($_52qF=pDJOK})n9$0TVBsU|BeuYY`URZiDUp*RA z7KoWE*>^BCXGF|_b%E85^%%`mDc3}?x>zfdJu9%zT28%{4Xews+o@2xw&K)=d!0U0 z7En~y#I#(|P(Q9}$F7d8?Y(g7&TxxZ*sZZ4Sg~37rqkCk$%R6_j5@mT(%aZzKzI|a zz{k+vZcb^a*j_i<$+B-&RazgD4k}rj09-y za1TO<*ujl1!-(sh6O))Kqfu)m4`!>&MT}!P2bMaFG@(#ym~$wg4Qqs$!M`PD@T$<- z#)d#>RYP5s6~@@}zQv+;)mpNwx!j>gGh{{Rf^f7II{@}0)@yCUg97nNm)s$mA-FYo zTYGRi+@rL0_u!aR92N>vtXMb@v6n45Np4V@Wh8A$-&kFRIa&rAw2Nun`am6mHO!^$ zU6}Z`J9TIW80J!KEpuWTLqIRQ#p;TsaC^Xu9gIEX*&;$Swm;4gF}F){Z$i?*y2|MR1KbZT-I1iO3SrzKu{qumvxW$3~D2(%rnZ(+V9Ni=YV35XEtWi-u_U z@>Qz>^3H_HMpzzsP)aQ54=LEZ3_P z_4W1?b+m6N+St-kgy$ZiC5snyx8U{boqgLDZ0zhSk}sAkYVU06=))Ki^d?ZWp&ilh zIhZ1DXUE`0>q=o^3^h-B;9P~9#0Iz*DTa1mOC-d@OaWo99a+GqLY)B3V;nqr0ALRh z7RX5eIXMiGk=DcG9Jwn6#?}G6uqO-z8gK7HT38s>k1T7k(9^t$|WLlwSWW;5*ho(Pr9mj%ck`{POIQI0-vRfeedLz`1Xk(Z`Z7CwkT!F&wk?rrsrIV zQ1p0s{tjaXA^u0>&_5psf7;|T_M_47#-X36jjy*NfloWCFD#|={ZnO9W9D#Cz8i=BwK({{#lcS!cDJk%P3N2bF!mcf z%Z1-Y>8xA>@V;^Ux!L41_FF~U1>UM1O%KMw55>Ws0)Be5x}6)1L!Sc$jyEn!;@}$v zK1~_>m7VK=Psb-|o0{z=MW#ItpBv-gzZ3`mO_RU%{#2`#@5iA(5eGjS2cM4**Nvx# zi{s#HfcGi6=k%9v;~9?+U*|I(et#VN6LIiw34Gc)-&J@g4!sd)-kTo>&-eAPU)^Ku z$T!!dJNkM#Fa?9q@DBL zJ-!MMKTUD&ZK=mA;&T^lB*q-? znOhicY3wFI6$;_AGoe5bpX$JQQz%%0$9tDm)vPS9!egt|JWp;YUx}wIN~l5x(F|v; zKtFajVeXE~Y8$KS1EJz`2&4N}o5b-PDlS`YQtS$7(ebgLP-r8b7g38i?FuP40O>8e ztg3S5s?b8bF8M-!j;2$d)|tI;-m=kVWuolkSGmKEsSlaX-6!x6+-71uqjyN}JW1jv z$fhNY*(i5EHXfV(=yO5qLrCCqrT9TBsxfM1p>ghS?b@NrhP60M>j`g!p29s1YgggJ zQsD-ufwR;iIUhT+EpEWjh?HGS9-3n++)RP*m0Oa zpB0@Mw<{s>lvA2I?ngo(*}3+j6o}@X0-j4G1amm;h-j_ zPY(Tv(_y=gqd+{7aTc80pgiufY3%3dA($Aa%N1~V`4sM)#!V-K3)!_DO~c)6G_=~= z6~ZY(D~?#l)t-~u!Guok*x~b$hRt+bK0LZ}Qbb)kR!8!DD5guH(1zY#)AHl;<})mt zH%@LNc;t_>5j?ualV_XN;_*8uCJ(!|ql@uQF>G4LXFVV_p3&M(aqe+&63U7>xwm=5 zeoW71uvEcGNGtcSa1@jTf)Jc}*D2;a~mbu6Cs z+NJmc%GjRp+|G2du~UBZgEHJmD>(MSDUVXvyL~gBC?JjW$aIsH!)7|%)2$TZ5n;Fx z=Mjb6aff?w3>QUh=xgt2UC`cYqRLlRF2DhmBFOPv4_o}!?VV^srubB=D6t-|I)M<% zdcqyetYGH4J0eP<5VMdE`;|hmWEA#v30)P2H{n2*r)`^BQP+ZGjga^)K3T)cgK_ib z_7;fH1zxxniUuSzxUo`*#dkALg$i548~Qe)9*^*Vm!LQYvx+us=m~GJN^oQow(`)P zl_eT>>#<_p|C=-qm9fQBuBYtU6E7<*kRaYw zE3dKgGaSZuLGAtzoAs^qu-PDGr0%Tx{PrBLcKox7)xPz+Csu0x&IxIGjn)4rf#YwA zSoLp1Xv)h%lSCSoyze*0=Pp zl$qpadcyQa6Km_wf}cQ!?OXM&^ExZ#_rILi*!G`Cp|k$p3Q29H$1KJs6U%-UPkz&k zUlp{(w0=iuXsx6eOK-te`Wnc*j{4T`3?2Ii>z_tl`i|AUb^dtVtbc}`!$tq+WwmSB z@jc*3V$~lCkxEg9YGhg<6Z>w}x6;3$#97}u7acb1Z!+7r7+CeJR71J5zI9GodxflF z$vL*Z4Wlx7S@K)^?4~&N{Z>UYO*Pvu9)q{)j~#!Mm6w%foAo6&djGW9ep3`Ba#lSH zJu6QASFHN8ElQb=tVDkqHU7?TR1;)USnx5jZ^=Kdknx^vXE(JMNbCAGQd`v~QuAjv1nY(tnSvaMqN6IzWz7%kQlD7cZr- geMi=i_nZf0>is+YPmfc7&S6=<%@S0C=jiYM0Ml7A5y@Y--X-ui!1U%kyY zXQh%eI(<%|H79lIdms30Q`;2(bz*nBw%)EURX>#5{^_K)d9?){?VFb_SzXt8|f6OufqRpFXv^woxPs6&E9bKKVhUU#3 zF;zBZNq2KJzO^UT+!||*ZfkDu?C9$1j&^jl+@hhRt2@@y9B)S@eVskAHli*h?u~bK zk6p4Q7LPV}x3jRNt1}+k8IN|xc6h;FQ1rHU-V)v3)zP;t7Tvrn+TPh3+v%mDl-^j+ z_E-5ccqdV0Eg#un8F8>r^D*jho<*rZ~5Z>6p6 zy=ZA?tVI|c{^splgvb`x-r25-ZJUUu@#c6e+S1(7vANl<+%EOXvr%FZGI*=r*0nvR zY}ww~-4`Fzlx{CN-64`_e_A%$0mt!*bWNxvZtGJuUg!dCJ+UNRJYuOzlJE<;$MA{P zSX*;nhw=?-bRpA@W@W^Li;ig(k0xj!+{^I+#{zJK&Mpk4mYvPfws!bX`v+p$HuOVR zi`LiM5sP)B5Idk2dz^8MXmFsGZQWX1cTam~9K)h7-b-9-U$=&#B)rjRdv90E^5xOq zmgdejlwxG|Xl*-s+F`^fg|*xgZP|KDw5_?lLqi4KeI30q?yAZNwJ^6-TU}GVVr6tu z>Eb1B_Hs9uz%44hOsj9K*-#bbMhrVF1G_2gv*ga4`lq`&6J-kLlsc(HOV}qg%vtzv z%D*(^D3|*zpZ0Iaa9>c5|BoH~B(_~?+AB70Tzh*qcZGkj;R1nu+FxwAZ+ttpgpg`) z;;>KDUb4#|PV4^Q{n%0(TF@?c&JE7|cVarJH0`*3E^zRBZG6+H`O<-hqKc1uL^%g3 zP&@9yLvi;y;lby-SWP?W!H@IcPkHbQJa}jRW}S;Xc&$kR=}53NxR<|4Wr@d9=w6{F zl_ehLa&UI&#%8|a%K_WfSqyXZJR95bXniN2MvC7K*z9t0_U!t;df3Qgb z#E(~5xj)jR0OBX8tlXbyQULMZL(Gr|KS`0u{kR7|*@Hjf!B6qvPkQiS5B`(~Kh=XD z_TZ;^@Mk^v=^p$!4}OLRui4|2?V9Pq`#pGjOC+Ts4}P|XzSx7Ge!hc58u8#uJ@|SLUZ!hL*~RQd3tY6oMGIWCz(osOw7^9R zT(rPN3tY6oMGIWC!2f*Y&9^=ol_+cy+9&Yy_%Kj;6RRDS-l7lA%M z^CjGaQ_7Jeyp?4mr_SS=`7B|b@CkvRB+Ssw$dJI_AZ!wTMBpzIW~gT5K7k(~%<$02 z0f9e5m?4{yy#n7&n8)OiZh=2am?4^xCV_7!%+Sn8y}%zJ%#h4TxxhVyvj~?7{C9*I zf*A=5yqPdVUn3!bZy?N2%!nrNdcq9BjGTQBh?#2$GxRcYO5hcQ8FCppA@CK18EP3B z5_l2ee8P_iJdZF#E+h8|JdH3zEh7g69#5DdmXW;z=MiS8ZKPY^Ou`Jcj5G;s5N3#F zq+Z~^UIUn+m639R-z3bC%1D{OuM=h{Wh5-{ZwWJmG7=K_-w018tO@*M!cz#J{Tti= zBH=LMQvyFrcq-u&0zXNZp^=dxfxkhRA(4?s1pYE%hC)W}6Ziqb41tUs5co5M8TuI6 zEAZWf8S)tE7Wkut8R{5m68Lt)3~`Lq3;Y4X3~h{*1Ezm3{9X0HkKP{{_-&;Bm9zB? zRSSm}z7W}eH6JOTFZ{(-n)Y^EX>iINV8H;`fA#wyAhO?D!({oncp-+y5fE``WSl=0 zoU)g6-?LNDPZj#h#xt4wUS!~GT&uj!HGVo1~kb!$@1lZ5v(Ha@_&7?6S16Ai14)s67GHp)@RPI4l z-$4nAjt$R*DMwzwD2HKw1ZM*736>29-i6@(`&vch^C*4UTRIsY6dBydY9rRewyX@W z3=F}XJG0t?e;9fz5}Y@5rX(`(Y~)9;_n*=u8P7WCXWt5L9C|Al%Kj~cz7^bbl=**? z{QHlB=!Lg}HynR67_xo{+?&CTN8b!yIyA6vE2^t+m$kE~Oz_UkRw`^sDkC)E~K7Jex>jve(4{3rPwp6ucu-hNme-Dd*plK__7<~3D z*4m+rA_U+pMxFng4gMnru+!iX$tO4XSHLA2+yNB^_wg^^MFw`CiwyLgB^4Wg8dCbt`TAxPq1w5>@Y8UL z$o|VFtLlb-^A~`ieF)MIBt#8wVr>J~G-v=tCNKfjqtpvdCpGLZ9L5Y58F-l`C5ry9 zR|x%ENS+kK?$3TdEv|awF=>MJGn9%tLgKn>nrievp_CF;d#(Fy@SG|=XoFJUp!HE3 ze4Wi0v_5EqS1RIG8>~@aqYd7yh*#O*?*WP{sOE3L0NlwzGw{qIj)Z}49zZg1&s_rS z-;2aM0EZV2!JmkY4D5T5$)F^Ik>W_pQMl@swzf9qsz3Vc!11H!rp$eI;Kb2WhJIq; z#ktS!`*CpJFX(|bS9x*&kQHe;5g9lUIeH4S5feitCTe&jQA1>~JQNwcM=+`rKEZYl z?0bSV{m(Gb`nq72n&oWH(I*)r=DP=+5H?~pqM7T(Hn!#v2-Gv@+*U-6mCFMQTfJlD z;Bu9X3?}B9Z-Zy#HS8d4N+>334Ah7EpP}irT^mrOEP8DC%OLMRXT_&OyRR*yCP$y- za_MOIDgdhT4e2UdyF_hkS=%nuX3O3)&s8ui?NiqDDp*XGRZ2m2=wP{jVBZieHMoy3 zXj$RcK?V~Z_ZBFtd`gv^@Rr;u)8pWw$7qy+{U=#A@VQe$a_7@xsYB1HvSC$rR+YV^ z%6_WK&Z#nPT_S^b{!*2_qRRX-d_EUaWpAjmw^doOD&v+2eDA617z+MF` z=QEff&SWrB32Y6pw+i;=JAi5c>ZZuRy1OC+H-7>!#?rp?WDaeiuFM9{7RK3!_`xRe2pZA{Cg8+xE{&V{FDQB(# z%h_Y{)D^jN?xa}(wlkAeA)Fhg@)XWsp?)ASuZN-3@bGS+BZG~@kpTnbqR76XzD$_| zM<$Cm*y87Yy_x|jk zh}X+9{aKOavIShQ+&{)b@vFDapWipMYo@27zoVLodM7ybo>}j~S`d3C=t2C{<{B)Y zh<)O#o|5s2lKyi>U%E8njP(SJqq$uik_DHGt(rR;6%#;M0$th&Jt5O6em)ue`I}Cu zqW(y7@kW5j)k)_m9l@b&xR&#yT3lCC9($^P_c_hcc#@)zbc3F&Hu{{Mcm7AoqUo%| z1AVVV1{zO-3J$4ye6W1R{(5P{K>Z9jrPjv@`)_zBfD`sq7{i&cn{jwzn|0R)iP`#d z&@ADDW7Kt)qT^Sh=Cgy{%b=Me~k>@;I8u8qN-uFB_EUUvSD(Q6bw84-oJZT5#hwlZ%Zry+z0xxu z-TxjQ1+)8kJaoGMqu3>|Hw-AE2K+pSvGJ9Gdi1GC4)Hv;Ndb}2U?UuEtZj~tUQ&|@ z>-z`0zR8~YR@n93jpnHO=pg?i!8iuk%}h)!RQ>ut$oN5Dz+!+ubymjbu&AO&+swp_ z)vl=R(KbcR56f)@x<`*T;Kf<yKA^6O2 z|L&KxJu|U!+k&tL_1p4$rJp-ShcQM+zE89F?>?dRK^bcU-s)jjVf*fORn+Fc-fmwq z|Dfu&6P(g8nNvuPEo7NT$PKoTyfKBW@(7W`%`J*ttTg-&zjF*LPCqHh&VC#WR+EK092y7FuNqea^ zTY>EcHfa~NW@lvJGkeABlDAMFy_3j+&m2HvZ=r5Kg#588Zt1i$zW%CLq*cMk_dX0n z@bMuGty@RXP&iv++H4a$Ia>-IOOAsY#}aPQ2EJJ-6VpB1%V7`Y1_ac3MD6fo=hpuW zDYd@KvH4M(yJN$bKr~#ak}fpxEc$pJUI)QsXCj2AmJ`)g8^p)#4Iq0aY zGq^E~ZC{h9__?i21|xHT#pJ)gTVZ!9ET)Ey<#6=9*u&ikstDkEzy|;y0=yA$6X5#* zKL~g$;BLT=0Dc1SPHYbMid`^P25vr%ZW8+s9-{q0cmmjygL~NnYBRVI6+2EZ?ZLRQ zTjn+YYiBT(vroL+yl=e0rZ|0)2-PII5|x9OM%?(t&m{gi7P zO1?)`A|i2Iz%FL8oXioA8WxdTX@?|{UW|8(#+3vPSRnB}M0^&)VD1Jq%;lT=3)xBp z@7N2YAFFz|Rg!bKYxbPN)_e=5JX4N^=gO*gZ^ho(T8j897YBx6opt;M#NbJM1*$oN zy`IcSL_7rU{;G4Fw@wkRMnkZYJ>nsG6)2oGTN-3iIVzkZEP#(F3FQro*Y8ozrS z4-kfjq!@D$SHyZuF;(Z>CbKh9S7c?cN9R^0j&NZyuh_uda9<~Ua%g${)$`|JZES|MGxk|T z1PnWev-3ax?l8jD%9BsBok~_2SJv#os&}!s9%y`b-_UJG6ILsC)_>WoawV62*$Fte z@XbNb-HOQi=$<>_S3S2Ey)eRM1(h9#-OnOb%;_AZPE z2X*2*jV3_zYsic}@<2Uw`JaiY_Y37fec73U{;D_VMc8~}NBKtZuD{1vaD7IZoV(HB z9iN7#u&*f0ei~K^zx&@Q4DbBU(~hy(#Q%mPM1Ot(9Q{@AQZsBwpxL{(-lghP(VvGL ziJ<))^5`%Id+q0N{mzp&Dtqy|Xn~6sxM+d@dluj?Vt7^ImufxX_|{msHP+kS6Kf5t z-))8Gl+9mQRyOyFur{+*yRM5rSPO5CwRQEx!Yx~yJGaEH2+wStIWyBKYi^^U`)zCzRXt`>#lcIw(2tJbftTYvKv;Z^v>5VVSS zg?pgj2V$Zte?`|DZtm%6-c_2ZZ2%N@eoYqUPmKC{VmEba_56`hMPF-sS9o1>XY-a= zkESKW^>y+mUaq*X{Ok+T)aBMMKiHF>>4m%c;^D5g@aC?*&emR=(xsykvwOq*#Z|by zH(c9TQ$vy)E2~yCuD;Z^Dt-eM<1e8$&zXy+Rdu$`?`p#j&3of$Tr{M%uG-lir%L=yXDNDrR6iyet-Uks`H?01!)`eJkk_ViNwl-&`ULaJ=K%1@(z#!r zKhG`k6Td!x{uI)$pE`e@&x&6A?fLWNNEiLb`SVRk7rt`-{9dGe*hhUHX(l$l&mrB2 z9q}tjk0IsneW&4YFazm7Agx5I<7C*1bQjV)kdDU@`}0U2#u55Cq{k5{8Af^&B4h#V z3jY5+VNM;TRdYLu)=#2 z(gE0HDd{S5LLW9(W~Z484OAiJw*r0dZ_b}zi_|SQRl>b%A!$3Wa z{|~{&l|D~-q~A0z_qj4oq38wdrtd+TsN;ZJuA!~hVDnjv)GarwbrMVjDhzxF`l~C6 z|La+E)X@*9)NuXD?rQ2r;BcO;c>am)9jdteSEx!-t_n>@dQhBdiK7{h$ zq5S@&^22WVDU^4@ukJ>gXy1NmUzj}Tn^W+!iQYb{f(`Sen>5nQK-o$7+$X#;Xy=cJ z7_n0XG!cX#cYEcSJKetK8(?2RMD+;kbbP`1w5#WxD4!1hJ(^Vhv|Iil%AZ4dUs8Fu zTYennB{;*qmsI{2w|p4oe@6MEN#$RYa-uF?7cFqn0v9cC(E=AO@c**~obLfRzyIfw z&Fdw5zvsaGW&y8&N;EC3GKllbbtj+e;bJh8m-F3$2?}(76F=UDo$n8D&%_H`IJw?= zPi>us?E3g(H?K!*0>0SIi_uJ8&N*uw_jI@rv6rjZPQAZDC(35ihNFrA%e-8Eo8Q^r zrrUV#*Lm&a8{N1Z{C#%A9lcMgVlBf?o%->bp=2^E)u$_L=PQPfUkK5_s<_nDLxB<2+g+!^%(PtE@O$`+6l;a26Yvt53x7t+Ee-(L)V2GfnzMurdX1FZ8aaGL%Q<_cZ^9OM~# z8mrS!1MSm)&T8~0(SkJnPUxPl{}uFpy$Av`^gbw@sTZM+Ed5ugKA@ijZ+7ShQN>*01?jjRT=Dk1eHTuUzAAJ-^5z$DOM8k`2~MH+UB=3*Cm%yu7W2N-WLq0LNw!~+?awZo zY_lCQ-kj`jlM3F4Lh58xTVd;P1Pk#s;)a}^ZF?qFImj{_$|Bi^`T0#Rg>-g zE}P_3HI(JM9k=ubAuVLX=?1ETgavL)sMdwzGaIYDY>Ghuq2B5D!2e@`U6FJThR{4n6mKci3mMf$`C0b~&f zehqFV<29qE08>inYWU)9`U3Qardue}^#yFIz5?EE>T@w3b^V9H8~O~~O??VF&8L4C z^;-HacyOBj9(+1ozX6zZ{W{d+*Xw}K(2qb)rv4Nv$OV)@=j*f4#!~$q;1}q-fhp5#V3~#b-=STL^v7Va z#hNb)5gGTGUj=RP&oCj}k>S_5bjzBPk)hTcZQ8cxZY?9APhgQx8_youg#WUZYnf!s z$kEL(P(c&Tl8(!q`E9`Zd8n%CUj~V;*Fz0M|31uR>c4`jKD`SnS^CrHf;9b4P$FIb z52)wYdnq#XEl^_3ydG`LTw}IDT+Zw0vry*d(C+|PX{al+C7<D+wxf8*UZmC zn2*GnTg`t4%Ey-?v!+hUgvc!B&G(3%fqDX;nZQ2HE?^N6zF$C}z~@3sfiSPcEp07s zhTPO(C#mlYqy+8@-9)NpQf+ss+MtjcF23F9)a<^zqrl{>g;IB99}ImNgceuz?7L-A z*Q^^*ZT81=SpfS|(6{kl+1E$5>`$1t1Cvd3&H!$6az;Y4X}zmq$eh=6A3+70bqyMo zb4CEaH4e?sc|$f4A*+RCzssOz1=e9|^LrsH_TP_o{#N`vH78p!`u$RMjw%cJx!1}G>IKIkyx4yd&C3bt1$3Gj{%fIj zPOjp6(BDtWJUzsgJ)GW*-D|!sYL@Bg$Ed9$T%xC!q6vknf@OO8x8PVsdhlncpj=P? zA!-<>$|8FDI`9?ih1^8c>*;?*Qlg7zY}C^q2H$wa*QBTK0p$cemlofur}v?TiFzS- z2pxL*KJZOawRh|3uc8+wD=4m~e-bV-ML|3D^h1EcdI@c`S5Nn2j+v?#e;Ux8diqX4 z)6_sZpr?NT&~&}%2+9uOQ-Y*1*^TBuGWRCzlS!NB%+SpxKxaP)bS8JdIkWZ9G19z* zTiUC*DTkCCd)1zvzljnbx0k_lGyjZy7V{Y)-#;K9n1y`KlOp>cV2Nxr>2GsED?JA_Je7ApZm zu7IO#m4NjivU~QQk50)F?9~r{ z5X6Bh5Z4!paSv|QX1@Ye^~$v1EQrUoRwbH#_%RR{wP=;or85t19mmad<)xfuje||v zoU`x^eNvipLX}5~DANyvX;PR>=E388#ytXsCSA^+RWQxxm!&?Z%|E#|?e_lV3% zHI!){d}L4H3Dh}TW*GC}Pxl03z+Y;EC-($69hJ#sWF9=VC-6@IFSAR3iOFKYWX!Uf z?&k-!FOgI9Vra}$^yu?JMvQZx>g+{%0eooIY|g5>Q3w&d*tHuLlSzUL`PowIY9x9lVK z``w_K)u#QqWru#BRIaKz>VHounpCnQ!7zud829!LGqRvx#Z zIgi_=zN^7sB*$$wF73l#18m4~+mPe7A;)baEe(>5(;)E~a@;oLxNXRB+mPe7A;)b) zj@yPDw+%UN8*dPfvxBTETicn=4Q6W_$17y8D;r!b7Ll!LwtdD7)g4Yxt`>5Iv4U@ zz71f=>D-XhxuH(y7EkBtx0)Y9@wDS`3X%SEod+4C6R>7ng8iayybpC4#>dcJ(`YH7 zv3D@=VB|xiG~*TI(~V1^jo)|`G#SQv@MaqS1j;NU4W$9&SHNT&mx4aWSOA)!F%2?9 z#&>bgHJ$`-o>2hGeB-mY7Z^W7Lkf*ggTBbP38mwVWsp{E)B;mtynxd2Mj!GMwCNI7 zNPow;A6lm|tdNed!Zp%g3@cz&7s#K+utGY*3M{k33h4+du(i2lo>s*!qQxeeI_7pm z!U~3j6%3i^jU_1b84^}7B&=XaSi#r_-z_&Jtgv7LST$XR719w_c$A_gtUy=ZVy;Aa ziG&pl2`d;9Rxl*2P$FT45>Hqm9bttWa99i__?L!nLcT!43jXW;VT>u0GogP|)^{OX zGmik{zp3CKF)sWj!wUZQ2c7^BG8tCzHwBIZC^i{Z@NW+M3P9LoSiv7FVyt_P$*_Wd zOP~-ynaQw%zdbM$z%r9z1^+F9D*%+k>j89*+Xx_HGOXb54zP{&Cc_H;p1^J-8%>54 z{PDou0GdpO75qB_UjndIE0VARjqP7v2c-=OD;OUILN_F=U`SZOP+H7X z<5}9z1GI-z=q-j4{MD0BqAZVji(v)-+RzBueor<(G*E1k%OgkQ2C{XzY?4#eP?p88g1Ap>EBZv)6_xItYAo3 z!H}?mAz=lB>f{*`Rxl*2U`SZOkg$RwVFg3N3WkIg3<)b35>_xItYAo3!H}?mAz=kW z!U~3j6$}Y07!p=6B&=XaSiz96f+1lAL&6G%gcV>cgcS@4D;N@1FeI#CNLaym2c-)P z2`d;9Rxl*2V5qQy#jrx=J?3{{_vsQ=$n@(sqJgruW+JTcV~Q_hSRoT(1s3_VNi@MN z_&<3i3a6;JLMGx03xO+=xB`1FYv%U>8xmJAB(7jcT)`mPG=7CTeTKvp42dfk5?3%J zu3$)9p+v({x zk{@sfrcRoQ`6@SrTONZ8KISaO60$!t;VKqg!XhFp1{bnF7g`5|Z#{1Q&A91uQ$wDl z7K01f_l5ZGq;Dsw_PbOxf<0({fb2|`SPV1d^yP5}Qy^i6oP(k7qrl{DCg*NtaFbz% zoR859`BWe6h5Kp&cs#wbG&Q3moonAT59L>bsF zH_AXI6Hx{dCZY_iAQ5GF4;3V$3@l4T8MvoNL>cHOi6{g45>W;kJP~E!h9MDUVC{)0 z1EEBeflwmKz%iDHGJG3QBFeyVm54HY2W5yd_(9ozH{EmW(RTq9&bzwN|A@U8Wva+-p*c%3qDri~Sm$|=uR&{8(>g?~S&aTul zsY~!V-Q>9^mkMRJV8aYk0D9xQ`g( zIGS?CI}PRP%BcoaStzX#(_`?X3MxpONBssBWVh=sLtJyB(ssWgt~p0J<3AX-Gky$; ze#{8cRp5-Puq!^GAh_R803B47+wOO_g5Z7(m3`chk!HK!Ck&aU;C=zs|%!`z7G7CUXzfSr#Y&u+>~ip5=kL0J^n>bM)MjjC;Uhawf|iul!1;)7%N7j9;eH z+=&8&Oiop~lf*fSP0ne#lf`ci&t{KLp}E8Q?60HxF!T7zj8LQnLo=yv6BMS~L0Gm%ODJ>*AeK-@e+U`^J?(1e}l zdGf5wy9~fyvyeQs!8HJGH;Y(lo&O{V`ps`+C!P1c;4pwY%?Bu8Q}$;;cEH>~0XL3& z6Uia-espNwO(pLFxX=6{fty902hA_Tx$@qh!O80pa|R6(&76(_^o02oZO|mT4VjxM zdb3{#>vMQS4LSMgC8g++MOU$uR(-g$@i$sCw2WBCN!J*O)v+S zDyn}^rV?-qbyKUsYsdx}W6k+ewh2S=zb-c(X>~5(csxX+KckCtjtJ3Yhe*pAq6u1b zY4?>x7qPy(!7xP&ejJ74re;&U_pwX{LJmW(MF_nTYA2fIp#B58Gq9wHA)(ud=1ucW zL}AV?=-l7~hBW&NEE9A65tFZKMlc@)*{7uZMYmkcl4xtr_tApjgG$OfE)}N%nG5s; zX_#^Ez`Qg_)n#z!tOkAXYl?Rv(V~IyvK=1YoI6-enX>+Rmo(8mVLmd*eyqhQ(#G*A zLkO<|Z6``rg)pBYWdH0V37R_6OwrRm#vR5WD*PuS``5(F0LV#$ zfWoh+f%cycT8*{|-@?>WZT#d4REg_Rm7qzhfzSF1^r&O>EcJ z8hPv*<6sBkdwVc0<{Cd+u8QAtW&IGc@>@_el_oO|MzR>&pKDyfEt_$$Jd0tmxyCAL zYaV>!whY$0z$jMrHf3-Fxkzo1jDuSXm)mL_vMYcZON|_*#!Xa%erz<^YV^5kTmq@m zq@Xd|Zc>H?(FJPSLK_M{ZZplanU;FzwJAVe{x4{Y{=?n=Kc+h^y~L8 zP=fDQ2?Q^|!zwh=ug_79+=xc{^(t=V;YZR)zh0w;NR717uV2qL!USU445x`rg+H*R zZ?vUnd<6cRt&dYqxfPGW?}8R@&$Y>Rx=MTHx)M6vX|Jh161KJ9u4LI{>|g1s<_wHV8%qz;5W7g8%2ZP z*cvp52EP#vFb9bOzjYKS{JAa6o&dB!5q$Twr^;3E*_YPXRG97L(hu)YRlc;;HoR2% z($%Wbs>+vYl%-Xb|Kd&zGk6a9Hiz#Y<|}bGx?&%N*bsg1+cJ7F`_6+aJSk(1V}Aw@ zG)Kt0*XHeVd4KEh9Wy^A%)@(}G{gIIg5-SmwCp7d%mDF9AB zZ=1Gm!u`;VmHBA7Wj?fAFUocvzgGHGrTSsiS0t;5dGOBN#qCVvb*pnvsDGZP>B`@!#gL0xFIzU z-nTozea6HR9$C$U4|4g_=V)fmL~J<>ORL5#jWcxCR6ldRB9vT_b!FD_EP{ApAptG} zLt3FeyM$Z#bSasdbEQSfWiYnird0^gX3WsCvaZSE_qH-^u~LRvBp+h0f=dRLQ2tb1 z)n`EM>{+5wPQGsDWMwH$SYOZw#5Gx2Q+?I>f}NT}bVynPBj%Rs*OpLL5E@NQn_Y61 zsF`P@v#96nlInbg&UevhXaZf}K__Gsvdz``tggt?On;KTTa`LmxDHEpT>UrrQ`154+5KKD7HYqlI;X-XT zEI3sR0P|0S`TekrYyRn?how+dV@9baCX(J&jmA02Z88`;a}u_gE|b}pamhS=C7{0?3>+O=%&V_!So=Qw7D<5E&Ymm2MSPLH_+ zV|Zc0b#vVIfIeZKpo>oOppYY61`un{RSuo!xO~3jLT>d1uET(d9aWg6)1q)Uuj8=W zl;4bV>lT%iOBXwG-I`0Bu`xd3z!Pj%3^_GSyj?dDrW5aWRh#5^=w$IwdLSJ%>?#12 z+_5&b6hl-Ej;YzROT3b&c^fh{-5mkSM>))$u`(l}ppspk?-exja+w}x*}knty9_c! z=~#O%t(2i=B*zuq#wN>}>*$NRN9jAyv4m^POD-IfmnH_|d^J2v)tFr1jLEXmV{&1> zp2ZPqcl4r!n;IXP&4g<${v$KR!X`;uf&UHo&uzqQ_;2V_j35Fw&UF_u`X_k%N8F6Z za5HyvEqaEzmw5X*Z?Ew7JKp}nn@JLWebOx9?GoI4)^&Kt!+F)poTwYK@+|+bm2uFr z{CE1Vwif%pZ!OdepYC5{y^pDJd7iad5La0lOrNx@d+`p@BbIf*D#dFI*27jA81bu! zMgDiJGLpPvt#Mdy9L?(gnx%t$shQ>9Xl4A#@++Aco0z8gU$*qLJFL((cUU<@Y_w+f zSwa5-ESrG9VeRn0;Q#(>r(Zjb%L<&f^i2l-V6)Db$Y|(C(C{%0olZlqh6x;FuR%V^ z;KfUU(d9;i8#K56smi86i*d1w);bvJ4=o4peV;1Vh>^!UZv=#bSYtj+RZ_LQEruAD3j#!~KYl;7> z*35^kfd39F`(CTWn4WKCKWt6xx2B%9vVZR1Vin(D`Tf(a?1NT-7JJ3Y-ehHf3`PDM zttkhs3{vIaY=w?kC0nfABUX@fw_D*ptN3B85(4D*Sw+TMdcKusdb30XSpEtI9>-85wI~ z6rgunS+7|c3#`z8SQFxwRcmE~MuY`+z#pvHW=5%HJ^k7{uf6t;6?m1XxtCd)Ps5he z3an6{m9fLZ`xb$>SaKbSi=jcF-wMYq|9w`*7Q8Muy-3`&!OXY{r3)+=eEJqxa(=#r zUmRpyiqdN=x0G7nXH6x+94|q$Vu$T*e{QojZMU}GZZ#dSrb6ZFQfq3PmEphF@;}3R zDfC+M_+Pcg(IRoDdtj*v53rRq4ZD5v{Z{rDXsf&%tdiTUnf@bIU=4e_fTbHAux_~B zY6Eh{8jS20tm0?f)@SduGSK=zTC-ULhI6eIc$%hYRHi`B+(BisPg_$_A9TCX%IL$- zj38GbvTn3B@!;xjv@B5j+pWUe>0Aq;T8{C8UPyE~YBEc$QdYRen$F~9%X+_>6-VFMWfZ2aq zSqY6L=W(kZiRsU?u4IaF({Igsz*^vc*vfsQ$oG$)G^xkGh;f!8d3tyN}baulFTzHeo1w?Yfh z>nE*(-&nJ6S2O%ZRqp`{uUFOM^ni)u>QP>ov5A@%-)QCTvvR&e6HF+xrqSDuTiI)z zDP~TMRd%m+`Ry>%acef55VI9DHp~x{T4Acb#u1Bo;DB|-Qp^98mG@OEBW{%}u)?=n z)0H?hDFG}7qq$dg(Hg9hw18E36B^NvACnj+X8HPx=*mb%ZEaOew7zabbwhPsZM33s znqk*Y0ihV+B%xI^tuqgZ-s9}MdQvF%<%E4mRM&TUlfa~ zPoim?n|otX^?fr+t*(n!T~}4x5UsAQZ*0(-x8s{+&70dh+T**TTY9?sy2p?tA5hb_ zb#=DKyLzI%U45uSRA}DT-4ToScE?&o;fi(jHC53K3zx2_8nbB)b@kCz>+4YYN@!5E zo-*QF@qMw@SZj1!b9*O0kToXfy1LprQn%P2YHQxUgZ7VC+|w!=gkKhG6y>xsp*_^$4lG=LW0(72(#sJuA*V_q8jNXSBt(Deu_->PBhwwpCT`VQc44SODu}7 z+QoaicDWT-*IrjqQ(YO|&`{AJl0-qJD^$6_Q24Ogmd@r5X*oW7hp&-Ep(MUE*42r6 z=s#)6)4|H} zV`)x5lp1QPRy9Zq;FDDw8={R6i*dTL0lnYXN&Djae)uS04@JAa5bf*iiM5T{@`Q&w zqMc4yya=5jJvvt3Z>VaBuBuzVuA*VXm~z#qSzo<6(m+)%^o1SG?P6uSe)PIyaCym!p%HdI$uMV%J7wq93XwR%ysqGDx|#T|d|?25Oy?MfKkRs_R* zU3D!yx>9RyiMMZ$Nws2$?QmXpkE?P;V?*7B`ikpoy=WjKb?d8dKyMQ*v!c_wu{w7{ zQ-TP>5O8)ZfiyxM>&Q)@|3O^2K2%)t=iGma?6+oO7b43ix(}4N-wj6oexTG z*5ccvm@-C9kZP)MN1)8$V>Kq>Pj27aQ{b3tDK}xqMe9~M;|DEs`e+L@lPOWwjm^8F z{3fJ^Pe6oMF1&p7S0KXkx5fK9V^?p9b;f$yTL3oqv~0b4=dz{qmo5p<-y*%CrkHgV z8?~0^o>ooGb4!<~3CQ)FhV_kAk;;VIs8K3&uSYwzv?VVyO2e^CleCc7%UFk6mfT5y z>|Ui6n!DRs=op4wCWf*54W^L~YkFziQ7LAhfJfs0eslybSaEEUJnR0Wr(Dp;1PKvpE_WKMkOU#xQM z1TOm3wbcz8hU2KY+3i_-Z6>{os~WxbB-U$ZZC5kQ-}l*b^XN@rVz`c}v+XEdJ23vD z+qzo&;ND|d++EJxPH}atY}kqX&u{~GAdfT`Zn8>h1$cam4X7?4RT#$19!-rCG1%N-XT@k!_?j@jGhHx zbMIU?mQFRRL|3ObWZ_6*5LtzxgR?!BnJY28-Cc@|^RadYeb`m2RZJ{~Z9#)$E{MHw zCxP8_k80-VzTqs-4pei#GbF|oVy~!l2e^Wo?um;=Wsrz`QKz=5;rhDuYdu}gVJIsD ztK!&%!tm!!9ujxQiXB8>Ol@J@O~k5->f|jV)rOLe11n}}h#au4kFINMsEV#^Sf9*R zzjB?Ywe}Vtd$`sfY+__Xh>fA_y7|)qcP>`*@Mf)9ofdkxVy=-%*lA8@uH`_ zs|Uv}wJXFYq{Z;iROTpWQw}!QBjv-z;(?>P#f?$SDEHBFf$$#KV06f?oX)GO22OA~n(jcFj3q+FI3 zrd*d6rd*g7rd*j8rd*m9rd*pAE*In54yk4{*Cj9LLucrDeFGk`y0Ko`ZVv_Ybft_M zd-h5Uy2?%1SyZp|j;ssk0cQ+4n-Y#Icx{TVT9mS@7NzW}MJc;#QOd4bl(It>rRuEhg{`+4XRTOgt22zbwQ1>Mzy`sQmd)(Qy85d16%vkecC!?{ z1CtV>M+h5{MzpD`tEpJOx=Q4(f*WXFYtw_)LGNhPgO;eML0_K$}+9RBb>or6U&WcIv6EtE_0KNY<>ft`=*h`?>rL*xNhg zE9=&+tEjEi+=F>OdZJV+U<1z*FDYsp_zcMhRqO*#EYliOQkQ3>im*B%6ioKsS3 zY^PJ(bye#(AabY4;)M1`C9q*j$BNL)4LV%HSqWs*6YD{VnhX)<>cC2@MOSp;jSmlD ztf!|_cA|;ySXoiKvZ{u|joNYjPTo+t#})a@08#$60HI_kE!rLL(Y7}CIx#=!Q6UF! zF`a9xgfEbr4q-c5uj4Sz9|WMT6fBV{y2Fab4VxUR)Yc(xQdKLK0bN486NKyC(H?Kv zs_cnMT5t}DwR)Scw%l#aeI3f`j^q^;l`0a}8|!F;)fx9(q}gk3qP601h{#}Mv?lEw z#r`}ADjUg(*NH{370x6Y?doWacD1!}bJx<+IXM8Qs>^Mi1r^->YHsB5mk} zKiPi#>la&o{Q1JK$!x|-c#>+B%wYS&k-YTTfvS1PxT z(XHwRd(Nd3Z0>7I8k5y^Nv^C;tL=!;wl{ZRf^pR0=ErMcOgCE*$#jp^tgLRuhPs+6 z#2m3tbGt!N@YoU4dQ~Wsy*8?YiISm|Fmf_g($=4qt*sWnwylMEYeQpwecgJ_S_#?i zJhiP0lNj6vGg1%F58FC;aEA$7>CL^^Pon44*hn7dz`0dmPONU&g!naNq5ZHVgTOMC z+BA)|YisKec5=ryXkZOam5Hgx`9mFWg$t3kp!)T74RtH)YBcQSJPycdL^`p#<(9r~ z)sIox2eBdu+`uk_Mm@^x+tgG+<9cQgX{;Mt5f?^ut+t}Znd4+WgC=!rHB7;+h~;0{ zJ?cnGe7pxUPgjpp4Bka2-e&(X680%(IM^A3wGBJf&UhPz2?wSQIz_w{kYi(TO7{Oa4EaYh9=@&daktuzqu0~6^(W`x60mz?WkC}vTDNyP0gM3bbC6PuUa#|o9kgS|9nho zi?(2E*S6S#oeNf8a>)Yx?UG$mxWHb>7Q}YSLfxw^=`Y02Rxk1h>)6*an7#uF?azwPX&;*=U1Gd z0H~t_GHzFsLY+{MQ?^6~_4Rb|p;H`y+PES%sh%DIL$$h)mX;>W0e9?)!B(ZEswo}q zn-^?pX<2|^W_0P2`Q0t}Q#YM`JLhld>|3BdhU=J$;^3T+=h{{YV@1+nZiu8>jFK&? zeuyUnhZoZS=EAEL_yzPI&yOa<>#%tHrbKf-j)hnM{_;m`{OC8UAF%PGU;F;LjUWAfJGFO^v{rfbgY|5XQ#kdrocDa z{xJFnO0B?$6Jp)m9^gY``1znMXY`Mz{!#EQyPG+l0{?mnJU<~c&E-yH<^n&KeO9Ev z^P{w5(cdQc9BuS3l0E`_E?&6Z+MKA9xsRui^TibSXHwvQYRhjLCI2@m=<#a(nEIEd zz&EDA??{2?hkVDfkNiFm>&0k0d_4vIPg3B2p8}toVjjC%@HrR!L?e=dp6d?hx6xnV zyD2$~ zdo2C=jiRye^@7j2;MX-b*!a<(IgAo-1TLHm)P`xyJ)^T-a<*5aH#aR#f&KCfw%G2b z4BH<&ij>%Yk5T9x-Nq`iBMzft1NLT_CkD3)R2+@s0d=%0f>(#|JTw}qT(3n}*VL`3 zs6nWE72lj_s91sbjuT!!-}P72D%FDLAJzq%*WDY?D)+ z%j#)s;yLG7r57s8Ab666J?C+WnXxfrHYFM+To&ua@I=j3D7gneqG`ciS$R-*^7vrgUB^+Lb zdoQRwG4Ne(Pt|ZY7Y(cSc13ZdZ&gokFVwkeMraEZRhL)k}6^oea== zDH86VY)=)GNosyHx*6{Xx{v-Yl+A|&u53JEk0XSHpvEmx{xMls)Dn)m3zxm>nYee(isyI)1B#B{@UOsVUBtNrv1zfI4s0o7^PUT{4u})OV71AaV)+91J zlAeT%#w2`ihpLi`FdJ-cQ8t#x=x!-~cr&^snE#yVe)M9Ih&poh)G*N?sH2tk?%IY( z7Sec+O1C;W#3^Du-CAj9S3FjV$U-RtAF&=h@lBvM_qBJl&TntEQ57qy=i}vFO~?_% zM--!VS0}1aDdI*_;yiBf0#TIp#5$VEVCT9!;##SwS;`kX}#BU z0N84|{L5^9CoT69Bk$}x9rRLUy!<Grn;hF%xkl^H?KFM|=(gYadudL3+^(sm9%e>cdh9sgOSQ@``~ z*PL|RD1}Gc|L?)ezisC5JAcp2N!w7)%hBJVbJ9I15$Vfg=VBfE+_pGATPfYpK{VKIt?AgXM@^TNAWxHCnvSd z>5yOGzmMAduA1dGsh!TT{n^I4_H*E;kfHt#zY|Y%(&rpPI~{Gm7e?`)U8xA2)c@bq z{}Yho7x6L%$m#q&!=ZJA68){91nl_1uTc=hf2SJf?;RfhAM&38FMY@1cjBWbZ2q$} z4la&gUQWGE|Gy0!NgV#6D5=m628?mdQHgtZ_??u$I`r~8aob^=AD{e7x*R?yHBj#5 zcjCAk->29dJslwqp9_PTI7fdcKCsp14?Bc*IvUQl>n|Hc=kRlV@m|!Gmy;IR{0f`6 z_uKV1B~X%c_#E`i6#V~T^Y5DPP^xq^|H2gfH}R*uxQgA0MZu%_uT8-p->2wrb{t26 zZo6$zTWj-=w%?EVD^^^U_%w+3a_V=|>r(I+a$>^uv_q&sw|)oB)EWCWi6kcK^&JN@M>``*Tz9fAtB)-{vT)Kv#bo)czOrz&bbp literal 0 HcmV?d00001 diff --git a/v-0.02/examples/volume-change-pulseaudio.c b/v-0.02/examples/volume-change-pulseaudio.c new file mode 100644 index 0000000..aa629ab --- /dev/null +++ b/v-0.02/examples/volume-change-pulseaudio.c @@ -0,0 +1,101 @@ +/** + * @file volume-change-pulseaudio.c + * @brief Change the volume of the default PulseAudio sink. + * + * This program prompts the user for a desired volume level, displays the current volume + * of the default sink, sets the volume of the default sink to the user's input, and then + * displays the volume after the change. + */ + +#include +#include +#include + +static pa_threaded_mainloop *mainloop; +static pa_context *context; + +/** + * @brief Callback function to set the volume of the default sink. + * + * This function fetches the current volume of the default sink, displays it, + * then prompts the user for a desired volume level, sets the volume, and finally + * displays the volume after the change. + * + * @param c The PulseAudio context. + * @param info Information about the current sink. + * @param eol End-of-list flag. + * @param userdata User data (unused). + */ +void set_volume_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + (void) userdata; + + if (eol > 0) { + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + // Prompt the user for the desired volume level first + int volume_percentage; + printf("Enter the desired volume (0-100): "); + scanf("%d", &volume_percentage); + + // Display the current volume percentage + int volume_percentage_before = (int)(100.0f * pa_cvolume_avg(&info->volume) / PA_VOLUME_NORM + 0.5); + printf("Volume before change: %d%%\n", volume_percentage_before); + + // Set the volume based on user input + pa_cvolume volume; + pa_cvolume_set(&volume, info->channel_map.channels, (volume_percentage * PA_VOLUME_NORM) / 100); + pa_context_set_sink_volume_by_index(c, info->index, &volume, NULL, NULL); + + // Display the volume after the change + int volume_percentage_after = (int)(100.0f * pa_cvolume_avg(&volume) / PA_VOLUME_NORM + 0.5); + printf("Volume after change: %d%%\n", volume_percentage_after); + + pa_threaded_mainloop_signal(mainloop, 0); +} + +/** + * @brief Callback function for context state changes. + * + * This function checks if the context is ready and then triggers the retrieval + * of the default sink's information. + * + * @param c The PulseAudio context. + * @param userdata User data (unused). + */ +void context_state_cb(pa_context *c, void *userdata) { + (void) c; + (void) userdata; + + if (pa_context_get_state(c) == PA_CONTEXT_READY) { + pa_operation_unref(pa_context_get_sink_info_by_name(c, "@DEFAULT_SINK@", set_volume_cb, NULL)); + } +} + +int main(void) { + // Initialize PulseAudio threaded mainloop and context + mainloop = pa_threaded_mainloop_new(); + pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "volume_changer_threaded"); + + // Set context state callback and connect the context + pa_context_set_state_callback(context, context_state_cb, NULL); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + + // Start the threaded mainloop + pa_threaded_mainloop_start(mainloop); + + // Lock the mainloop and wait for operations to complete + pa_threaded_mainloop_lock(mainloop); + pa_threaded_mainloop_wait(mainloop); + + // Cleanup and free resources + pa_context_disconnect(context); + pa_context_unref(context); + pa_threaded_mainloop_unlock(mainloop); + pa_threaded_mainloop_stop(mainloop); + pa_threaded_mainloop_free(mainloop); + return 0; +} diff --git a/v-0.02/examples/volume-change.c b/v-0.02/examples/volume-change.c new file mode 100644 index 0000000..7b6913d --- /dev/null +++ b/v-0.02/examples/volume-change.c @@ -0,0 +1,79 @@ +/** + * @file volume_app.c + * @brief PulseAudio Volume Control Application + * + * This application provides a simple interface to interact with PulseAudio. + * It displays the current active sink, its name, and the master volume. + * The user can then input a new volume value, which the application attempts + * to set. The result of the operation (success or failure) is displayed to the user. + * + * The application leverages the EasyPulse library to communicate with PulseAudio. + * + * + * @date 10-08-2023 (creation date) + */ + +#include +#include "../easypulse_core.h" + +int main() { + // Initialize PulseAudioManager + PulseAudioManager *manager = newPulseAudioManager(); + if (!manager->initialize(manager)) { + fprintf(stderr, "Failed to initialize PulseAudioManager.\n"); + deletePulseAudioManager(manager); + return 1; + } + + // Load available sinks + if (!manager->loadSinks(manager)) { + fprintf(stderr, "Failed to load sinks.\n"); + manager->cleanup(manager); + deletePulseAudioManager(manager); + return 1; + } + + // Get the active sink + manager->getActiveSink(manager); + + // Display the active sink and its master volume + int active_sink_index = manager->active_sink_index; + + printf("Current Sink: %s\n", manager->active_sink_name); + + // Debug: Print the volume of individual channels of the active sink + for (int channel = 0; channel < manager->sinks[active_sink_index].channel_map.channels; channel++) { + printf("Channel %d volume before change: %f%%\n", + channel, + (100.0 * manager->sinks[active_sink_index].volume.values[channel] / PA_VOLUME_NORM)); + } + + printf("Master Volume: %f%%\n", + (100.0 * pa_cvolume_avg(&manager->sinks[active_sink_index].volume) / PA_VOLUME_NORM)); + + + // Ask the user for a new volume value + float new_volume; + printf("Enter a new volume value (0.0 - 100.0): "); + scanf("%f", &new_volume); + + // Set the new volume + bool success = manager->setVolume(manager, manager->active_sink_index, new_volume); + if (success) { + printf("Successfully applied the new volume.\n"); + } else { + printf("Failed to apply the new volume.\n"); + } + + // Debug: Print the volume of individual channels of the active sink + for (int channel = 0; channel < manager->sinks[active_sink_index].channel_map.channels; channel++) { + printf("Channel %d volume after change: %f%%\n", + channel, + (100.0 * manager->sinks[active_sink_index].volume.values[channel] / PA_VOLUME_NORM)); + } + + // Cleanup and exit + manager->cleanup(manager); + deletePulseAudioManager(manager); + return 0; +} From 493f734d0d263ac39907cdad3e8f51fa12a2da5c Mon Sep 17 00:00:00 2001 From: NMagic Date: Fri, 13 Oct 2023 21:38:14 -0300 Subject: [PATCH 02/20] Add files via upload --- v-0.03/Makefile | 20 + .../pa_context -- interface overview.docx | Bin 0 -> 33970 bytes .../pavucontrol sink update flow.txt | 41 ++ .../pulseaudio/introspect.c summary | 79 +++ .../pulseaudio/mainloop code flow.txt | 17 + v-0.03/easypulse_core.c | 659 ++++++++++++++++++ v-0.03/easypulse_core.h | 81 +++ v-0.03/easypulse_core.o | Bin 0 -> 36432 bytes v-0.03/examples/Makefile | 19 + v-0.03/examples/error.txt | 103 +++ v-0.03/examples/switch-sink | Bin 0 -> 48016 bytes v-0.03/examples/switch-sink-pulseaudio | Bin 0 -> 50272 bytes v-0.03/examples/switch-sink-pulseaudio.c | 62 ++ v-0.03/examples/switch-sink.c | 70 ++ v-0.03/examples/volume-change | Bin 0 -> 48160 bytes v-0.03/examples/volume-change-pulseaudio | Bin 0 -> 50304 bytes v-0.03/examples/volume-change-pulseaudio.c | 101 +++ v-0.03/examples/volume-change.c | 80 +++ v-0.03/libeasypulse_core.a | Bin 0 -> 36814 bytes 19 files changed, 1332 insertions(+) create mode 100644 v-0.03/Makefile create mode 100644 v-0.03/documentation/pa_context -- interface overview.docx create mode 100644 v-0.03/documentation/pavucontrol/pavucontrol sink update flow.txt create mode 100644 v-0.03/documentation/pulseaudio/introspect.c summary create mode 100644 v-0.03/documentation/pulseaudio/mainloop code flow.txt create mode 100644 v-0.03/easypulse_core.c create mode 100644 v-0.03/easypulse_core.h create mode 100644 v-0.03/easypulse_core.o create mode 100644 v-0.03/examples/Makefile create mode 100644 v-0.03/examples/error.txt create mode 100644 v-0.03/examples/switch-sink create mode 100644 v-0.03/examples/switch-sink-pulseaudio create mode 100644 v-0.03/examples/switch-sink-pulseaudio.c create mode 100644 v-0.03/examples/switch-sink.c create mode 100644 v-0.03/examples/volume-change create mode 100644 v-0.03/examples/volume-change-pulseaudio create mode 100644 v-0.03/examples/volume-change-pulseaudio.c create mode 100644 v-0.03/examples/volume-change.c create mode 100644 v-0.03/libeasypulse_core.a diff --git a/v-0.03/Makefile b/v-0.03/Makefile new file mode 100644 index 0000000..b1c5107 --- /dev/null +++ b/v-0.03/Makefile @@ -0,0 +1,20 @@ +CC = gcc +CFLAGS = -Wall -g -Wextra + +LIB_NAME = easypulse_core +LIB_SRC = easypulse_core.c +LIB_OBJ = easypulse_core.o +LIB_OUT = lib$(LIB_NAME).a + +all: $(LIB_OUT) + +$(LIB_OUT): $(LIB_OBJ) + ar rcs $(LIB_OUT) $(LIB_OBJ) + +$(LIB_OBJ): $(LIB_SRC) + $(CC) $(CFLAGS) -c $(LIB_SRC) -o $(LIB_OBJ) + +clean: + rm -f $(LIB_OBJ) $(LIB_OUT) + +.PHONY: all clean diff --git a/v-0.03/documentation/pa_context -- interface overview.docx b/v-0.03/documentation/pa_context -- interface overview.docx new file mode 100644 index 0000000000000000000000000000000000000000..6cbe2d09c38dfcab843409c88d5b9d8666c90192 GIT binary patch literal 33970 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 literal 0 HcmV?d00001 diff --git a/v-0.03/documentation/pavucontrol/pavucontrol sink update flow.txt b/v-0.03/documentation/pavucontrol/pavucontrol sink update flow.txt new file mode 100644 index 0000000..9428de8 --- /dev/null +++ b/v-0.03/documentation/pavucontrol/pavucontrol sink update flow.txt @@ -0,0 +1,41 @@ ++----------------+ +| pavucontrol | +| (initial file)| ++----------------+ + | + | Callback function triggered when there's info/change related to a sink + V ++----------------+ +| sink_cb | +| (pavucontrol.cc)| ++----------------+ + | + | - If error, show error and return + | - If end-of-list (eol) is reached, decrease outstanding tasks count and return + | - Update GUI representation of a sink using w->updateSink() + V ++---------------------------+ +| MainWindow::updateSink | +| (mainwindow.cc & .h) | ++---------------------------+ + | + | - Retrieve or create SinkWidget for the sink + | - Update SinkWidget properties (e.g., volume, mute state, active port, etc.) + | - Prepare context menu for the sink + | - Ensure the sink is displayed correctly via updateDeviceVisibility + V ++-------------------------------------+ +| MainWindow::updateDeviceVisibility | +| (mainwindow.cc & .h) | ++-------------------------------------+ + | + | - If idle source/callback is already queued, return + | - Schedule the idle_cb function to be called when the app is idle + V ++----------------+ +| idle_cb | +| (mainwindow.cc)| ++----------------+ + | + V + ... (Specific steps and logic for updating device visibility) diff --git a/v-0.03/documentation/pulseaudio/introspect.c summary b/v-0.03/documentation/pulseaudio/introspect.c summary new file mode 100644 index 0000000..d9616f2 --- /dev/null +++ b/v-0.03/documentation/pulseaudio/introspect.c summary @@ -0,0 +1,79 @@ +* !pa_tagstruct_eof (context_string_callback): this function seems to be a callback function for processing string responses from the server. It examines the incoming command and checks for errors. If there's an error or if the command isn't a reply, it sets the success flag to 0 and prepares an empty response string. If the command is a reply, it extracts the response string from the tag structure. If there's any issue with extracting the string or if there's unexpected data in the tag structure, it flags a protocol error. + +* pa_context_stat: this function sends a simple command to request statistics. It leverages another function pa_context_send_simple_command and provides the context_stat_callback as the callback function to handle the response. It's used to retrieve statistical information. + +* pa_context_get_server_info: similar to the previous function, this function sends a command to get server information. It again uses pa_context_send_simple_command, but this time with a different callback, context_get_server_info_callback, to process the server information response. + +* context_get_sink_info_callback: this function is a callback that processes information about a sink. It first ensures that the operation and context are valid. If the received command is not a reply, it handles the error. If it is a reply, it starts parsing the sink information from the tag structure, extracting details like the sink's name, description, sample specification, channel map, owner module, volume, mute status, monitor source, latency, and more. The function seems to account for different versions of the context and extracts varying levels of information based on that. + +* pa_tagstruct_getu32: this function seems to be a snippet or part of another function and is possibly not a standalone function. It attempts to retrieve a 32-bit unsigned integer from a tag structure. If unsuccessful, it returns an error indicating a protocol issue. + +* pa_context_get_sink_info_list: this function sends a command to retrieve a list of sink information. It utilizes the pa_context_send_simple_command function and provides the context_get_sink_info_callback as the callback to process the list of sinks. + +* pa_context_get_sink_info_by_index: this function requests information about a specific sink identified by its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SINK_INFO) with the specified sink index and sends it to the server. The response from the server is expected to be handled by the context_get_sink_info_callback. + +* pa_context_get_sink_info_by_name: similar to the previous function, this one requests information about a sink, but it identifies the sink by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SINK_INFO) with the specified sink name to the server. The server's response will be processed by the context_get_sink_info_callback. + +* pa_context_set_sink_port_by_index: this function is designed to set the port for a specific sink identified by its index. After some validity checks, it builds a command (PA_COMMAND_SET_SINK_PORT) with the given sink index and port information, then sends this command to the server. The acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_sink_port_by_name: this function sets the port of a sink based on its name. It first performs some validation checks, then constructs a command with the sink's name and desired port. This command is sent to the PulseAudio server, and the response will be handled by a generic acknowledgment callback. + +* context_get_source_info_callback: this callback function processes information about a source. It starts by performing some initializations and checks. If the received command is a reply, it begins parsing the source information from the tag structure. This includes extracting details like the source's name, description, sample specification, volume, mute status, latency, and more. It appears to accommodate different versions of the context, extracting varying levels of information based on that. + +* pa_context_get_source_info_list: this function sends a command to retrieve a list of source information. It employs the pa_context_send_simple_command function, providing the context_get_source_info_callback as the callback to process the list of sources. + +* pa_context_get_source_info_by_index: this function retrieves information about a specific audio source based on its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source index and sends it to the server. The response from the server is expected to be handled by the context_get_source_info_callback. + +* pa_context_get_source_info_by_name: similar to the previous function, this one retrieves information about a source but identifies the source by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source name to the server. The server's response is again expected to be processed by the context_get_source_info_callback. + +* pa_context_set_source_port_by_index: this function sets the port of a specific source based on its index. After performing some validity checks and ensuring that the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source index. This command is sent to the server, and the acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_source_port_by_name: this function is designed to set the port of a specific audio source based on its name. It constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source name and sends this command to the PulseAudio server. The server's response will be handled by a generic acknowledgment callback. + +* context_get_client_info_callback: This callback function processes client-related information. It first performs checks to ensure the received command is a reply. If it is, the function begins parsing the client information, extracting details like client index, name, owner module, and driver. The function appears to be prepared to handle multiple client records in the same response and will loop through them until the end of the tag structure. + +* pa_context_get_client_info: this function requests information about a specific client based on its index. It constructs and sends a command (PA_COMMAND_GET_CLIENT_INFO) with the specified client index to the server. The server's response is expected to be processed by the context_get_client_info_callback. + +* pa_context_get_client_info_list: this function requests a list of client information from the PulseAudio server. It utilizes the pa_context_send_simple_command function and specifies the PA_COMMAND_GET_CLIENT_INFO_LIST command. The response from the server is expected to be handled by the context_get_client_info_callback. + + +* card_info_free: this is a utility function designed to free the memory associated with a pa_card_info structure. It releases memory for various properties and profiles associated with the card, such as its property list (proplist), profiles (profiles), and extended profile information (profiles2). + +* fill_card_port_info: this function populates the port information for a given card. It starts by extracting the number of ports (n_ports) for the card from a tag structure. If the card has ports, it then proceeds to fill in details about each port. If there's a protocol error while fetching the details, it returns an error. + +* fill_card_profile_info: this function is responsible for populating the profile information of a given card. It begins by allocating memory for the profiles and then proceeds to iterate through each profile, extracting details like name, description, number of sinks, number of sources, and priority. It also accounts for different versions of the context, fetching additional details if the version is >= 29. + + +* context_get_card_info_callback: this callback function processes card-related information. It starts by performing initialization checks and then examines the received command. If the command is a reply, the function starts parsing card details like index, name, owner module, driver, and the number of profiles. It then calls the fill_card_profile_info function to populate the profiles for the card. If there are any protocol errors during this process, the function handles them accordingly. + + +* pa_tagstruct_get_proplist: This function seems to be a snippet or a partial representation of a larger function. Its purpose appears to be to extract a property list (proplist) from a tag structure. If there's any issue during this extraction, it flags an error. + + +* pa_context_get_card_info_by_index: this function requests information about a specific card based on its index. After performing several validity checks, it constructs a command (PA_COMMAND_GET_CARD_INFO) with the specified card index and sends it to the server. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_by_name: similar to the previous function, this one requests information about a card, but it identifies the card by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_CARD_INFO) with the specified card name to the server. Again, the server's response is expected to be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_list: this function requests a list of all card information from the PulseAudio server. It employs the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_CARD_INFO_LIST command. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_set_card_profile_by_index: this function sets the profile of a specific card based on its index. After checking the validity of the context and ensuring the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the specified card index and desired profile. This command is sent to the server, and the response is handled by a generic acknowledgment callback. + +* pa_context_set_card_profile_by_name: this function sets the profile of a card identified by its name. Like the previous function, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the card name and desired profile, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_module_info_callback: this callback function processes module-related information. It checks if the received command is a reply and, if so, starts parsing the module details. This includes extracting details like the module's index, name, argument, and usage count. If there's an error or unexpected end of file in the tag structure, it flags a protocol error. + +* pa_context_get_module_info: this function retrieves information about a specific module based on its index. After conducting various validity checks, it constructs a command (PA_COMMAND_GET_MODULE_INFO) with the specified module index and sends it to the server. The response from the server will be processed by the context_get_module_info_callback. + +* pa_context_get_module_info_list: this function requests a list of all module information from the PulseAudio server. It uses the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_MODULE_INFO_LIST command. The server's response will be processed by the context_get_module_info_callback. + +* context_get_sink_input_info_callback: this callback function processes information related to sink inputs. It checks if the received command is a reply and, if so, starts parsing the sink input details. This includes extracting details like the sink input's index, name, owner module, client, sink, sample specification, channel map, volume, buffer usec, sink usec, resample method, driver, and more. It also accounts for different versions of the context, extracting varying levels of information based on that. + +* pa_context_set_source_output_volume: this function sets the volume of a specific source output based on its index. It starts by performing various checks, including verifying the validity of the provided volume. It then constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_VOLUME) with the specified source output index and volume and sends it to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_set_source_output_mute: this function mutes or unmutes a specific source output based on its index. It constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_MUTE) with the desired mute status and the source output index, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_sample_info_callback: this callback function processes sample-related information. It checks if the received command is a reply and, if so, begins parsing the sample details, extracting attributes like the sample's index, name, volume, mute status, proplist, and more. The function also handles possible protocol errors and is prepared to process multiple sample records in the same response. + +* pa_context_suspend_source_by_index: this function suspends or resumes a specific source based on its index. It verifies the server version, constructs a command (PA_COMMAND_SUSPEND_SOURCE) with the desired suspend status and source index, and then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_send_message_to_object: this function sends a message to a specific object within the PulseAudio server. After checking the server version and other conditions, it constructs a command (PA_COMMAND_SEND_OBJECT_MESSAGE) with the object's path, the message, and any additional parameters. The server's response will be processed by a callback function. diff --git a/v-0.03/documentation/pulseaudio/mainloop code flow.txt b/v-0.03/documentation/pulseaudio/mainloop code flow.txt new file mode 100644 index 0000000..f4c8b96 --- /dev/null +++ b/v-0.03/documentation/pulseaudio/mainloop code flow.txt @@ -0,0 +1,17 @@ ++---------------------------------------------+ +| Mainloop | +| | +| +--------------+ +-------------------+ | +| | I/O Events | | Timers | | +| +--------------+ +-------------------+ | +| | +| +--------------+ +-------------------+ | +| | Signals | | Deferred Callbacks| | +| +--------------+ +-------------------+ | +| | +| +---------------------+ | +| | Other Asynchronous | | +| | Tasks | | +| +---------------------+ | +| | ++---------------------------------------------+ diff --git a/v-0.03/easypulse_core.c b/v-0.03/easypulse_core.c new file mode 100644 index 0000000..47372ab --- /dev/null +++ b/v-0.03/easypulse_core.c @@ -0,0 +1,659 @@ +/** + * @file easypulse_core.c + * @brief Implementation of the easypulse core functions. + * + * This file provides the core functionality to interact with PulseAudio, + * allowing operations like setting the default device and adjusting volume. + */ + +#include "easypulse_core.h" +#include +#define INITIAL_ALLOCATION_SIZE 5 +#include +#include + +/** + * @brief Callback function for retrieving device information. + * @param c The PulseAudio context. + * @param i The device information. + * @param eol End of list flag. + * @param userdata User-provided data (expected to be a pointer to pulseaudio_manager). + */ +static void device_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + pulseaudio_manager *manager = (pulseaudio_manager *)userdata; + + // Check if we need to resize the devices array + if (manager->device_count % INITIAL_ALLOCATION_SIZE == 0) { // Resize every time we hit a multiple of INITIAL_ALLOCATION_SIZE + size_t newSize = (manager->device_count + INITIAL_ALLOCATION_SIZE) * sizeof(pulseaudio_device); + pulseaudio_device *new_devices = realloc(manager->devices, newSize); + + if (!new_devices) { + fprintf(stderr, "[ERROR]: Failed to resize the devices array.\n"); + free(manager->devices); // Free old memory + manager->devices = NULL; + manager->device_count = 0; // Reset device_count to prevent out-of-bounds access + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + manager->devices = new_devices; + } + + if (eol < 0) { + if (pa_context_errno(c) != PA_ERR_NOENTITY) + fprintf(stderr, "Sink callback failure\\n"); + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + + if (eol > 0) { + manager->devices_loaded = 1; + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + + // Store the device's information + pulseaudio_device device; + device.index = i->index; + device.name = strdup(i->name); + device.description = strdup(i->description); + device.volume = i->volume; + device.channel_map = i->channel_map; + device.mute = i->mute; + + // Add the device to the manager's list + manager->devices[manager->device_count++] = device; +} + + +/** + * @brief Callback function to check the state of the PulseAudio context. + * @param c The PulseAudio context. + * @param userdata User-provided data (expected to be a pointer to an int indicating readiness). + */ +static void context_state_cb(pa_context *c, void *userdata) { + pa_context_state_t state; + pulseaudio_manager *manager = (pulseaudio_manager *) userdata; + int *pa_ready = &(manager->pa_ready); + pa_threaded_mainloop *m = manager->mainloop; + + state = pa_context_get_state(c); + switch (state) { + // There are other states you can handle, but these are the important ones + case PA_CONTEXT_CONNECTING: + case PA_CONTEXT_AUTHORIZING: + case PA_CONTEXT_SETTING_NAME: + default: + break; + case PA_CONTEXT_READY: + *pa_ready = 1; + pa_threaded_mainloop_signal(m, 0); + break; + case PA_CONTEXT_FAILED: + case PA_CONTEXT_TERMINATED: + *pa_ready = 2; + pa_threaded_mainloop_signal(m, 0); + break; + } +} + +/** + * @brief Initializes the pulseaudio_manager. + * + * @param self Pointer to the pulseaudio_manager instance. + * @return Boolean indicating success or failure. + */ +bool initialize(pulseaudio_manager *self) { + // 1. Create the threaded mainloop + self->mainloop = pa_threaded_mainloop_new(); + if (!self->mainloop) { + return false; + } + + // Get the mainloop API + pa_mainloop_api *mlapi = pa_threaded_mainloop_get_api(self->mainloop); + + // Create the context + self->context = pa_context_new(mlapi, "PulseAudio Manager"); + if (!self->context) { + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // Set the state callback + pa_context_set_state_callback(self->context, context_state_cb, self); + + // Lock the mainloop and connect the context + pa_threaded_mainloop_lock(self->mainloop); + + if (pa_context_connect(self->context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) { + pa_threaded_mainloop_unlock(self->mainloop); + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // 2. Start the threaded mainloop + pa_threaded_mainloop_start(self->mainloop); + + // 4. Wait for the context to be ready + while (self->pa_ready == 0) { + pa_threaded_mainloop_wait(self->mainloop); + } + + pa_threaded_mainloop_unlock(self->mainloop); + + if (self->pa_ready == 2) { + return false; + } + + return true; +} + + +/** + * @brief Cleans up the pulseaudio_manager. + * + * @param self Pointer to the pulseaudio_manager instance. + * @return Boolean indicating success or failure. + */ +static bool cleanup(pulseaudio_manager *self) { + // Lock the mainloop before making changes to the context + pa_threaded_mainloop_lock(self->mainloop); + + // Disconnect the context + pa_context_disconnect(self->context); + + // Unlock the mainloop before stopping it + pa_threaded_mainloop_unlock(self->mainloop); + + // Stop the threaded mainloop + pa_threaded_mainloop_stop(self->mainloop); + + // Unreference the context + pa_context_unref(self->context); + + // Free the threaded mainloop + pa_threaded_mainloop_free(self->mainloop); + + return true; +} + +/** + * @brief Load available sound cards (devices). + * @param self The pulseaudio_manager instance. + * @return true on success, false otherwise. + */ +bool load_devices(pulseaudio_manager *self) { + pa_operation *op; + op = pa_context_get_sink_info_list(self->context, device_cb, self); + + if (!op) { + return false; + } + + self->iterate(self, op); + return true; +} + +/** + * @brief Retrieve a list of available devices. + * @param self A pointer to the pulseaudio_manager instance. + * @return A pointer to an array of available devices. The caller is responsible for freeing this memory. + */ +pulseaudio_device* get_device_list(pulseaudio_manager *self) { + if (!self || !self->devices_loaded) { + fprintf(stderr, "[ERROR]: Manager not initialized or devices not loaded.\n"); + return NULL; + } + + // Allocate memory for the list of devices + pulseaudio_device *devices_list = malloc(self->device_count * sizeof(pulseaudio_device)); + if (!devices_list) { + fprintf(stderr, "[ERROR]: Failed to allocate memory for devices list.\n"); + return NULL; + } + + // Copy device information from the manager's devices array + for (uint32_t i = 0; i < self->device_count; i++) { + devices_list[i] = self->devices[i]; + } + + return devices_list; +} + +/** + * @brief Callback function handling the completion of the "unmute" operation. + * + * @param c The PulseAudio context. + * @param success A flag indicating the success or failure of the operation. + * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. + */ +static void operation_complete_unmute_cb(pa_context *c, int success, void *userdata) { + (void)c; // Suppress unused parameter warning + + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + manager->operations_pending--; + + if (!success) { + fprintf(stderr, "Failed to unmute the device input.\n"); + } + + // Signal the mainloop to resume any waiting threads. + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + +/** + * @brief Callback function handling the completion of the "move" operation. + * + * @param c The PulseAudio context. + * @param success A flag indicating the success or failure of the operation. + * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. + */ +static void operation_complete_move_cb(pa_context *c, int success, void *userdata) { + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + + if (success) { + pa_operation* unmute_op = pa_context_set_sink_input_mute(c, manager->current_device_index, 0, operation_complete_unmute_cb, manager); + pa_operation_unref(unmute_op); + } else { + // Handle error... + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + +/** + * @brief Callback function handling the completion of the "mute" operation. + * + * @param c The PulseAudio context. + * @param success A flag indicating the success or failure of the operation. + * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. + */ +static void operation_complete_mute_cb(pa_context *c, int success, void *userdata) { + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + uint32_t target_device_index = manager->current_device_index; + + if (success) { + pa_operation* move_op = pa_context_move_sink_input_by_index(c, manager->current_device_index, target_device_index, operation_complete_move_cb, manager); + pa_operation_unref(move_op); + } else { + // Handle error... + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + +/** + * @brief Callback function to handle each device input. + * @param c The PulseAudio context. + * @param i The device input information. + * @param eol End of list flag. + * @param userdata User-provided data (expected to be a pointer to the target device index). + */ +static void switch_device_cb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata) { + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + + if (!eol && i) { + // Move this device input to the desired device + pa_operation* move_op = pa_context_move_sink_input_by_index(c, i->index, manager->devices[manager->current_device_index].index, NULL, NULL); + pa_operation_unref(move_op); + } + + if (eol) { + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + +/** + * @brief Switches the device (audio source) for the pulseaudio_manager. + * + * @param self Pointer to the pulseaudio_manager instance. + * @param device_index Index of the device to switch to. + * @return Boolean indicating success or failure. + */ +bool switch_device(pulseaudio_manager *self, uint32_t device_index) { + // Ensure the context is valid + if (!self || !self->context) { + return false; + } + + // Check if device_index is out of bounds + if (device_index >= self->device_count) { + fprintf(stderr, "[ERROR]: device_index out of bounds.\n"); + return false; + } + + self->current_device_index = device_index; + + // Set the desired device as the default device + /*fprintf(stderr, "[DEBUG]: self->context = %p\n", self->context); + fprintf(stderr, "[DEBUG]: self->devices = %p\n", self->devices); + fprintf(stderr, "[DEBUG]: device_index = %d\n", device_index);*/ + + if (self->devices) { + // Check if the name attribute is NULL + if (!self->devices[device_index].name) { + fprintf(stderr, "[ERROR]: Sink's name is NULL.\n"); + return false; + } + //fprintf(stderr, "[DEBUG]: self->devices[device_index].name = %s\n", self->devices[device_index].name); + } + pa_operation* set_default_op = pa_context_set_default_sink(self->context, self->devices[device_index].name, NULL, NULL); + pa_operation_unref(set_default_op); + + // Use the introspect API to get a list of all device inputs + pa_operation *op = pa_context_get_sink_input_info_list(self->context, switch_device_cb, self); + + if (!op) { + return false; + } + + while (pa_operation_get_state(op) == PA_OPERATION_RUNNING) { + self->iterate(self, op); + } + + pa_operation_unref(op); + + return true; +} +/** + * @brief Callback function to check the volume of the PulseAudio context. + * + * @param c Pointer to the PulseAudio context. + * @param i Information about the device. + * @param eol End of list flag. + * @param userdata User-provided data. + */ +static void set_volume_check_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + pulseaudio_manager *self = (pulseaudio_manager *)userdata; + + if (eol > 0) { + //printf("[DEBUG, volume_check_cb()]: End-of-list reached.\n"); + self->operations_pending--; + return; + } + + if (!i) { + fprintf(stderr, "[ERROR, volume_check_cb()]: Null pointer for pa_sink_info.\n"); + self->operations_pending--; + return; + } + + if (!i->name) { + fprintf(stderr, "[ERROR, volume_check_cb()]: Null pointer for device name.\n"); + self->operations_pending--; + return; + } + + printf("[DEBUG, volume_check_cb()]: Processing device info for device: %s\n", i->name); + + // Update the volume values in the manager's devices structure + self->devices[self->active_device_index].volume = i->volume; + + // Print the volume for each channel + for (int channel = 0; channel < i->volume.channels; channel++) { + //float volume_percentage = (float)i->volume.values[channel] / PA_VOLUME_NORM * 100.0; + //printf("Channel %d Volume: %.2f%%\n", channel, volume_percentage); + } + + //Signaling to continue. + pa_threaded_mainloop_signal(self->mainloop, 0); +} + +// Completion callback for volume set operation +static void volume_set_complete_cb(pa_context *c, int success, void *userdata) { + (void) c; + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + + //printf("[DEBUG, volume_set_complete_cb()]: inside volume_set_complete_cb()\n"); + //printf("[DEBUG, volume_set_complete_cb()]: device name is, %s\n", manager->active_device_name); + + if (!success) { + fprintf(stderr, "[ERROR]: Failed to set volume. Reason: %s\n", pa_strerror(pa_context_errno(c))); + } + + // Debug: Print cvolume values for each channel as percentages + //pa_cvolume cvolume = manager->devices[manager->active_device_index].volume; + + /*for (int i = 0; i < cvolume.channels; i++) { + float percentage = (cvolume.values[i] / (float)PA_VOLUME_NORM) * 100; + //printf("[DEBUG, volume_set_complete_cb()]: Channel %d cvolume value: %u (%.2f%%)\n", i, cvolume.values[i], percentage); + } + //printf("[DEBUG, volume_set_complete_cb invoked. Success: %d\n", success);*/ + + // Decrease the operations count and potentially signal the condition variable. + manager->operations_pending--; + + // Signal the main loop to continue + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + +/** + * @brief Retrieves the number of channels for a specified device. + * + * @param devices Pointer to an array of PulseSink structures. + * @param device_index Index of the device whose number of channels is to be retrieved. + * + * @return Number of channels for the specified device. Returns -1 on error. + */ +int get_device_channels(const pulseaudio_device *devices, int device_index) { + if (!devices || device_index < 0) { + fprintf(stderr, "[ERROR]: Invalid devices array or device index in get_device_channels.\n"); + return -1; // Return -1 or another indicator of failure + } + return devices[device_index].channel_map.channels; +} + + +/** + * @brief Set the volume for a specified device. + * + * This function allows setting the volume for a specific device based on the given percentage. + * The function performs various checks to ensure valid inputs and that the PulseAudio system is ready. + * It will adjust the volume for all channels of the device to the desired level. + * + * @param self Pointer to the pulseaudio_manager instance. + * @param device_index Index of the device to set the volume for. + * @param percentage Desired volume level as a percentage. + * @return Boolean indicating success or failure. + */ +bool set_volume(pulseaudio_manager *self, uint32_t device_index, float percentage) { + if (!self || percentage < 0.0f || percentage > 100.0f || device_index >= self->device_count) { + return false; + } + + // Convert percentage to volume + pa_volume_t volume = (percentage / 100.0) * PA_VOLUME_NORM; + if (volume >= PA_VOLUME_NORM) { + volume = PA_VOLUME_NORM - 1; + } + + // Debug: show index and desired volume. + //printf("[DEBUG, set_volume()] Index is: %i\n", device_index); + //printf("[DEBUG, set_volume()] Desired volume: %f%% (value: %u)\n", percentage, volume); + + // Ensure PulseAudio is ready and devices are loaded + if (self->pa_ready != 1 || self->devices_loaded != 1) { + return false; + } + + // Debug: Show channel volumes before the change. + /*for (int channel = 0; channel < self->devices[device_index].channel_map.channels; channel++) { + printf("[DEBUG, set_volume()]: Channel %d Before volume: %f%%\n", + channel, + 100.0 * self->devices[device_index].volume.values[channel] / PA_VOLUME_NORM); + }*/ + + // Create a pa_cvolume structure and set the volume for all channels + pa_cvolume cvolume; + pa_cvolume_init(&cvolume); + cvolume.channels = self->devices[device_index].channel_map.channels; // Manually set channels + pa_cvolume_set(&cvolume, cvolume.channels, volume); + + printf("[DEBUG, set_volume()] channels: %d\n", cvolume.channels); + + // Apply the volume change to the specific device by index and wait for the operation to complete + const char *device_name_to_change = self->devices[device_index].name; + self->operations_pending++; + pa_operation *op = pa_context_set_sink_volume_by_name(self->context, device_name_to_change, &cvolume, volume_set_complete_cb, self); + self->iterate(self, op); + + // Fetch the updated volume for the device and wait for the operation to complete + pa_operation *op2 = pa_context_get_sink_info_by_name(self->context, device_name_to_change, set_volume_check_cb, self); + self->iterate(self, op2); + + return true; +} + + +/** + * @brief Iterates through operations in the pulseaudio_manager. + * + * @param manager Pointer to the pulseaudio_manager instance. + * @param op Pointer to the pa_operation instance. + */ +void iterate(pulseaudio_manager *manager, pa_operation *op) { + pa_threaded_mainloop_lock(manager->mainloop); + + if (!op) { + pa_threaded_mainloop_signal(manager->mainloop, 0); // Signal completion even if there's no operation + pa_threaded_mainloop_unlock(manager->mainloop); + return; + } + + const int MAX_WAIT_CYCLES = 100; // For example, wait for 100 cycles + int wait_cycles = 0; + + // Wait for the operation to complete, but not indefinitely + while (pa_operation_get_state(op) == PA_OPERATION_RUNNING) { + if (wait_cycles >= MAX_WAIT_CYCLES) { + fprintf(stderr, "Error: Operation timeout. Exiting loop.\\n"); + break; // Exit the loop if we've waited for too long + } + + pa_threaded_mainloop_wait(manager->mainloop); + wait_cycles++; + } + + pa_threaded_mainloop_signal(manager->mainloop, 0); // Signal that iteration is complete + pa_threaded_mainloop_unlock(manager->mainloop); +} + + +/** + * @brief Create a new pulseaudio_manager instance. + * @return Returns a pointer to a manager structure. + */ +pulseaudio_manager *new_manager(void) { + pulseaudio_manager *manager = (pulseaudio_manager *)malloc(sizeof(pulseaudio_manager)); + if (!manager) return NULL; + + manager->devices = (pulseaudio_device *)malloc(5 * sizeof(pulseaudio_device)); + if (!manager->devices) { + free(manager); + return NULL; + } + + // Initialize pointers to 0 -- good practice. + manager->device_count = 0; + manager->devices_loaded = 0; + manager->devices = (pulseaudio_device *)malloc(5 * sizeof(pulseaudio_device)); + manager->device_count = 0; + manager->devices_loaded = 0; // Initialize to 0 + manager->load_devices = load_devices; + manager->destroy = destroy; + manager->switch_device = switch_device; + manager->set_volume = set_volume; + manager->get_active_device = get_active_device; + manager->iterate = iterate; + manager->get_device_channels = get_device_channels; + + if(!initialize(manager)) { + free(manager->devices); + free(manager); + return NULL; + } + + return manager; +} + +/** + * @brief Callback function to process the PulseAudio server information. + * + * This callback is invoked once the server information is available. It retrieves the default device name + * from the server response and determines the active device by matching the name with the available devices + * in the manager's list. + * + * @param c Pointer to the PulseAudio context. + * @param info Pointer to the pa_server_info structure containing the server's information. + * @param userdata User-provided data (expected to be a pointer to pulseaudio_manager). + */ +static void active_device_cb(pa_context *c, const pa_server_info *info, void *userdata) { + if (!info || !info->default_sink_name) { + fprintf(stderr, "[ERROR]: Null pointer in active_device_cb.\n"); + return; + } + (void) c; + pulseaudio_manager *manager = (pulseaudio_manager *)userdata; + + // Get the default device name from the server information + const char *default_device_name = info->default_sink_name; + //fprintf(stderr, "[DEBUG]: Default device name from server: %s\n", default_device_name); + + // Iterate over the available devices to find the active one + for (uint32_t i = 0; i < manager->device_count; i++) { + //fprintf(stderr, "[DEBUG]: Comparing with device %d: %s\n", i, manager->devices[i].name); + if (strcmp(manager->devices[i].name, default_device_name) == 0) { + // Set the active device index when a match is found + manager->active_device_index = i; + manager->active_device_name = manager->devices[i].name; // Set the active device name here + break; + } + } + //printf("[DEBUG, active_device_cb()]: Active device index is, %i\n", manager->active_device_index); + //printf("[DEBUG, active_device_cb()]: Active device name is, %s\n", manager->active_device_name); + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + +/** + * @brief Request the default device name from the PulseAudio server and determine the active device. + * + * This function initiates a request to retrieve the default device name (active device) from the PulseAudio server. + * Once the server provides this information, the active_device_cb callback is triggered to process the response. + * + * @param manager Pointer to the pulseaudio_manager instance. + */ +void get_active_device(pulseaudio_manager *manager) { + pa_threaded_mainloop_lock(manager->mainloop); + + // Request server information + pa_context_get_server_info(manager->context, active_device_cb, manager); + + // Wait until the iterate function signals that it's done + pa_threaded_mainloop_wait(manager->mainloop); + + pa_threaded_mainloop_unlock(manager->mainloop); + + // The original loop to wait for active_device_name to be set + int timeout = 50; // Number of iterations or timeout value + while (!manager->active_device_name && timeout-- > 0) { + manager->iterate(manager, NULL); + } +} + + +/** + * @brief Frees the memory of a pulseaudio_manager instance. + * + * @param manager Pointer to the pulseaudio_manager instance to be deleted. + */ +void destroy(pulseaudio_manager *self) { + cleanup(self); + + if (self) { + for (uint32_t i = 0; i < self->device_count; i++) { + free(self->devices[i].name); + free(self->devices[i].description); + } + free(self->devices); + free(self); + } +} diff --git a/v-0.03/easypulse_core.h b/v-0.03/easypulse_core.h new file mode 100644 index 0000000..9e39c64 --- /dev/null +++ b/v-0.03/easypulse_core.h @@ -0,0 +1,81 @@ +/** + * @file core.h + * @brief EasyPulse Library Header. + * + * EasyPulse is a library designed to provide pseudo-object oriented programming + * functions to simplify access to PulseAudio. + */ + +#ifndef EASPYPULSE_CORE_H +#define EASPYPULSE_CORE_H +#define DEBUG_MODE 0 // Debug mode flag + +#include +#include +#include +#include + + +// Forward declarations +typedef struct pulseaudio_manager pulseaudio_manager; +typedef struct pulseaudio_device pulseaudio_device; + +/** + * @brief Represents a PulseAudio devices. + */ +struct pulseaudio_device { + uint32_t index; ///< Index of the devices. + char *name; ///< Name of the devices. + char *description; ///< Description of the devices. + pa_cvolume volume; ///< Volume of the devices. + pa_channel_map channel_map; ///< Channel map of the devices. + int mute; ///< Mute status of the devices (1 for muted, 0 for unmuted). + int number_of_channels; //The number of channels of the devices. +}; + +/** + * @brief Represents the main manager for PulseAudio operations. + */ +struct pulseaudio_manager { + pa_threaded_mainloop *mainloop; ///< Mainloop for PulseAudio operations. + pa_context *context; ///< PulseAudio context. + pulseaudio_device *devices; ///< Array of available devices. + uint32_t device_count; ///< Count of available devices. + int pa_ready; ///< Indicates if PulseAudio is ready (1 for ready, 2 for error). + int devices_loaded; ///< Indicates if devices are loaded (0 for not loaded, 1 for loaded successfully, 2 for error). + int operations_pending; // Counter for pending operations. + int active_device_index; // The active device index, i.e, the devices being used for playback. + char *active_device_name; // The name of the active device. + uint32_t current_device_index; // The devices being processed right now by the program. It's not necessarily the same as the playback device. + + + bool (*initialize)(pulseaudio_manager *self); ///< Function to initialize the manager. + bool (*load_devices)(pulseaudio_manager *self); ///< Function to load available devices. + bool (*switch_device)(pulseaudio_manager *self, uint32_t devices_index); ///< Function to switch to a specified devics. + bool (*set_volume)(pulseaudio_manager *self, uint32_t devices_index, float percentage); // Function to set the volume to a specified percentage. + void (*get_active_device)(pulseaudio_manager *manager); // Function to set the volume to a specified percentage. + void (*iterate)(pulseaudio_manager *manager, pa_operation *op); //Functions to go through every step of a threaded loop. + void (*destroy)(pulseaudio_manager *manager); + int (*get_device_channels) (const pulseaudio_device *device, int device_index); //Function to get the number of channels of a given device. + pulseaudio_device (*get_device_list)(pulseaudio_manager *self); //Function to get a list of available device. + +}; + +/** + * @brief Create a new pulseaudio_manager instance. + * @return A pointer to the newly created pulseaudio_manager instance. + */ +pulseaudio_manager* new_manager(void); + +/** + * @brief Free the memory associated with a pulseaudio_manager instance. + * @param manager The pulseaudio_manager instance to delete. + */ +void get_active_device(pulseaudio_manager *manager); +bool set_volume(pulseaudio_manager *self, uint32_t devices_index, float percentage); +void iterate(pulseaudio_manager *manager, pa_operation *op); +int get_device_channels(const pulseaudio_device *devices, int devices_index); +void destroy(pulseaudio_manager *manager); +pulseaudio_device* get_device_list(pulseaudio_manager *self); + +#endif // CORE_H diff --git a/v-0.03/easypulse_core.o b/v-0.03/easypulse_core.o new file mode 100644 index 0000000000000000000000000000000000000000..2cbadb8ce2aad8fd6acc9f195b56c98863945a4b GIT binary patch literal 36432 zcmb`Q2|Sg-_wcW!k`!q{sGBW>Bo(dJTw7@oi6pKiYj&j~#3iMqRV!MxP((?zQ3>r* zqEaa>luG+MbMF~F&5z&z|GuAhJ|8`IzH{cxnKNgW=icYuR-4<*5Ec?*ktD>L#`>Eh zl*LL*`up05|I&yh!y3x6=kQ+4<;1>?M3p$a^V@#^`NQEAq@fEhV;w(}8iOt#oD@-2 zbySbTGjADN#z{%Ql*3CngfA)lOA1GpcfIIlRaF&7^29|>c?+9&vHXoNueQ8NSg4kF zUE^ZHZOMdstOP0;$;OrS;$7tMYB}XiA{-%n5f)rTknWRzb#qdTq&O)Ve8RiW;Z?NY zJ|LMQEE9JgUsz#*oRnSyUVc^^y(q<=;G_bBI)b+O3W*v(6-HA0+JbC_kt`#}Nnw@p zvry;tOX045Aj9}(@a&}G&SR&sqUNG53VbPOHLkN)s4~Mk8KmpKT1T}OiCP2Qt2DuV z6-I1+|G;|MKy!hCcqmhh#CQp1*i$J9IFCBRaA7600J#}@h@4x?EJ?~mHgi(8oyHel zY8@`)?P}tSB$WutE(^+91Z8c4vMNE@T|rr=pp5kgo00TbP}VFc6T^_VOG;4oR#4U< zD3cYGu?1y61!bcAs7+NDl<5k}Brr_bHds(*ASg2ulqm?xR0L%lL75%8q{L_;#!GPI z%Ym0TDx4HYE!0_OfuIM!kfV?26h!?5G*m#%5Vb)xnonKgIVqfZ2sv|jw(B@Nm(3`T zW|5;G%4ec{Hp+*hd^F1EqWo#(jd($?*7196TY~6iL^lg)rhrx8M9MUu66fxtC5ab*hVbsPURjyLm8 z^b&~)CIrvCIc{aMXy_pPZ?HuQ%C_{1>l6wf(K-pqwN>y}G4!hQpJ~@RTu_K&8;vnt zD3q4gWfU73)dIHKw{UpENE{i);v|%Xi5H>jtk=W&!62YrLC-g{lao3Gi*OigO$ydx zA|_B{B!>0K5uH$5ptb^66c znf!KJ=TJhek`%z%6eER%ve1{^m&A1nhxHLC>s5rD!|L)TS`}8}@k4)ItqQWJkHmM~ z75{Ig|80(q2Tx#Qmk;NB!;8aTAL4+DTiMAX7Ap$mIo`@92Ji6e{nrh<6dy?!+4@dc~_Q5=`d@99}t^&T-})XgRezkFDt^FitmC;qy6i$6cQLJrI$`PRX>YR^p?q3+f3!tSE(RU*ks)IHon zTZ)kZ&-`uN%Db%430;lbwx!s=MY%dlUL~5tGx+VpA>#kCU4B>53faW7e~i}qTBH?? zjXCP>V^)|e3gaeLs3UF|Z3U@YR3TPZ5k$E$op@C6oTwN@g&W@UH${K>2Qg-53V|Kgv-D z)H&{GB6K(Ose|z zf6kXyj)*Qs^q-TZl{cb6i2ie?w2I{LcEs?*Ea{&EWpWaRyd7!i0td=9+tBL@b9}&M zwTi}>H}iWXSs0UxfMj8rp?P!kYdjeAqQ#+4SoE^YUxoGgRbj({3tsdg08;zob_KiU zKSR*j6+3uAM@l;B_W!QaQYa8Rd0`zWxH?&(z2jDPu%ehdngwd2+v$%M%s;JTQp`Jg z9As=MYFelkIRu|?kwaiBihWzgxBNUlqw@;P(7&G~2PWWSJUT^p-HUdjd(k+)3@cRE zQ}RQZXjcQ7hOkrzJ`yI3(7xoB(=(T3G-0(*z@>bbg#z>7q8$G{JN_V1$34TLkBQulZ~>W z&|n;%BdG~Ns4`g!Kn~A~lniWK_j5w168x0JuPs>!m&%k3Yz!#pjs}55K`p+?)l6)P9;Bgh^nM0v0Idw@ zO#yU9#(PdDX`R2CyvEBKrd{uq;FoL!d)D@!qI|XFe#?&YZx$`SsL`%cyMMEe|7Owp z%@p?jHyg>%!Xg>hCKO+W-;#m;k+l=&;WfXDt)f_@%ZWy0Q|6x_@opQ64@?ezM@i z+QzfPA^Jb-uoL5p@$7V42gjMe#qovC!sx!>t>l^r{!GG3{=FUT@`YfI{2Qc5K?{Ge z5S){)Qs<=ZguCVznk;&_`~0&FC&kViDS->vGe zNoWj>+tJE^&$E*8=}0e9&-d;Ufg*hB{P|zK`!^&|m;NVlv`NA{eda&08(a8p{29Cn z%!U~Y)daxOd6o6Gj#hWog4L)dP?!ERAH z;;gwo0lsW^H$T56ZtlKpPgEr=nCl$CvJ3MI;Tnf|_yn?T-2&XaxWTxqICbd<&JG9+ zW%~s9g!;Jop;kQDfx%s^;3B_3HxI4{Y6?!wNOoXYC_B)Ty(BO!z$1jOugebXf>9yt z05^Xw+b4uQ)857g3kb@!*x`YGVg6iKcWu;PI}0 z{&ipoHx#<1!=A%+3keM9PTn#g9F3?)*I@EP=I`jDCb46E0@z;MP*-raySH0F0M`$D znAndRa~1dyxsFW)P=g)<1I>ej1A`~AX9aPC-9mi=1K6QH{#-O%I&AYu6jZ2-eu05O zIw&RusjEN#3<5I4%{|m7oZDr|622oVO$4!7~<>lRb)1U2q z%Q!Ega6R|P{IWhyvxR&U>-Xt7<=*jGc5?GApRmmDZ+`!|aPF&f?n;}3cP3w2{pHc0 zUmq^4_!2*Ti?37cRg+rxg{?@Ab&;8Bi?{&W4^f=ODS-?-DUh8(6zU*h%_@&<_|G{cQ z4=-Dm@0x18X=1yD^wsrp;u+(n^(kAo@SGhh_T99LBSzj_<*GUKr`otjTSuEudy;wW z^SH{yX5lkas`A$7m|RbL!|9)`c3U`GDBC!DWVT!O!0g$(torNE7wzaRuG&^Kb|+6E zx6GpYoL*vCMM9J7B_~n+p{qp{r1c!%4zbZlJ{cqTqgXvw>eG|^X2Xpgw=I6>{A>EP zxM$)M?Y8TWZtgsq`=GONu)L4L;ncgvZ)KT_DiafM-!SnkOI%j`Id zbHdidSqVEF7+)$PFP57(N8z+oOTkjZZB~nqjo%d)F6`iS)?k~(-o~@ZaS5Ww3wj&2 zD4i@H_F{3b*w$k%3LTyGTeI5UZ{zQ%-X1p37v%VMmR-5{?6QJajAWJZOp`~3 zZk+dhgcH1)65KMX5=xR@>T#DI|1`HYT0wvH#uHI&uM1f}BTFy!+ckG@c<;M=&vE)& z@!&f~~$oG?-`@wD9Q$m~~af8$9)ug$X454kBX zTz4?4p*}y;a&v@}w7UcaqDkbozZlAz;9e)6p9Z#;L{s z8ZC2drN+<3^A$h0#^TgtdPs!962mr;+6C-0MJe>qUoL!)S}mdd=#Cuf}%8y+p6!n}Gfl>8{nCHs z@4ln2o|@MFZwl+Gk__bEjjeLLZt-QLb@knGue8$){f!IU^Iruu`b#CAMd`S`%X128ER6KT)^%KIWlANzE|FPuacT1^^~u> z=Z$3Vh}vj4{drmRn)KS)83Wd?GotWzI2@9UXHHN~BdryD&R z8doh$8dd*6$D|>?P+IzCk?kyF_l}fD$5x&RP>7pkV(9I8?tS#dSf9EQac*I*^7?51 zWs`K)E4_-VZ!a`x*Q$u`Q+@8*j^aXt1v4HmU-dvbk@v_hIBi2O+1BIpMx{J*jI7&; zE@m%ObqA!YtJbcIIez|qq^P@CW?ansvHuqRi2->l-5$N9YNk6*)Io zt05y|@tK=PB3>xg?OIw;{BgkBnWrWhwv5zOH2fu6ow_PDPDprM@>&Dgp}j2a$Glqa zr+!&?jGeR2Wpj>1th%+~mrd%{y$TmtP;a%wprXp%H6tcU7a82GI@Vyec;nRc zxPii3ua;Jfh>&*NQXCUfIM8v?>7+PCQJspQ@IggN5<4R$V^5eZ?d*GcYnk}EcXGm` zO|6Tojh8l>oorDnRT;GL&ftSLW*NTPsq4~vwd6U8}6&N=hP zN`#NMIgxN^MzM+V;q0SJnj+oj1oWHpS~cUQ<-l!eg-&wfp_%4-G!LcAEQ!Rj&D`O{%o2gjcwUH;z^bdE2%?Z-`dgLe;qS znZj%L$gQ4zM`gQ5tdY~q+4mM1mmdgSbgwBeSmLGrCpS~gb6UESca6CId-Ucf-;M~Y z96MDu-m7@IdhbnVa$Z;j96z}0T2nD9NRgOL&vRf)v$98(~_zY8*_J~!Jcot;YY7Gk9oGiXQ0=0AE#@>no?^I%Kv#c zXjb8``8qOcp5qldmKToJ&N(hqvuV-02~$N@W_kUHKemeNo1Xu<UziZWGS&9eeoEwLu@}FPpEtd0|a;zw~CmBHcF+!-dAI-MsGY6ZzVO+B z$~z`osP67_hNXPYOKhq_PT+9m6=`jj-&y1G1Er^#Myya?;e9AR@y7t`yCbKF2krmj zz}p}>JAT8hC!41~9On09mE2QzKc&aYku!yNTWEye*}p+AW7qA^$;)n8Ea<1b++mx_ zBTfh}CPb2*nHU@Bxzx5cU{AjMT>Ep0Z@=Vu-m+OVrca3QU8^SM6E z?F_@eh2(n4$%&c|beJu1NPSI?ta)a^_lW_SyR6s05;K?{_`F^#@cE<;pKE6hh-cp$ z!MP|?DZ8!HF8P?lvgo*q*(Fv#?BZ`_7#R+{B5m@?T=|O7%8u>L2YI9Nr%%1{!cybj zLFZB%omn&6&rLDB^Wme%!NwOF_s$luHmFGcm~_B7tg240h!uM$VDEVrGq(e+uG@59RX z?DpHYFR7QxS6{s#QZ(^EE8;ytUab`o@{blgFKtdzsZ_1x^yn=6EcZ&EHA2>d)bbQv&usGAfKNfoW^Npqc3tk_-o^d0q#brnFXUjg*WX>5*y6gJ# zvvPLe_Yd>yV*;0WC^+wQzG9W_z9vk$Pmug6^UK$E+Il9RohbbNdaY>L`Kn`6W==5D zybyit#F$YdOjO@yf5{u1JMFuVOh}Vqgx;TBhdP?&-nk}-SYrHt$v-jtPYFnlzLNXYoxKGmBp;c%E2C!aPOenNr_#Xboh5ChQqrpq z4(3?J&X+FRH^9_q>fN~VN$bNWiPkO)J&>okq3_;Nqw=0-EWb6^dt8=G+-jEH`HLM| ziZ#*(lk3uDA{u3s40cz!eO(#;_2G!dhLs=v=c<@oHe0%pb2&fvg40UwmfgbTF)e?7 zcr6qOUsw~h{T{ne+TvQm9}A`aV}$k@3u`}4Df)7F`yHQ$%43(enyq%{ZcE}nv<#I|#UB&#&0Y5DEy*n3qrsc%4VN2g*YF%?W4v! zT9;I^PUGpzr2G4p?tVUeiEzWT_t8_OPTUHP-#PO8WS($I-0H|@RSU0N-?;3t{#%9f zQzk9vMI74S?z1C8H#|Sidtk&6tH_EY#fGU54=gkt?A>qsFmo90R{=zA^Tc%IEMcDf$@i8 zaoA(|{WsaaY+mHde!eW%HOO_yyPK;|i(enK_U_`2-11TTj2E3av-Iwd=J}D1&z^^^ z72SB|wnRh4c=>H!!yG=89FC}ZTAXa1?6TV4cwTcsZTZ2@M&Hp(QdF$gSsq(7Kk=|> z!3T#0I_-AxTTdkpUort7Vb0EsQdm# zfADFoUD?ZKghyD;j<_ju)_PLWolOo$&wGU(>FjSl-FA}b^c=qt(y|v%@245IWRytSbf2%{&%XpoSO*8y-+pQ2FI<@&99D2+ zh4Cl%D$T8m+95fb@^i9Q_FHiOkl$6wZMDuXOQ)A;MLv%lqH|yF_%iF@*P6PS50-o0 zoOu1}P37Y$GP8?!b~v;=O#f1Id7s+&zDvK%YkRldyjMi^GVTh4`}fb9j~nIFyRtC% z8Mp0*Q|e?(3&ommQy#UX-pR~(b8M3GovO;s=l6~=+UpbBe!%=}$4ToI?iyz-=e=(9 zi2gKht9q;9$X93QE7#m#>~bOf^VK&2?aBG_q189MH{VOqc{9bZV%Cl2H-GucHe`A} zI%oDn`PuZ*vb?@JTV)5z{(AfRQut^80~5AsFPnSWU2iA%xUY5QnA;M29+_os`MmeW zotdYmNIbH5SsW8;mZB9lBeCGQ!&R&DVb+OPH}ife&In8y>zVl8_OY;wT<_*x66r0P zdkjmCpZ~LIwAi6sO6u*7=CVwFLPtCvUf{*;a`N+%!$49|g22%G9Huv#d z`qtyr_QaL!2{R8Z4q9fZ_G7;id-6QpCB+8mzrMe_-^)zmVdD0>8JuJ9ryZR2wR->2 z6*oTlZGHcq#f~`#NgcSgp4& z_nuqs5Uu(`&U)6dqICrg#S{9=JUCPMq~Vj>>dvr!z3W>oz07{E4-g)qbMm5jY+a${ z%ys#Cmy{np*r6(SqpYMv%iyuiqTLfDbS~W*UKI3QulUFPuhG#>AKsQpUl7fEW%xw# zeU+8&^f8hx3+t@?cb4XN^#2++L}SdtFXwV>cb;xpar)i)>Zjvo?EAX!!@2oE6V2?# z$gH-!_QdDv%&6;T^Tri=jpvSS&f&E%U2|PJ-6S@a_bA{^G5XwTJ;YkrmdW} z?ygO*rpkJU-Tg~%zf4*u{yfNQg>O*jbeAX3wwEjkyZy36Wk_KC)Dw+K`AI{g?nsLT z?o#y^9{S*Qo>G%&P~pIPsjUldy^!|H_Hl@FEwg`7Y3d?=ZoJ-HjdvgO&&SRha^lh2 z%F$UH#`PZ6CYfKb>ei?mv3sYVaGw0uHloDhM%aD*b-A3*xduj)d^Kgt8WZ(2;#E&r zF34YVv42R3rXu&nNAdjpyJG{K=8w;Adht|PLNPzg-+bu%UP4k{R$9-duB}u^*E3|< z*u<=#>-TO&;W~x*MS-Os&n&#L^D0Z~;>Y9;CEq2 zz^$zJs$)wR@mP|(lLD(wYKYVf=<7GSHpWcm)LY@73kNAWq(_$2gH)It8eD5IayvXaigP*4Gt(>@th`X9o!tO+57}IO?e0RZ+_gUX%CBPp@;D&1unob){M3V|-chxeYd^ z3tYBF51Z^bz@~Be@2dsxFUsvLC@Z;mN;TuqZat;Y`-LT{X;ou49{ql~?)}?yss*|C z)Te%TZuT$zlP0Hk@y_*+^9x%|E?2n4v)t51Cf>ef&h|aC-pl-wymwwuo8`uY1KJW< zX3Ops4E8;!9%(kz?eTC$na*)cX{&c-7_ z3d6tb8yP8|Sd)DuR^f}8!@XGha>>F`?E2l=n`E!`dN6$U@uK@;nP)RsrD|{gHh%u& zSTRfSg7sX}g6A#!$F#*c9Q=JiMmhR|gYzVlRVS(zO;gz^>yaxydrV%yu>vhG<>ezI z7DeYd{fx>h`dRw3w8-(d?*H+NRL)aXOWp&GruC!DU_;&f`L-_@r{v!8|=zfmsc&M?|KrK5Dt;5%aF z5t}q8&PvaS`KWX!@4?A?*W1Ts^&ha?+U`Ztz%)CnSkpzDI*uL9ww_bn_;KJ0)+dX| zbzc7OYEJhuwmxfecJ1bd_Fg8HUroQH7SGWX-MjvD_2_+~+}qANJ}YJ<2?uJ-(>Oiz zfbEG4%^=A)6>>g$kJ`0fwkDXpcRr~9wQ1@5@)04D$6pP%u^2G?an;n$hoeT!-?B(V zvwy4EjDs=$5@|aZ)Fpn;*);g*<+xwDljWml?=7<#zpK*mN@Sn9UOMv68;18iu_!{k zSTwxP7qtQJK0DfPILce@mGZ;z*45z0+mGK&8#i}D>iqXPk8Zqu`N7D$qw>_uMShDu zeg4L7YfT@>-7d4p;%Q51T&8g7XCvMG$v5OX9rFi^kJ5G8J-Bx6tnreb=5Njmhx!Uj zcGP|0Y$+}fn6_e7(&!_6Z{^h`HQ zT{_~Y!Nu|fznJtIo51{iGr14XOL|G_+zZ?$w`6|VVc+7NtDM`L#4zeT)4Q6v@^_yh&u&I8`(KFJe-a_}3dausf)VRFqz3}vp4yD$1zdmQl)|Uu}WhI=~ zIg>SNdZcb`@?~w0fqwEz_Sr5j*7x;)ykE6eXsIDv&9(AZc{F&Z{KtiIrLpk|zBW?p zc8JD}>wWvm#J8?9Wm9EkSACBAvr|LX_Lg5`$7+$k!lFPvt5I=?w)MRpPJXG<+*G3$8H-J6nQ`^ zO?JcqrzDf8z6}naQ}b*pYL0l$(XYAj+GlF&tOE=6qVDy|K zt`|F)*C3-Qms95_y7kmR=js_jhVtbv{4%$kTIN)J)hEh*=DLBWSvyy*YFXMAKRj$l zj^|zTZ1dwUKig)MY(0Bv!j1uXxl?D~9pF>GN%~En9Q#ebZbg_K%}`wXJTL#N&2N#} z{ijC$dmd|q8@RvsaS3S+OE2k4Bz&5tI<{fP!(VlaPezCx&r<8XP&(iF_L)7q_831( zX{dV@eR0yJ@&od(()LEE)D~a08C+iV@_CT%Ntx6eN-^JE$B!C2+@(@v+o=Z~HtU|q zP8k04;kxSW-+tZQ^Ta9Kzir#A@XLPdPc&FZJl^x<>jIMxb|M>mr^KqB*|{S-&cZ*$ zFeq=+t}kzto&6nKMVybE+$b_QuikrVZ>0e3A4?V_#m#cc-l?S&?_IpDpXKQc={U#F z^Gp@?U37k(VY0r!hbLntaeU4$(YLkl2PRBe_h;g(2VZNvmOZlHTd{0m@|$r3H{IJ> zqy0=qWy6tvEDKZ9No;kCnf4m&vEy{~bjGsvboIvR8t9Hit`bFmZ1jhpenBGWj#;P- zGvY5H$oEAIr@?{?OKABVmQbXWki0}6u{0#iMqB~PreX!g1EkgpoA&R`i4zgg6-82l zawCw*z*iz8oYqyo7|Lg214y}ur4Sat`eUFx5MN2T@Y1gOd!c;cKjrhg%FCd9_&@sP zy7V_exgWlE>G$fYPaG5SPkBIBIUDOmi64et^+USKji7uV7V0X`>?&Uj<(u%8l#8VD z?PDVp1LghkTN|X@9Qjy8xJySi$gD&nT{6OvUFDadJmR17;I8s!QlHs|NF=`jJO-kI zw^dko{;6NxRbK_l&9NS0qli(LkIkSQKb-rwyiZrT2bANdf4a(r*LUfUhjRYo-$cLg zX?{7b(p|z$iL%B;GVU+RH3^uXJC;1Xy~cGvEx9=LH2+@S})tOvdZaqQ0x z5Tg8bANg}b5Aw%A{td|U_W>k-z6bfsJ@Dr}@Gm{^Vd(P!Y$pqz7vrz*s9kl$yYrh_ z58S&4zODzpx(A-p15ZaB+o=FklD|hFI}ZX+2fh;Z6Q}$h^jz$L-|B&P^uULpd4lbc z8YpNF&wrd0fjw(05~ z7|hjiXSoNW=My7CT|+|Avz6%4MV7lC*DW9{h!selwL_BrL4I6RDtM+63w2ZIABdi- z>!AoeiHVCsB78#Kz5hOZ$NKx&U)Q6PEO?X>7j-p^>e3JHv4Xk$Cqh{vp&s1eV3ub@ zuumwLg`Tkt^+rYLX;N2zH=h9fSRi`p(ksBt50{bNq8b5#sA{kW>ZvR4JbrG|+t<|- zJ>1F^#E&iVUBmkO^lJBw1aKp|FTg6?f_#`-dzAGI=JNYM?8IJxk%7l=yKe(M8tcn! z0M!rRx`%cz9EQ9i5bwrSp>DxFREu!);g=BGJbXg_YcnCCfk8~0!UBT1o-F*NFGN5H zvy|^>@^q{#exR4dcx05H_ZJK}V;K4F5mZ9Y_PXLHezDHK(J5$?QG*|)@DwhtvLs6I z?C-y^$utbN;lcHE3-d!mf!bo0F^tB_@bk3-)BiDoFNLQUu8Lv~1z#Wv*q~taXs{=< zm*lxu#=PLS22%n@ATy6FV;a-t3=l_M!;dR7MHu!XONjuQH|VKaE(=8^nlpmuxIMVY z(7-6Zb^lB~JZaqh{~1`mR&H=OH<<4Mye^S-3oSz|d?fpcp6bU5e~lR@y!_&&jPMs2 zqJ%kGO1t*@CTnn9&bfBVLlZ75w6eR_{S~?$6q7G3Cqi(Kf(in)ArymOW{Q9 z(G+A^_MxRh1>zuEgMb z7+jgb^BG))!OIz(&EO9hT$RCF7+j6Ph2gw~-Ne*Ck-?dES}^!1hMxHh&eX$YaCL@! z7=z=lY!QFPGdP>U3m6>VqY?RjeNYA^JYLLsH-f?OymQ7vD2)P+`^%hn4h*i1%7}g+ zh90K=l?;ycXQDrx5*T`z`lrJEA#LYu2FH5t^0ly73xLyh`ZG8){?9VF4$?vFzs}%e z7`%zWnR@i#eigT?%aAu=aHbwd250K2VQ{9NMh0i<`NrT(JyYOZPW#P{!Li?dqCcD* zfzy7=Wymwfv5dj79u-)>Dtpi~2yUUVe*En!;%8+BXZFjO!N)P=BN$wt!4nyrsizJ& z?T5Dvj_o%C`#TtVm~p5mfrL<^^^9e3tS27y7y_sLxtNl_4D$XA`SC~(@lOW4#enrN z$G4Kfnfq4_gHK@Sc?g`gzlp)I{rJ8Yr#6P3i6~F(83Ol9v^|r7)B0yIIMzP}^gA&0 zF#X(2$&2AiC=HbqTyb^2oxs&7J{b5K;MmSd=#SX{kijQ2_*+U3c~9;eL!LP<;c%0M z^-p2wxyImA8C)Fh>##g?zaGutN(}iK49*;Pdj?lw$VUOE{h!L<*fqJ}{|ts6rvDEx zxEe!$A%ipLT{VL>EJ~lC2S9Ke61N=36&9f9|kvN@JI${##JJNt1#q; zW8+Yw{b1Vz_wRv6^}t~p=f8agQ=H!(EPH&8LscL4GZ-#DC$Dh@JVrQSG0Y*n`Ewj| zyu5?!ah4yG_=@FWslZtljy;?($2t<=+=*ibC&G2`Vvo{v!KI5Yf=Z=B_kbUlQT#OQTdOHv2zufvz8dUFqj(xPm7E7je^nqp4pH*! zAzn{YTpFBujp8kE4!%S2*WianitoX}j#8`O(&e8T@WWS%A0X#f*w2am`ovg1EHv~PuC_WqdD+2SLj7uEEd0&c`K|GUvkI0_|e-5GK zE1_L^iVuZxA4%~GkRL_yaF}1(6#okGIga8@V5cF)`ERBoA5EwD5QtB6io3zQu%#{n9M+{;ij(v4eTwUY{>KzAg*bmk@qCEe7K)#R@p@13CYWFN zb4HwqA1;8M-ziSsXB39{P2{J*_)1bd9OnB7iW`GoRf;!&{Ah|>f&KXNN~WD_VH_t? zycf(b^4tlr^DvCB871Eb^vtHXGx*1)2fmczWuPa5;>#f(;we4|&fyy={t(7@H^te| zFY-P->DM5TE28CLT&_@j0oX~Nw;+1VVSgd-+Y=rS_PnL^Si^ewjp7$@MU;BO`b6}M zfN>v0ak8I{q z4eOG358R*PMzF3Pr1)nzC*PzvSvMc{z@JcD3D(0wFrK7e#~^+TDXszWK*pcQ6K+Mx z%R_tQa|9y42;%%0oJR=Hfblxp1HVA=Qt)RD#Y14c?om7e_Pa+EZ-D+jrFanZ=M}|& zVuMk7NAW(e4t%0`C)oLo;yLG8CTxc}0q! zgm_b?_+`+qLGjPvpD`3yg*P_FQ~VR`vy&+<0rJKakA(Hyg5qW%Z%c6(;BzS+4xD^m zL;Se`xGN=p2soGG<-mO@UJra3#f@Rzj-dEL;43K}20V`98-VjDei--$ieCbrLGcFQ zJ1PDZ_&$mcgn4w3;-i5dqqqpHOQ$HV2)vl$6MQzV{1(iw5fq;Y`?wm#V_{z-pFa{iXTo`DIweouH}Io4k&mLd62u{o z;tOD(+CcF;u+L>@zk~DSL5ll=-;PmS9@gtq6i>zuL8+MH8EdN%83z?glPON#Z?d8|vD1O#7-7irc`xA474{ zuk{pv2XUB5aZ@-Kq3_f16Y-A<%&#Jf?}m1-QalCp+@<(Ufm+rxiZ{VHwNacrPxG7N z7BDUnFmA-o+Yq0_D83ZpP@Uq>U;~&yaX+xrjN&pdzvfUJKR1jM`5d3vvmE*rK*_&@ zeI%OVa-b)f;ya*U+bBK{_NN0B9|ZE(C{E()5yj^U%x97F9kG81%sV-lPlSsCA4PEo z*r&!*ybjiRQ;L)4muFL)#HTC8H-dhDin~G_uAuk~=qHcjB+j={ob>ky#kWB`-={bS z&h5`BPUd4f#mW5rLvb>{`on%g{5$~mQ+bNtgz?p&IPu#=ij)4DQ=H7-xfCa#L%UJ@ zF~mtA#l2x(tfV-ZrzsRC>%(@6lX-fO;yYkpETFh3#Q!CVb0B|<;^gy`CW@1B{77+8 zSZ9=B{UhVD0QUDWJ@5$>7lSyNO!22M-z|FJUac4LuG*Vm|?0-vf8HlrQ6jz6Jqc_A0887@F zCE_%Q;^h3nrnn8*sZH^_Fi$5@ycYCZQ2ZYFXCB2nAa30#ehd5-KymW<+zN_o!~UB@ z@zXF*GbnBVcJ8P6Ls;ieQ2a2&LkY#j;6C&k#nWM(xleIPu;)3&&0wExqj(my`-|e! z!9V1=EHb{P5C`PBEW)E8Zbv}-gkKbd1Iv`+pMl#_T=2ieuvp6|z767SCB^@#~;?F2r#kn6JcseUKYV@mN@A%qV^V{7KH;M9%|QKZ7ax;}9pQ z6wd-bWK-M?>_16yHq6Hx6#oVOe@gK*@XuF@bK%@23FAZTSA_LMiQ?LzXBx%HdB6-f zUas-fBKI{5DfvgZA(WO<@^8TYWJ;c#PtquPGT#nT@=IVG3n}gg``1;9dqX^vb0x8# zd_TU8l23wp_lM%-b5cq0AMq!#XE?=0VLY^flXlm^xZ6_l;~-8PDS7g}*g#62w7Z(( z$ryZ)6+?!TUXgmqWX9z)8Qz?@2gO@ zCk^&BP2gl)$omHRlsx%e4QooCwChFjDG&$2lpgZ?H#|z7=-Ebb^8UttN)LICr(M?=QWtl*96;7SG*DX zmEZ;T8#ZMO^EiL-W1mW?oV+8;K39(1y1}&#>EbJG$l{o z*Nvq(7v$Gcocu083dPCy8PX_Do@>gW_*T%rgW}|S1$!u72=dt!KM(vc#jgTCPVs8s zrzn0O_<7(s3sZtm*uXJkax;pPb;g6@WPOXLI9WeQzleUaK3}Hf$$rsHak77jLO+Ne zvj39r*APz573BLegp>1+2c?Ic$KokY&W&W;h#qo|CExELoSdJ@`;ml``vNfxP$Hb% zr;zVi5KiucIFvlOk0YPY5P5R{m_*5w`&O1tNR)r5+Y)pQ4HjIz$*W+lpPLT;Eg+VT zhg+x{OJ_+)2umk8P>|u5dT^J7c?o{xLr3u1ZOM{gZa5Odl>r621$c3B)xXToCxDC8 z@~flv$V-gzFQTw?&`Y$%;)aL&t59GZ9!gPXy@z1)1MuA?gx2tC` z{&|!CFNuw`;2|gb0#RxNFUWpNID`kuvhcA%6#W@>5y1<#nc$iR@2lY3FkBbje&PQX z36{Y72qDF8TwD;DKVBID(KFCC+!3^q+o-@{=;KL>VtX~-ru@wzfM(9pL~Bzko#MoMtHIs3A@SK>=xo;BBNn zl#|O+H~_)z0l@-aK^+YDF<#?5No&agiU7Ehb_vcyFZ!TAI{uTOK0W@#ep3G$dVzJ) z^^2hXUaEkue;L*7Zv5&J1T8dy!Fc@eIf~RLthread || !pa_thread_is_running(m->thread) || !in_worker(m) || pa_atomic_load(&m->in_once_unlocked)' failed at ../pulseaudio/src/pulse/thread-mainloop.c:179, function pa_threaded_mainloop_lock(). Aborting. diff --git a/v-0.03/examples/switch-sink b/v-0.03/examples/switch-sink new file mode 100644 index 0000000000000000000000000000000000000000..22f0de56b578e4068642822436c051fdb91a8547 GIT binary patch literal 48016 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 Uo0mGrlArrM$Y$aqj> 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 +#include +#include +#include + +static pa_threaded_mainloop *mainloop; +static pa_context *context; +static int sink_count = 0; +static char **sink_names = NULL; + +void sink_list_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + (void) userdata; + if (eol > 0) { + int chosen; + printf("Enter the number of the sink to set as default: "); + scanf("%d", &chosen); + + if (chosen >= 0 && chosen < sink_count) { + pa_context_set_default_sink(c, sink_names[chosen], NULL, NULL); + } + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + sink_names = realloc(sink_names, sizeof(char*) * (sink_count + 1)); + sink_names[sink_count] = strdup(info->name); + printf("%d: %s (%s)\n", sink_count++, info->name, info->description); +} + +void context_state_cb(pa_context *c, void *userdata) { + (void) userdata; + + if (pa_context_get_state(c) == PA_CONTEXT_READY) { + pa_operation_unref(pa_context_get_sink_info_list(c, sink_list_cb, NULL)); + } +} + +int main(void) { + mainloop = pa_threaded_mainloop_new(); + pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "sink_switcher_threaded"); + + pa_context_set_state_callback(context, context_state_cb, NULL); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + pa_threaded_mainloop_start(mainloop); + + pa_threaded_mainloop_lock(mainloop); + pa_threaded_mainloop_wait(mainloop); // Wait until sink_list_cb signals completion + + for (int i = 0; i < sink_count; i++) { + free(sink_names[i]); + } + free(sink_names); + + pa_context_disconnect(context); + pa_context_unref(context); + pa_threaded_mainloop_unlock(mainloop); + pa_threaded_mainloop_stop(mainloop); + pa_threaded_mainloop_free(mainloop); + return 0; +} diff --git a/v-0.03/examples/switch-sink.c b/v-0.03/examples/switch-sink.c new file mode 100644 index 0000000..2859641 --- /dev/null +++ b/v-0.03/examples/switch-sink.c @@ -0,0 +1,70 @@ +/** + * Demo Code: PulseAudio Sink Switcher + * + * This demonstration code showcases the functionality of switching audio sinks + * using the PulseAudio API. It initializes the PulseAudio manager, loads available + * audio sinks, prompts the user to select a sink, and then switches to the chosen sink. + * + * Note: Ensure the PulseAudio server is running and in a good state before executing. + */ +#include "../easypulse_core.h" +#include +#include + +int main() { + // Initialize the PulseAudio Manager + pulseaudio_manager *manager = new_manager(); + pulseaudio_manager *self = manager; + + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudioManager.\n"); + manager->destroy(self); + return 1; + } + + if (!manager->load_devices(manager)) { + fprintf(stderr, "Failed to load devices.\n"); + manager->destroy(self); + return 1; + } + + // Display available devices to the user + printf("Available Sinks:\n"); + for (int i = 0; i < manager->device_count; i++) { + printf("%d. %s - %s\n", i + 1, manager->devices[i].name, manager->devices[i].description); + } + + // Prompt the user to select a device + printf("Enter the number of the sink you want to switch to: "); + int choice; + scanf("%d", &choice); + + + // Validate the user's choice + if (choice < 1 || choice > manager->device_count) { + fprintf(stderr, "Invalid choice.\n"); + manager->destroy(self); + return 1; + } + + + // Switch to the selected device + if (manager->switch_device(manager, choice - 1)) { + printf("Successfully switched to the selected device.\n"); + + //Get active device. + manager->get_active_device(manager); + + // Debug code to print the default device after the switch + fprintf(stderr, "[DEBUG]: Default device after switch: %s\n", manager->active_device_name); + } + else { + fprintf(stderr, "Failed to switch to the selected device.\n"); + return 1; + } + + // Cleanup + manager->destroy(self); + + return 0; +} diff --git a/v-0.03/examples/volume-change b/v-0.03/examples/volume-change new file mode 100644 index 0000000000000000000000000000000000000000..a5b21624c83e9b46e7b156a63b4a11db31817b04 GIT binary patch literal 48160 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 literal 0 HcmV?d00001 diff --git a/v-0.03/examples/volume-change-pulseaudio b/v-0.03/examples/volume-change-pulseaudio new file mode 100644 index 0000000000000000000000000000000000000000..a4315a3121bd004b8617858e1c16b8bb371f3537 GIT binary patch literal 50304 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 +#include +#include + +static pa_threaded_mainloop *mainloop; +static pa_context *context; + +/** + * @brief Callback function to set the volume of the default sink. + * + * This function fetches the current volume of the default sink, displays it, + * then prompts the user for a desired volume level, sets the volume, and finally + * displays the volume after the change. + * + * @param c The PulseAudio context. + * @param info Information about the current sink. + * @param eol End-of-list flag. + * @param userdata User data (unused). + */ +void set_volume_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + (void) userdata; + + if (eol > 0) { + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + // Prompt the user for the desired volume level first + int volume_percentage; + printf("Enter the desired volume (0-100): "); + scanf("%d", &volume_percentage); + + // Display the current volume percentage + int volume_percentage_before = (int)(100.0f * pa_cvolume_avg(&info->volume) / PA_VOLUME_NORM + 0.5); + printf("Volume before change: %d%%\n", volume_percentage_before); + + // Set the volume based on user input + pa_cvolume volume; + pa_cvolume_set(&volume, info->channel_map.channels, (volume_percentage * PA_VOLUME_NORM) / 100); + pa_context_set_sink_volume_by_index(c, info->index, &volume, NULL, NULL); + + // Display the volume after the change + int volume_percentage_after = (int)(100.0f * pa_cvolume_avg(&volume) / PA_VOLUME_NORM + 0.5); + printf("Volume after change: %d%%\n", volume_percentage_after); + + pa_threaded_mainloop_signal(mainloop, 0); +} + +/** + * @brief Callback function for context state changes. + * + * This function checks if the context is ready and then triggers the retrieval + * of the default sink's information. + * + * @param c The PulseAudio context. + * @param userdata User data (unused). + */ +void context_state_cb(pa_context *c, void *userdata) { + (void) c; + (void) userdata; + + if (pa_context_get_state(c) == PA_CONTEXT_READY) { + pa_operation_unref(pa_context_get_sink_info_by_name(c, "@DEFAULT_SINK@", set_volume_cb, NULL)); + } +} + +int main(void) { + // Initialize PulseAudio threaded mainloop and context + mainloop = pa_threaded_mainloop_new(); + pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "volume_changer_threaded"); + + // Set context state callback and connect the context + pa_context_set_state_callback(context, context_state_cb, NULL); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + + // Start the threaded mainloop + pa_threaded_mainloop_start(mainloop); + + // Lock the mainloop and wait for operations to complete + pa_threaded_mainloop_lock(mainloop); + pa_threaded_mainloop_wait(mainloop); + + // Cleanup and free resources + pa_context_disconnect(context); + pa_context_unref(context); + pa_threaded_mainloop_unlock(mainloop); + pa_threaded_mainloop_stop(mainloop); + pa_threaded_mainloop_free(mainloop); + return 0; +} diff --git a/v-0.03/examples/volume-change.c b/v-0.03/examples/volume-change.c new file mode 100644 index 0000000..ec00934 --- /dev/null +++ b/v-0.03/examples/volume-change.c @@ -0,0 +1,80 @@ +/** + * @file volume_app.c + * @brief PulseAudio Volume Control Application + * + * This application provides a simple interface to interact with PulseAudio. + * It displays the current active device, its name, and the master volume. + * The user can then input a new volume value, which the application attempts + * to set. The result of the operation (success or failure) is displayed to the user. + * + * The application leverages the EasyPulse library to communicate with PulseAudio. + * + * + * @date 10-08-2023 (creation date) + */ + +#include +#include +#include "../easypulse_core.h" + +int main() { + // Initialize the pulseaudio manager + pulseaudio_manager *manager = new_manager(); + pulseaudio_manager *self = manager; + + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudioManager.\n"); + manager->destroy(self); + return 1; + } + + // Load available devices + if (!manager->load_devices(manager)) { + fprintf(stderr, "Failed to load devices.\n"); + manager->destroy(self); + return 1; + } + + // Get the active device + manager->get_active_device(self); + + // Display the active device and its master volume + uint32_t active_device_index = manager->active_device_index; + uint32_t total_channels = manager->get_device_channels(self->devices, self->active_device_index); + + printf("DEBUG, total_channels is: %lu\n", (long unsigned int) total_channels); + + + printf("Current Sink: %s\n", manager->active_device_name); + + // Debug: Print the volume of individual channels of the active device + for (uint32_t channel = 0; channel < total_channels; channel++) { + printf("Channel %d volume before change: %f%%\n", + channel, + (100.0 * manager->devices[active_device_index].volume.values[channel] / PA_VOLUME_NORM)); + } + + printf("Master Volume: %f%%\n", + (100.0 * pa_cvolume_avg(&manager->devices[active_device_index].volume) / PA_VOLUME_NORM)); + + + // Ask the user for a new volume value + float new_volume; + printf("Enter a new volume value (0.0 - 100.0): "); + scanf("%f", &new_volume); + + // Set the new volume + manager->set_volume(manager, manager->active_device_index, new_volume); + + + // Debug: Print the volume of individual channels of the active device + for (uint32_t channel = 0; channel < total_channels; channel++) { + printf("Channel %d volume after change: %f%%\n", + channel, + (100.0 * manager->devices[active_device_index].volume.values[channel] / PA_VOLUME_NORM)); + } + + // Cleanup and exit + manager->destroy(self); + return 0; +} diff --git a/v-0.03/libeasypulse_core.a b/v-0.03/libeasypulse_core.a new file mode 100644 index 0000000000000000000000000000000000000000..749fcb8bd7742ef023e4a9698fa176b888c06bfd GIT binary patch literal 36814 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 literal 0 HcmV?d00001 From d7a0e42b609f852e7707da635c7249cca53a9351 Mon Sep 17 00:00:00 2001 From: NMagic Date: Fri, 13 Oct 2023 23:04:02 -0300 Subject: [PATCH 03/20] Deleted files. --- current/Makefile | 20 - .../pa_context -- interface overview.docx | Bin 33970 -> 0 bytes .../pavucontrol sink update flow.txt | 41 -- .../pulseaudio/introspect.c summary | 79 --- .../pulseaudio/mainloop code flow.txt | 17 - current/easypulse_core.c | 659 ------------------ current/easypulse_core.h | 81 --- current/examples/Makefile | 19 - current/examples/error.txt | 4 - current/examples/switch-sink | Bin 47960 -> 0 bytes current/examples/switch-sink-pulseaudio | Bin 50184 -> 0 bytes current/examples/switch-sink-pulseaudio.c | 62 -- current/examples/switch-sink.c | 70 -- current/examples/volume-change | Bin 48096 -> 0 bytes current/examples/volume-change-pulseaudio | Bin 50240 -> 0 bytes current/examples/volume-change-pulseaudio.c | 101 --- current/examples/volume-change.c | 80 --- 17 files changed, 1233 deletions(-) delete mode 100644 current/Makefile delete mode 100644 current/documentation/pa_context -- interface overview.docx delete mode 100644 current/documentation/pavucontrol/pavucontrol sink update flow.txt delete mode 100644 current/documentation/pulseaudio/introspect.c summary delete mode 100644 current/documentation/pulseaudio/mainloop code flow.txt delete mode 100644 current/easypulse_core.c delete mode 100644 current/easypulse_core.h delete mode 100644 current/examples/Makefile delete mode 100644 current/examples/error.txt delete mode 100644 current/examples/switch-sink delete mode 100644 current/examples/switch-sink-pulseaudio delete mode 100644 current/examples/switch-sink-pulseaudio.c delete mode 100644 current/examples/switch-sink.c delete mode 100644 current/examples/volume-change delete mode 100644 current/examples/volume-change-pulseaudio delete mode 100644 current/examples/volume-change-pulseaudio.c delete mode 100644 current/examples/volume-change.c diff --git a/current/Makefile b/current/Makefile deleted file mode 100644 index b1c5107..0000000 --- a/current/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -CC = gcc -CFLAGS = -Wall -g -Wextra - -LIB_NAME = easypulse_core -LIB_SRC = easypulse_core.c -LIB_OBJ = easypulse_core.o -LIB_OUT = lib$(LIB_NAME).a - -all: $(LIB_OUT) - -$(LIB_OUT): $(LIB_OBJ) - ar rcs $(LIB_OUT) $(LIB_OBJ) - -$(LIB_OBJ): $(LIB_SRC) - $(CC) $(CFLAGS) -c $(LIB_SRC) -o $(LIB_OBJ) - -clean: - rm -f $(LIB_OBJ) $(LIB_OUT) - -.PHONY: all clean diff --git a/current/documentation/pa_context -- interface overview.docx b/current/documentation/pa_context -- interface overview.docx deleted file mode 100644 index 6cbe2d09c38dfcab843409c88d5b9d8666c90192..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33970 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 diff --git a/current/documentation/pavucontrol/pavucontrol sink update flow.txt b/current/documentation/pavucontrol/pavucontrol sink update flow.txt deleted file mode 100644 index 9428de8..0000000 --- a/current/documentation/pavucontrol/pavucontrol sink update flow.txt +++ /dev/null @@ -1,41 +0,0 @@ -+----------------+ -| pavucontrol | -| (initial file)| -+----------------+ - | - | Callback function triggered when there's info/change related to a sink - V -+----------------+ -| sink_cb | -| (pavucontrol.cc)| -+----------------+ - | - | - If error, show error and return - | - If end-of-list (eol) is reached, decrease outstanding tasks count and return - | - Update GUI representation of a sink using w->updateSink() - V -+---------------------------+ -| MainWindow::updateSink | -| (mainwindow.cc & .h) | -+---------------------------+ - | - | - Retrieve or create SinkWidget for the sink - | - Update SinkWidget properties (e.g., volume, mute state, active port, etc.) - | - Prepare context menu for the sink - | - Ensure the sink is displayed correctly via updateDeviceVisibility - V -+-------------------------------------+ -| MainWindow::updateDeviceVisibility | -| (mainwindow.cc & .h) | -+-------------------------------------+ - | - | - If idle source/callback is already queued, return - | - Schedule the idle_cb function to be called when the app is idle - V -+----------------+ -| idle_cb | -| (mainwindow.cc)| -+----------------+ - | - V - ... (Specific steps and logic for updating device visibility) diff --git a/current/documentation/pulseaudio/introspect.c summary b/current/documentation/pulseaudio/introspect.c summary deleted file mode 100644 index d9616f2..0000000 --- a/current/documentation/pulseaudio/introspect.c summary +++ /dev/null @@ -1,79 +0,0 @@ -* !pa_tagstruct_eof (context_string_callback): this function seems to be a callback function for processing string responses from the server. It examines the incoming command and checks for errors. If there's an error or if the command isn't a reply, it sets the success flag to 0 and prepares an empty response string. If the command is a reply, it extracts the response string from the tag structure. If there's any issue with extracting the string or if there's unexpected data in the tag structure, it flags a protocol error. - -* pa_context_stat: this function sends a simple command to request statistics. It leverages another function pa_context_send_simple_command and provides the context_stat_callback as the callback function to handle the response. It's used to retrieve statistical information. - -* pa_context_get_server_info: similar to the previous function, this function sends a command to get server information. It again uses pa_context_send_simple_command, but this time with a different callback, context_get_server_info_callback, to process the server information response. - -* context_get_sink_info_callback: this function is a callback that processes information about a sink. It first ensures that the operation and context are valid. If the received command is not a reply, it handles the error. If it is a reply, it starts parsing the sink information from the tag structure, extracting details like the sink's name, description, sample specification, channel map, owner module, volume, mute status, monitor source, latency, and more. The function seems to account for different versions of the context and extracts varying levels of information based on that. - -* pa_tagstruct_getu32: this function seems to be a snippet or part of another function and is possibly not a standalone function. It attempts to retrieve a 32-bit unsigned integer from a tag structure. If unsuccessful, it returns an error indicating a protocol issue. - -* pa_context_get_sink_info_list: this function sends a command to retrieve a list of sink information. It utilizes the pa_context_send_simple_command function and provides the context_get_sink_info_callback as the callback to process the list of sinks. - -* pa_context_get_sink_info_by_index: this function requests information about a specific sink identified by its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SINK_INFO) with the specified sink index and sends it to the server. The response from the server is expected to be handled by the context_get_sink_info_callback. - -* pa_context_get_sink_info_by_name: similar to the previous function, this one requests information about a sink, but it identifies the sink by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SINK_INFO) with the specified sink name to the server. The server's response will be processed by the context_get_sink_info_callback. - -* pa_context_set_sink_port_by_index: this function is designed to set the port for a specific sink identified by its index. After some validity checks, it builds a command (PA_COMMAND_SET_SINK_PORT) with the given sink index and port information, then sends this command to the server. The acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. - -* pa_context_set_sink_port_by_name: this function sets the port of a sink based on its name. It first performs some validation checks, then constructs a command with the sink's name and desired port. This command is sent to the PulseAudio server, and the response will be handled by a generic acknowledgment callback. - -* context_get_source_info_callback: this callback function processes information about a source. It starts by performing some initializations and checks. If the received command is a reply, it begins parsing the source information from the tag structure. This includes extracting details like the source's name, description, sample specification, volume, mute status, latency, and more. It appears to accommodate different versions of the context, extracting varying levels of information based on that. - -* pa_context_get_source_info_list: this function sends a command to retrieve a list of source information. It employs the pa_context_send_simple_command function, providing the context_get_source_info_callback as the callback to process the list of sources. - -* pa_context_get_source_info_by_index: this function retrieves information about a specific audio source based on its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source index and sends it to the server. The response from the server is expected to be handled by the context_get_source_info_callback. - -* pa_context_get_source_info_by_name: similar to the previous function, this one retrieves information about a source but identifies the source by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source name to the server. The server's response is again expected to be processed by the context_get_source_info_callback. - -* pa_context_set_source_port_by_index: this function sets the port of a specific source based on its index. After performing some validity checks and ensuring that the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source index. This command is sent to the server, and the acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. - -* pa_context_set_source_port_by_name: this function is designed to set the port of a specific audio source based on its name. It constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source name and sends this command to the PulseAudio server. The server's response will be handled by a generic acknowledgment callback. - -* context_get_client_info_callback: This callback function processes client-related information. It first performs checks to ensure the received command is a reply. If it is, the function begins parsing the client information, extracting details like client index, name, owner module, and driver. The function appears to be prepared to handle multiple client records in the same response and will loop through them until the end of the tag structure. - -* pa_context_get_client_info: this function requests information about a specific client based on its index. It constructs and sends a command (PA_COMMAND_GET_CLIENT_INFO) with the specified client index to the server. The server's response is expected to be processed by the context_get_client_info_callback. - -* pa_context_get_client_info_list: this function requests a list of client information from the PulseAudio server. It utilizes the pa_context_send_simple_command function and specifies the PA_COMMAND_GET_CLIENT_INFO_LIST command. The response from the server is expected to be handled by the context_get_client_info_callback. - - -* card_info_free: this is a utility function designed to free the memory associated with a pa_card_info structure. It releases memory for various properties and profiles associated with the card, such as its property list (proplist), profiles (profiles), and extended profile information (profiles2). - -* fill_card_port_info: this function populates the port information for a given card. It starts by extracting the number of ports (n_ports) for the card from a tag structure. If the card has ports, it then proceeds to fill in details about each port. If there's a protocol error while fetching the details, it returns an error. - -* fill_card_profile_info: this function is responsible for populating the profile information of a given card. It begins by allocating memory for the profiles and then proceeds to iterate through each profile, extracting details like name, description, number of sinks, number of sources, and priority. It also accounts for different versions of the context, fetching additional details if the version is >= 29. - - -* context_get_card_info_callback: this callback function processes card-related information. It starts by performing initialization checks and then examines the received command. If the command is a reply, the function starts parsing card details like index, name, owner module, driver, and the number of profiles. It then calls the fill_card_profile_info function to populate the profiles for the card. If there are any protocol errors during this process, the function handles them accordingly. - - -* pa_tagstruct_get_proplist: This function seems to be a snippet or a partial representation of a larger function. Its purpose appears to be to extract a property list (proplist) from a tag structure. If there's any issue during this extraction, it flags an error. - - -* pa_context_get_card_info_by_index: this function requests information about a specific card based on its index. After performing several validity checks, it constructs a command (PA_COMMAND_GET_CARD_INFO) with the specified card index and sends it to the server. The response from the server will be processed by the context_get_card_info_callback. - -* pa_context_get_card_info_by_name: similar to the previous function, this one requests information about a card, but it identifies the card by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_CARD_INFO) with the specified card name to the server. Again, the server's response is expected to be processed by the context_get_card_info_callback. - -* pa_context_get_card_info_list: this function requests a list of all card information from the PulseAudio server. It employs the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_CARD_INFO_LIST command. The response from the server will be processed by the context_get_card_info_callback. - -* pa_context_set_card_profile_by_index: this function sets the profile of a specific card based on its index. After checking the validity of the context and ensuring the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the specified card index and desired profile. This command is sent to the server, and the response is handled by a generic acknowledgment callback. - -* pa_context_set_card_profile_by_name: this function sets the profile of a card identified by its name. Like the previous function, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the card name and desired profile, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. - -* context_get_module_info_callback: this callback function processes module-related information. It checks if the received command is a reply and, if so, starts parsing the module details. This includes extracting details like the module's index, name, argument, and usage count. If there's an error or unexpected end of file in the tag structure, it flags a protocol error. - -* pa_context_get_module_info: this function retrieves information about a specific module based on its index. After conducting various validity checks, it constructs a command (PA_COMMAND_GET_MODULE_INFO) with the specified module index and sends it to the server. The response from the server will be processed by the context_get_module_info_callback. - -* pa_context_get_module_info_list: this function requests a list of all module information from the PulseAudio server. It uses the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_MODULE_INFO_LIST command. The server's response will be processed by the context_get_module_info_callback. - -* context_get_sink_input_info_callback: this callback function processes information related to sink inputs. It checks if the received command is a reply and, if so, starts parsing the sink input details. This includes extracting details like the sink input's index, name, owner module, client, sink, sample specification, channel map, volume, buffer usec, sink usec, resample method, driver, and more. It also accounts for different versions of the context, extracting varying levels of information based on that. - -* pa_context_set_source_output_volume: this function sets the volume of a specific source output based on its index. It starts by performing various checks, including verifying the validity of the provided volume. It then constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_VOLUME) with the specified source output index and volume and sends it to the server. The server's response will be processed by a generic acknowledgment callback. - -* pa_context_set_source_output_mute: this function mutes or unmutes a specific source output based on its index. It constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_MUTE) with the desired mute status and the source output index, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. - -* context_get_sample_info_callback: this callback function processes sample-related information. It checks if the received command is a reply and, if so, begins parsing the sample details, extracting attributes like the sample's index, name, volume, mute status, proplist, and more. The function also handles possible protocol errors and is prepared to process multiple sample records in the same response. - -* pa_context_suspend_source_by_index: this function suspends or resumes a specific source based on its index. It verifies the server version, constructs a command (PA_COMMAND_SUSPEND_SOURCE) with the desired suspend status and source index, and then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. - -* pa_context_send_message_to_object: this function sends a message to a specific object within the PulseAudio server. After checking the server version and other conditions, it constructs a command (PA_COMMAND_SEND_OBJECT_MESSAGE) with the object's path, the message, and any additional parameters. The server's response will be processed by a callback function. diff --git a/current/documentation/pulseaudio/mainloop code flow.txt b/current/documentation/pulseaudio/mainloop code flow.txt deleted file mode 100644 index f4c8b96..0000000 --- a/current/documentation/pulseaudio/mainloop code flow.txt +++ /dev/null @@ -1,17 +0,0 @@ -+---------------------------------------------+ -| Mainloop | -| | -| +--------------+ +-------------------+ | -| | I/O Events | | Timers | | -| +--------------+ +-------------------+ | -| | -| +--------------+ +-------------------+ | -| | Signals | | Deferred Callbacks| | -| +--------------+ +-------------------+ | -| | -| +---------------------+ | -| | Other Asynchronous | | -| | Tasks | | -| +---------------------+ | -| | -+---------------------------------------------+ diff --git a/current/easypulse_core.c b/current/easypulse_core.c deleted file mode 100644 index e9c4355..0000000 --- a/current/easypulse_core.c +++ /dev/null @@ -1,659 +0,0 @@ -/** - * @file easypulse_core.c - * @brief Implementation of the easypulse core functions. - * - * This file provides the core functionality to interact with PulseAudio, - * allowing operations like setting the default sink and adjusting volume. - */ - -#include "easypulse_core.h" -#include -#define INITIAL_ALLOCATION_SIZE 5 -#include -#include - -/** - * @brief Callback function for retrieving sink information. - * @param c The PulseAudio context. - * @param i The sink information. - * @param eol End of list flag. - * @param userdata User-provided data (expected to be a pointer to pulseaudio_manager). - */ -static void sink_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { - pulseaudio_manager *manager = (pulseaudio_manager *)userdata; - - // Check if we need to resize the sinks array - if (manager->sink_count % INITIAL_ALLOCATION_SIZE == 0) { // Resize every time we hit a multiple of INITIAL_ALLOCATION_SIZE - size_t newSize = (manager->sink_count + INITIAL_ALLOCATION_SIZE) * sizeof(pulseaudio_sink); - pulseaudio_sink *new_sinks = realloc(manager->sinks, newSize); - - if (!new_sinks) { - fprintf(stderr, "[ERROR]: Failed to resize the sinks array.\n"); - free(manager->sinks); // Free old memory - manager->sinks = NULL; - manager->sink_count = 0; // Reset sink_count to prevent out-of-bounds access - pa_threaded_mainloop_signal(manager->mainloop, 0); - return; - } - manager->sinks = new_sinks; - } - - if (eol < 0) { - if (pa_context_errno(c) != PA_ERR_NOENTITY) - fprintf(stderr, "Sink callback failure\\n"); - pa_threaded_mainloop_signal(manager->mainloop, 0); - return; - } - - if (eol > 0) { - manager->sinks_loaded = 1; - pa_threaded_mainloop_signal(manager->mainloop, 0); - return; - } - - // Store the sink's information - pulseaudio_sink sink; - sink.index = i->index; - sink.name = strdup(i->name); - sink.description = strdup(i->description); - sink.volume = i->volume; - sink.channel_map = i->channel_map; - sink.mute = i->mute; - - // Add the sink to the manager's list - manager->sinks[manager->sink_count++] = sink; -} - - -/** - * @brief Callback function to check the state of the PulseAudio context. - * @param c The PulseAudio context. - * @param userdata User-provided data (expected to be a pointer to an int indicating readiness). - */ -static void context_state_cb(pa_context *c, void *userdata) { - pa_context_state_t state; - pulseaudio_manager *manager = (pulseaudio_manager *) userdata; - int *pa_ready = &(manager->pa_ready); - pa_threaded_mainloop *m = manager->mainloop; - - state = pa_context_get_state(c); - switch (state) { - // There are other states you can handle, but these are the important ones - case PA_CONTEXT_CONNECTING: - case PA_CONTEXT_AUTHORIZING: - case PA_CONTEXT_SETTING_NAME: - default: - break; - case PA_CONTEXT_READY: - *pa_ready = 1; - pa_threaded_mainloop_signal(m, 0); - break; - case PA_CONTEXT_FAILED: - case PA_CONTEXT_TERMINATED: - *pa_ready = 2; - pa_threaded_mainloop_signal(m, 0); - break; - } -} - -/** - * @brief Initializes the pulseaudio_manager. - * - * @param self Pointer to the pulseaudio_manager instance. - * @return Boolean indicating success or failure. - */ -bool initialize(pulseaudio_manager *self) { - // 1. Create the threaded mainloop - self->mainloop = pa_threaded_mainloop_new(); - if (!self->mainloop) { - return false; - } - - // Get the mainloop API - pa_mainloop_api *mlapi = pa_threaded_mainloop_get_api(self->mainloop); - - // Create the context - self->context = pa_context_new(mlapi, "PulseAudio Manager"); - if (!self->context) { - pa_threaded_mainloop_free(self->mainloop); - return false; - } - - // Set the state callback - pa_context_set_state_callback(self->context, context_state_cb, self); - - // Lock the mainloop and connect the context - pa_threaded_mainloop_lock(self->mainloop); - - if (pa_context_connect(self->context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) { - pa_threaded_mainloop_unlock(self->mainloop); - pa_threaded_mainloop_free(self->mainloop); - return false; - } - - // 2. Start the threaded mainloop - pa_threaded_mainloop_start(self->mainloop); - - // 4. Wait for the context to be ready - while (self->pa_ready == 0) { - pa_threaded_mainloop_wait(self->mainloop); - } - - pa_threaded_mainloop_unlock(self->mainloop); - - if (self->pa_ready == 2) { - return false; - } - - return true; -} - - -/** - * @brief Cleans up the pulseaudio_manager. - * - * @param self Pointer to the pulseaudio_manager instance. - * @return Boolean indicating success or failure. - */ -static bool cleanup(pulseaudio_manager *self) { - // Lock the mainloop before making changes to the context - pa_threaded_mainloop_lock(self->mainloop); - - // Disconnect the context - pa_context_disconnect(self->context); - - // Unlock the mainloop before stopping it - pa_threaded_mainloop_unlock(self->mainloop); - - // Stop the threaded mainloop - pa_threaded_mainloop_stop(self->mainloop); - - // Unreference the context - pa_context_unref(self->context); - - // Free the threaded mainloop - pa_threaded_mainloop_free(self->mainloop); - - return true; -} - -/** - * @brief Load available sound cards (sinks). - * @param self The pulseaudio_manager instance. - * @return true on success, false otherwise. - */ -bool load_sinks(pulseaudio_manager *self) { - pa_operation *op; - op = pa_context_get_sink_info_list(self->context, sink_cb, self); - - if (!op) { - return false; - } - - self->iterate(self, op); - return true; -} - -/** - * @brief Retrieve a list of available sinks. - * @param self A pointer to the pulseaudio_manager instance. - * @return A pointer to an array of available sinks. The caller is responsible for freeing this memory. - */ -pulseaudio_sink* get_sink_list(pulseaudio_manager *self) { - if (!self || !self->sinks_loaded) { - fprintf(stderr, "[ERROR]: Manager not initialized or sinks not loaded.\n"); - return NULL; - } - - // Allocate memory for the list of sinks - pulseaudio_sink *sinks_list = malloc(self->sink_count * sizeof(pulseaudio_sink)); - if (!sinks_list) { - fprintf(stderr, "[ERROR]: Failed to allocate memory for sinks list.\n"); - return NULL; - } - - // Copy sink information from the manager's sinks array - for (uint32_t i = 0; i < self->sink_count; i++) { - sinks_list[i] = self->sinks[i]; - } - - return sinks_list; -} - -/** - * @brief Callback function handling the completion of the "unmute" operation. - * - * @param c The PulseAudio context. - * @param success A flag indicating the success or failure of the operation. - * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. - */ -static void operation_complete_unmute_cb(pa_context *c, int success, void *userdata) { - (void)c; // Suppress unused parameter warning - - pulseaudio_manager* manager = (pulseaudio_manager*) userdata; - manager->operations_pending--; - - if (!success) { - fprintf(stderr, "Failed to unmute the sink input.\n"); - } - - // Signal the mainloop to resume any waiting threads. - pa_threaded_mainloop_signal(manager->mainloop, 0); -} - -/** - * @brief Callback function handling the completion of the "move" operation. - * - * @param c The PulseAudio context. - * @param success A flag indicating the success or failure of the operation. - * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. - */ -static void operation_complete_move_cb(pa_context *c, int success, void *userdata) { - pulseaudio_manager* manager = (pulseaudio_manager*) userdata; - - if (success) { - pa_operation* unmute_op = pa_context_set_sink_input_mute(c, manager->current_sink_index, 0, operation_complete_unmute_cb, manager); - pa_operation_unref(unmute_op); - } else { - // Handle error... - pa_threaded_mainloop_signal(manager->mainloop, 0); - } -} - -/** - * @brief Callback function handling the completion of the "mute" operation. - * - * @param c The PulseAudio context. - * @param success A flag indicating the success or failure of the operation. - * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. - */ -static void operation_complete_mute_cb(pa_context *c, int success, void *userdata) { - pulseaudio_manager* manager = (pulseaudio_manager*) userdata; - uint32_t target_sink_index = manager->current_sink_index; - - if (success) { - pa_operation* move_op = pa_context_move_sink_input_by_index(c, manager->current_sink_index, target_sink_index, operation_complete_move_cb, manager); - pa_operation_unref(move_op); - } else { - // Handle error... - pa_threaded_mainloop_signal(manager->mainloop, 0); - } -} - -/** - * @brief Callback function to handle each sink input. - * @param c The PulseAudio context. - * @param i The sink input information. - * @param eol End of list flag. - * @param userdata User-provided data (expected to be a pointer to the target sink index). - */ -static void switch_sink_cb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata) { - pulseaudio_manager* manager = (pulseaudio_manager*) userdata; - - if (!eol && i) { - // Move this sink input to the desired sink - pa_operation* move_op = pa_context_move_sink_input_by_index(c, i->index, manager->sinks[manager->current_sink_index].index, NULL, NULL); - pa_operation_unref(move_op); - } - - if (eol) { - pa_threaded_mainloop_signal(manager->mainloop, 0); - } -} - -/** - * @brief Switches the sink (audio source) for the pulseaudio_manager. - * - * @param self Pointer to the pulseaudio_manager instance. - * @param sink_index Index of the sink to switch to. - * @return Boolean indicating success or failure. - */ -bool switch_sink(pulseaudio_manager *self, uint32_t sink_index) { - // Ensure the context is valid - if (!self || !self->context) { - return false; - } - - // Check if sink_index is out of bounds - if (sink_index >= self->sink_count) { - fprintf(stderr, "[ERROR]: sink_index out of bounds.\n"); - return false; - } - - self->current_sink_index = sink_index; - - // Set the desired sink as the default sink - /*fprintf(stderr, "[DEBUG]: self->context = %p\n", self->context); - fprintf(stderr, "[DEBUG]: self->sinks = %p\n", self->sinks); - fprintf(stderr, "[DEBUG]: sink_index = %d\n", sink_index);*/ - - if (self->sinks) { - // Check if the name attribute is NULL - if (!self->sinks[sink_index].name) { - fprintf(stderr, "[ERROR]: Sink's name is NULL.\n"); - return false; - } - //fprintf(stderr, "[DEBUG]: self->sinks[sink_index].name = %s\n", self->sinks[sink_index].name); - } - pa_operation* set_default_op = pa_context_set_default_sink(self->context, self->sinks[sink_index].name, NULL, NULL); - pa_operation_unref(set_default_op); - - // Use the introspect API to get a list of all sink inputs - pa_operation *op = pa_context_get_sink_input_info_list(self->context, switch_sink_cb, self); - - if (!op) { - return false; - } - - while (pa_operation_get_state(op) == PA_OPERATION_RUNNING) { - self->iterate(self, op); - } - - pa_operation_unref(op); - - return true; -} -/** - * @brief Callback function to check the volume of the PulseAudio context. - * - * @param c Pointer to the PulseAudio context. - * @param i Information about the sink. - * @param eol End of list flag. - * @param userdata User-provided data. - */ -static void set_volume_check_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { - (void) c; - pulseaudio_manager *self = (pulseaudio_manager *)userdata; - - if (eol > 0) { - //printf("[DEBUG, volume_check_cb()]: End-of-list reached.\n"); - self->operations_pending--; - return; - } - - if (!i) { - fprintf(stderr, "[ERROR, volume_check_cb()]: Null pointer for pa_sink_info.\n"); - self->operations_pending--; - return; - } - - if (!i->name) { - fprintf(stderr, "[ERROR, volume_check_cb()]: Null pointer for sink name.\n"); - self->operations_pending--; - return; - } - - printf("[DEBUG, volume_check_cb()]: Processing sink info for sink: %s\n", i->name); - - // Update the volume values in the manager's sinks structure - self->sinks[self->active_sink_index].volume = i->volume; - - // Print the volume for each channel - for (int channel = 0; channel < i->volume.channels; channel++) { - //float volume_percentage = (float)i->volume.values[channel] / PA_VOLUME_NORM * 100.0; - //printf("Channel %d Volume: %.2f%%\n", channel, volume_percentage); - } - - //Signaling to continue. - pa_threaded_mainloop_signal(self->mainloop, 0); -} - -// Completion callback for volume set operation -static void volume_set_complete_cb(pa_context *c, int success, void *userdata) { - (void) c; - pulseaudio_manager* manager = (pulseaudio_manager*) userdata; - - //printf("[DEBUG, volume_set_complete_cb()]: inside volume_set_complete_cb()\n"); - //printf("[DEBUG, volume_set_complete_cb()]: sink name is, %s\n", manager->active_sink_name); - - if (!success) { - fprintf(stderr, "[ERROR]: Failed to set volume. Reason: %s\n", pa_strerror(pa_context_errno(c))); - } - - // Debug: Print cvolume values for each channel as percentages - //pa_cvolume cvolume = manager->sinks[manager->active_sink_index].volume; - - /*for (int i = 0; i < cvolume.channels; i++) { - float percentage = (cvolume.values[i] / (float)PA_VOLUME_NORM) * 100; - //printf("[DEBUG, volume_set_complete_cb()]: Channel %d cvolume value: %u (%.2f%%)\n", i, cvolume.values[i], percentage); - } - //printf("[DEBUG, volume_set_complete_cb invoked. Success: %d\n", success);*/ - - // Decrease the operations count and potentially signal the condition variable. - manager->operations_pending--; - - // Signal the main loop to continue - pa_threaded_mainloop_signal(manager->mainloop, 0); -} - -/** - * @brief Retrieves the number of channels for a specified sink. - * - * @param sinks Pointer to an array of PulseSink structures. - * @param sink_index Index of the sink whose number of channels is to be retrieved. - * - * @return Number of channels for the specified sink. Returns -1 on error. - */ -int get_sink_channels(const pulseaudio_sink *sinks, int sink_index) { - if (!sinks || sink_index < 0) { - fprintf(stderr, "[ERROR]: Invalid sinks array or sink index in get_sink_channels.\n"); - return -1; // Return -1 or another indicator of failure - } - return sinks[sink_index].channel_map.channels; -} - - -/** - * @brief Set the volume for a specified sink. - * - * This function allows setting the volume for a specific sink based on the given percentage. - * The function performs various checks to ensure valid inputs and that the PulseAudio system is ready. - * It will adjust the volume for all channels of the sink to the desired level. - * - * @param self Pointer to the pulseaudio_manager instance. - * @param sink_index Index of the sink to set the volume for. - * @param percentage Desired volume level as a percentage. - * @return Boolean indicating success or failure. - */ -bool set_volume(pulseaudio_manager *self, uint32_t sink_index, float percentage) { - if (!self || percentage < 0.0f || percentage > 100.0f || sink_index >= self->sink_count) { - return false; - } - - // Convert percentage to volume - pa_volume_t volume = (percentage / 100.0) * PA_VOLUME_NORM; - if (volume >= PA_VOLUME_NORM) { - volume = PA_VOLUME_NORM - 1; - } - - // Debug: show index and desired volume. - //printf("[DEBUG, set_volume()] Index is: %i\n", sink_index); - //printf("[DEBUG, set_volume()] Desired volume: %f%% (value: %u)\n", percentage, volume); - - // Ensure PulseAudio is ready and sinks are loaded - if (self->pa_ready != 1 || self->sinks_loaded != 1) { - return false; - } - - // Debug: Show channel volumes before the change. - /*for (int channel = 0; channel < self->sinks[sink_index].channel_map.channels; channel++) { - printf("[DEBUG, set_volume()]: Channel %d Before volume: %f%%\n", - channel, - 100.0 * self->sinks[sink_index].volume.values[channel] / PA_VOLUME_NORM); - }*/ - - // Create a pa_cvolume structure and set the volume for all channels - pa_cvolume cvolume; - pa_cvolume_init(&cvolume); - cvolume.channels = self->sinks[sink_index].channel_map.channels; // Manually set channels - pa_cvolume_set(&cvolume, cvolume.channels, volume); - - printf("[DEBUG, set_volume()] channels: %d\n", cvolume.channels); - - // Apply the volume change to the specific sink by index and wait for the operation to complete - const char *sink_name_to_change = self->sinks[sink_index].name; - self->operations_pending++; - pa_operation *op = pa_context_set_sink_volume_by_name(self->context, sink_name_to_change, &cvolume, volume_set_complete_cb, self); - self->iterate(self, op); - - // Fetch the updated volume for the sink and wait for the operation to complete - pa_operation *op2 = pa_context_get_sink_info_by_name(self->context, sink_name_to_change, set_volume_check_cb, self); - self->iterate(self, op2); - - return true; -} - - -/** - * @brief Iterates through operations in the pulseaudio_manager. - * - * @param manager Pointer to the pulseaudio_manager instance. - * @param op Pointer to the pa_operation instance. - */ -void iterate(pulseaudio_manager *manager, pa_operation *op) { - pa_threaded_mainloop_lock(manager->mainloop); - - if (!op) { - pa_threaded_mainloop_signal(manager->mainloop, 0); // Signal completion even if there's no operation - pa_threaded_mainloop_unlock(manager->mainloop); - return; - } - - const int MAX_WAIT_CYCLES = 100; // For example, wait for 100 cycles - int wait_cycles = 0; - - // Wait for the operation to complete, but not indefinitely - while (pa_operation_get_state(op) == PA_OPERATION_RUNNING) { - if (wait_cycles >= MAX_WAIT_CYCLES) { - fprintf(stderr, "Error: Operation timeout. Exiting loop.\\n"); - break; // Exit the loop if we've waited for too long - } - - pa_threaded_mainloop_wait(manager->mainloop); - wait_cycles++; - } - - pa_threaded_mainloop_signal(manager->mainloop, 0); // Signal that iteration is complete - pa_threaded_mainloop_unlock(manager->mainloop); -} - - -/** - * @brief Create a new pulseaudio_manager instance. - * @return Returns a pointer to a manager structure. - */ -pulseaudio_manager *new_manager(void) { - pulseaudio_manager *manager = (pulseaudio_manager *)malloc(sizeof(pulseaudio_manager)); - if (!manager) return NULL; - - manager->sinks = (pulseaudio_sink *)malloc(5 * sizeof(pulseaudio_sink)); - if (!manager->sinks) { - free(manager); - return NULL; - } - - // Initialize pointers to 0 -- good practice. - manager->sink_count = 0; - manager->sinks_loaded = 0; - manager->sinks = (pulseaudio_sink *)malloc(5 * sizeof(pulseaudio_sink)); - manager->sink_count = 0; - manager->sinks_loaded = 0; // Initialize to 0 - manager->load_sinks = load_sinks; - manager->destroy = destroy; - manager->switch_sink = switch_sink; - manager->set_volume = set_volume; - manager->get_active_sink = get_active_sink; - manager->iterate = iterate; - manager->get_sink_channels = get_sink_channels; - - if(!initialize(manager)) { - free(manager->sinks); - free(manager); - return NULL; - } - - return manager; -} - -/** - * @brief Callback function to process the PulseAudio server information. - * - * This callback is invoked once the server information is available. It retrieves the default sink name - * from the server response and determines the active sink by matching the name with the available sinks - * in the manager's list. - * - * @param c Pointer to the PulseAudio context. - * @param info Pointer to the pa_server_info structure containing the server's information. - * @param userdata User-provided data (expected to be a pointer to pulseaudio_manager). - */ -static void active_sink_cb(pa_context *c, const pa_server_info *info, void *userdata) { - if (!info || !info->default_sink_name) { - fprintf(stderr, "[ERROR]: Null pointer in active_sink_cb.\n"); - return; - } - (void) c; - pulseaudio_manager *manager = (pulseaudio_manager *)userdata; - - // Get the default sink name from the server information - const char *default_sink_name = info->default_sink_name; - //fprintf(stderr, "[DEBUG]: Default sink name from server: %s\n", default_sink_name); - - // Iterate over the available sinks to find the active one - for (uint32_t i = 0; i < manager->sink_count; i++) { - //fprintf(stderr, "[DEBUG]: Comparing with sink %d: %s\n", i, manager->sinks[i].name); - if (strcmp(manager->sinks[i].name, default_sink_name) == 0) { - // Set the active sink index when a match is found - manager->active_sink_index = i; - manager->active_sink_name = manager->sinks[i].name; // Set the active sink name here - break; - } - } - //printf("[DEBUG, active_sink_cb()]: Active sink index is, %i\n", manager->active_sink_index); - //printf("[DEBUG, active_sink_cb()]: Active sink name is, %s\n", manager->active_sink_name); - pa_threaded_mainloop_signal(manager->mainloop, 0); -} - -/** - * @brief Request the default sink name from the PulseAudio server and determine the active sink. - * - * This function initiates a request to retrieve the default sink name (active sink) from the PulseAudio server. - * Once the server provides this information, the active_sink_cb callback is triggered to process the response. - * - * @param manager Pointer to the pulseaudio_manager instance. - */ -void get_active_sink(pulseaudio_manager *manager) { - pa_threaded_mainloop_lock(manager->mainloop); - - // Request server information - pa_context_get_server_info(manager->context, active_sink_cb, manager); - - // Wait until the iterate function signals that it's done - pa_threaded_mainloop_wait(manager->mainloop); - - pa_threaded_mainloop_unlock(manager->mainloop); - - // The original loop to wait for active_sink_name to be set - int timeout = 50; // Number of iterations or timeout value - while (!manager->active_sink_name && timeout-- > 0) { - manager->iterate(manager, NULL); - } -} - - -/** - * @brief Frees the memory of a pulseaudio_manager instance. - * - * @param manager Pointer to the pulseaudio_manager instance to be deleted. - */ -void destroy(pulseaudio_manager *self) { - cleanup(self); - - if (self) { - for (uint32_t i = 0; i < self->sink_count; i++) { - free(self->sinks[i].name); - free(self->sinks[i].description); - } - free(self->sinks); - free(self); - } -} diff --git a/current/easypulse_core.h b/current/easypulse_core.h deleted file mode 100644 index 32f0694..0000000 --- a/current/easypulse_core.h +++ /dev/null @@ -1,81 +0,0 @@ -/** - * @file core.h - * @brief EasyPulse Library Header. - * - * EasyPulse is a library designed to provide pseudo-object oriented programming - * functions to simplify access to PulseAudio. - */ - -#ifndef EASPYPULSE_CORE_H -#define EASPYPULSE_CORE_H -#define DEBUG_MODE 0 // Debug mode flag - -#include -#include -#include -#include - - -// Forward declarations -typedef struct pulseaudio_manager pulseaudio_manager; -typedef struct pulseaudio_sink pulseaudio_sink; - -/** - * @brief Represents a PulseAudio sink. - */ -struct pulseaudio_sink { - uint32_t index; ///< Index of the sink. - char *name; ///< Name of the sink. - char *description; ///< Description of the sink. - pa_cvolume volume; ///< Volume of the sink. - pa_channel_map channel_map; ///< Channel map of the sink. - int mute; ///< Mute status of the sink (1 for muted, 0 for unmuted). - int number_of_channels; //The number of channels of the sink. -}; - -/** - * @brief Represents the main manager for PulseAudio operations. - */ -struct pulseaudio_manager { - pa_threaded_mainloop *mainloop; ///< Mainloop for PulseAudio operations. - pa_context *context; ///< PulseAudio context. - pulseaudio_sink *sinks; ///< Array of available sinks. - uint32_t sink_count; ///< Count of available sinks. - int pa_ready; ///< Indicates if PulseAudio is ready (1 for ready, 2 for error). - int sinks_loaded; ///< Indicates if sinks are loaded (0 for not loaded, 1 for loaded successfully, 2 for error). - int operations_pending; // Counter for pending operations. - int active_sink_index; // The active sink index, i.e, the sink being used for playback. - char *active_sink_name; // The name of the active sink. - uint32_t current_sink_index; // The sink being processed right now by the program. It's not necessarily the same as the playback sink. - - - bool (*initialize)(pulseaudio_manager *self); ///< Function to initialize the manager. - bool (*load_sinks)(pulseaudio_manager *self); ///< Function to load available sinks. - bool (*switch_sink)(pulseaudio_manager *self, uint32_t sink_index); ///< Function to switch to a specified sink. - bool (*set_volume)(pulseaudio_manager *self, uint32_t sink_index, float percentage); // Function to set the volume to a specified percentage. - void (*get_active_sink)(pulseaudio_manager *manager); // Function to set the volume to a specified percentage. - void (*iterate)(pulseaudio_manager *manager, pa_operation *op); //Functions to go through every step of a threaded loop. - void (*destroy)(pulseaudio_manager *manager); - int (*get_sink_channels) (const pulseaudio_sink *sinks, int sink_index); //Function to get the number of channels of a given sink. - pulseaudio_sink (*get_sink_list)(pulseaudio_manager *self); //Function to get a list of available sinks. - -}; - -/** - * @brief Create a new pulseaudio_manager instance. - * @return A pointer to the newly created pulseaudio_manager instance. - */ -pulseaudio_manager* new_manager(void); - -/** - * @brief Free the memory associated with a pulseaudio_manager instance. - * @param manager The pulseaudio_manager instance to delete. - */ -void get_active_sink(pulseaudio_manager *manager); -bool set_volume(pulseaudio_manager *self, uint32_t sink_index, float percentage); -void iterate(pulseaudio_manager *manager, pa_operation *op); -int get_sink_channels(const pulseaudio_sink *sinks, int sink_index); -void destroy(pulseaudio_manager *manager); -pulseaudio_sink* get_sink_list(pulseaudio_manager *self); - -#endif // CORE_H diff --git a/current/examples/Makefile b/current/examples/Makefile deleted file mode 100644 index 1543a8e..0000000 --- a/current/examples/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -CC = gcc -CFLAGS = -Wall -Wextra -g - -LIB_DIR = ../ -LIB_SRC = $(LIB_DIR)easypulse_core.c - -EXAMPLES_DIR = . -EXAMPLES_SRC = $(wildcard $(EXAMPLES_DIR)/*.c) -EXAMPLES_OUT = $(patsubst $(EXAMPLES_DIR)/%.c,$(EXAMPLES_DIR)/%,$(EXAMPLES_SRC)) - -all: $(EXAMPLES_OUT) - -$(EXAMPLES_DIR)/%: $(EXAMPLES_DIR)/%.c - $(CC) $(CFLAGS) $< $(LIB_SRC) -o $@ -lpulse - -clean: - rm -f $(EXAMPLES_DIR)/*~ $(EXAMPLES_OUT) - -.PHONY: all clean diff --git a/current/examples/error.txt b/current/examples/error.txt deleted file mode 100644 index 1c0dada..0000000 --- a/current/examples/error.txt +++ /dev/null @@ -1,4 +0,0 @@ -[DEBUG, getActiveSink]: Iterating to get active sink info. -[DEBUG]: Default sink name from server: alsa_output.pci-0000_01_00.1.hdmi-stereo -[DEBUG]: Comparing with sink 0: alsa_output.pci-0000_00_1b.0.analog-surround-51 -[DEBUG]: Comparing with sink 1: alsa_output.pci-0000_01_00.1.hdmi-stereo diff --git a/current/examples/switch-sink b/current/examples/switch-sink deleted file mode 100644 index 78b8af8f53e36946d38c6d0123f724161670c340..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47960 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 diff --git a/current/examples/switch-sink-pulseaudio.c b/current/examples/switch-sink-pulseaudio.c deleted file mode 100644 index 0a0c85a..0000000 --- a/current/examples/switch-sink-pulseaudio.c +++ /dev/null @@ -1,62 +0,0 @@ -#include -#include -#include -#include - -static pa_threaded_mainloop *mainloop; -static pa_context *context; -static int sink_count = 0; -static char **sink_names = NULL; - -void sink_list_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { - (void) c; - (void) userdata; - if (eol > 0) { - int chosen; - printf("Enter the number of the sink to set as default: "); - scanf("%d", &chosen); - - if (chosen >= 0 && chosen < sink_count) { - pa_context_set_default_sink(c, sink_names[chosen], NULL, NULL); - } - pa_threaded_mainloop_signal(mainloop, 0); - return; - } - - sink_names = realloc(sink_names, sizeof(char*) * (sink_count + 1)); - sink_names[sink_count] = strdup(info->name); - printf("%d: %s (%s)\n", sink_count++, info->name, info->description); -} - -void context_state_cb(pa_context *c, void *userdata) { - (void) userdata; - - if (pa_context_get_state(c) == PA_CONTEXT_READY) { - pa_operation_unref(pa_context_get_sink_info_list(c, sink_list_cb, NULL)); - } -} - -int main(void) { - mainloop = pa_threaded_mainloop_new(); - pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); - context = pa_context_new(mainloop_api, "sink_switcher_threaded"); - - pa_context_set_state_callback(context, context_state_cb, NULL); - pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); - pa_threaded_mainloop_start(mainloop); - - pa_threaded_mainloop_lock(mainloop); - pa_threaded_mainloop_wait(mainloop); // Wait until sink_list_cb signals completion - - for (int i = 0; i < sink_count; i++) { - free(sink_names[i]); - } - free(sink_names); - - pa_context_disconnect(context); - pa_context_unref(context); - pa_threaded_mainloop_unlock(mainloop); - pa_threaded_mainloop_stop(mainloop); - pa_threaded_mainloop_free(mainloop); - return 0; -} diff --git a/current/examples/switch-sink.c b/current/examples/switch-sink.c deleted file mode 100644 index 1c5e8c2..0000000 --- a/current/examples/switch-sink.c +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Demo Code: PulseAudio Sink Switcher - * - * This demonstration code showcases the functionality of switching audio sinks - * using the PulseAudio API. It initializes the PulseAudio manager, loads available - * audio sinks, prompts the user to select a sink, and then switches to the chosen sink. - * - * Note: Ensure the PulseAudio server is running and in a good state before executing. - */ -#include "../easypulse_core.h" -#include -#include - -int main() { - // Initialize the PulseAudio Manager - pulseaudio_manager *manager = new_manager(); - pulseaudio_manager *self = manager; - - if (!manager) { - fprintf(stderr, "Failed to initialize PulseAudioManager.\n"); - manager->destroy(self); - return 1; - } - - if (!manager->load_sinks(manager)) { - fprintf(stderr, "Failed to load sinks.\n"); - manager->destroy(self); - return 1; - } - - // Display available sinks to the user - printf("Available Sinks:\n"); - for (int i = 0; i < manager->sink_count; i++) { - printf("%d. %s - %s\n", i + 1, manager->sinks[i].name, manager->sinks[i].description); - } - - // Prompt the user to select a sink - printf("Enter the number of the sink you want to switch to: "); - int choice; - scanf("%d", &choice); - - - // Validate the user's choice - if (choice < 1 || choice > manager->sink_count) { - fprintf(stderr, "Invalid choice.\n"); - manager->destroy(self); - return 1; - } - - - // Switch to the selected sink - if (manager->switch_sink(manager, choice - 1)) { - printf("Successfully switched to the selected sink.\n"); - - //Get active sink. - manager->get_active_sink(manager); - - // Debug code to print the default sink after the switch - fprintf(stderr, "[DEBUG]: Default sink after switch: %s\n", manager->active_sink_name); - } - else { - fprintf(stderr, "Failed to switch to the selected sink.\n"); - return 1; - } - - // Cleanup - manager->destroy(self); - - return 0; -} diff --git a/current/examples/volume-change b/current/examples/volume-change deleted file mode 100644 index 04b3689f8ef262e3f47602510fa40e3c95f3fbda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48096 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 diff --git a/current/examples/volume-change-pulseaudio.c b/current/examples/volume-change-pulseaudio.c deleted file mode 100644 index aa629ab..0000000 --- a/current/examples/volume-change-pulseaudio.c +++ /dev/null @@ -1,101 +0,0 @@ -/** - * @file volume-change-pulseaudio.c - * @brief Change the volume of the default PulseAudio sink. - * - * This program prompts the user for a desired volume level, displays the current volume - * of the default sink, sets the volume of the default sink to the user's input, and then - * displays the volume after the change. - */ - -#include -#include -#include - -static pa_threaded_mainloop *mainloop; -static pa_context *context; - -/** - * @brief Callback function to set the volume of the default sink. - * - * This function fetches the current volume of the default sink, displays it, - * then prompts the user for a desired volume level, sets the volume, and finally - * displays the volume after the change. - * - * @param c The PulseAudio context. - * @param info Information about the current sink. - * @param eol End-of-list flag. - * @param userdata User data (unused). - */ -void set_volume_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { - (void) c; - (void) userdata; - - if (eol > 0) { - pa_threaded_mainloop_signal(mainloop, 0); - return; - } - - // Prompt the user for the desired volume level first - int volume_percentage; - printf("Enter the desired volume (0-100): "); - scanf("%d", &volume_percentage); - - // Display the current volume percentage - int volume_percentage_before = (int)(100.0f * pa_cvolume_avg(&info->volume) / PA_VOLUME_NORM + 0.5); - printf("Volume before change: %d%%\n", volume_percentage_before); - - // Set the volume based on user input - pa_cvolume volume; - pa_cvolume_set(&volume, info->channel_map.channels, (volume_percentage * PA_VOLUME_NORM) / 100); - pa_context_set_sink_volume_by_index(c, info->index, &volume, NULL, NULL); - - // Display the volume after the change - int volume_percentage_after = (int)(100.0f * pa_cvolume_avg(&volume) / PA_VOLUME_NORM + 0.5); - printf("Volume after change: %d%%\n", volume_percentage_after); - - pa_threaded_mainloop_signal(mainloop, 0); -} - -/** - * @brief Callback function for context state changes. - * - * This function checks if the context is ready and then triggers the retrieval - * of the default sink's information. - * - * @param c The PulseAudio context. - * @param userdata User data (unused). - */ -void context_state_cb(pa_context *c, void *userdata) { - (void) c; - (void) userdata; - - if (pa_context_get_state(c) == PA_CONTEXT_READY) { - pa_operation_unref(pa_context_get_sink_info_by_name(c, "@DEFAULT_SINK@", set_volume_cb, NULL)); - } -} - -int main(void) { - // Initialize PulseAudio threaded mainloop and context - mainloop = pa_threaded_mainloop_new(); - pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); - context = pa_context_new(mainloop_api, "volume_changer_threaded"); - - // Set context state callback and connect the context - pa_context_set_state_callback(context, context_state_cb, NULL); - pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); - - // Start the threaded mainloop - pa_threaded_mainloop_start(mainloop); - - // Lock the mainloop and wait for operations to complete - pa_threaded_mainloop_lock(mainloop); - pa_threaded_mainloop_wait(mainloop); - - // Cleanup and free resources - pa_context_disconnect(context); - pa_context_unref(context); - pa_threaded_mainloop_unlock(mainloop); - pa_threaded_mainloop_stop(mainloop); - pa_threaded_mainloop_free(mainloop); - return 0; -} diff --git a/current/examples/volume-change.c b/current/examples/volume-change.c deleted file mode 100644 index 316e243..0000000 --- a/current/examples/volume-change.c +++ /dev/null @@ -1,80 +0,0 @@ -/** - * @file volume_app.c - * @brief PulseAudio Volume Control Application - * - * This application provides a simple interface to interact with PulseAudio. - * It displays the current active sink, its name, and the master volume. - * The user can then input a new volume value, which the application attempts - * to set. The result of the operation (success or failure) is displayed to the user. - * - * The application leverages the EasyPulse library to communicate with PulseAudio. - * - * - * @date 10-08-2023 (creation date) - */ - -#include -#include -#include "../easypulse_core.h" - -int main() { - // Initialize the pulseaudio manager - pulseaudio_manager *manager = new_manager(); - pulseaudio_manager *self = manager; - - if (!manager) { - fprintf(stderr, "Failed to initialize PulseAudioManager.\n"); - manager->destroy(self); - return 1; - } - - // Load available sinks - if (!manager->load_sinks(manager)) { - fprintf(stderr, "Failed to load sinks.\n"); - manager->destroy(self); - return 1; - } - - // Get the active sink - manager->get_active_sink(self); - - // Display the active sink and its master volume - uint32_t active_sink_index = manager->active_sink_index; - uint32_t total_channels = manager->get_sink_channels(self->sinks, self->active_sink_index); - - printf("DEBUG, total_channels is: %lu\n", (long unsigned int) total_channels); - - - printf("Current Sink: %s\n", manager->active_sink_name); - - // Debug: Print the volume of individual channels of the active sink - for (uint32_t channel = 0; channel < total_channels; channel++) { - printf("Channel %d volume before change: %f%%\n", - channel, - (100.0 * manager->sinks[active_sink_index].volume.values[channel] / PA_VOLUME_NORM)); - } - - printf("Master Volume: %f%%\n", - (100.0 * pa_cvolume_avg(&manager->sinks[active_sink_index].volume) / PA_VOLUME_NORM)); - - - // Ask the user for a new volume value - float new_volume; - printf("Enter a new volume value (0.0 - 100.0): "); - scanf("%f", &new_volume); - - // Set the new volume - manager->set_volume(manager, manager->active_sink_index, new_volume); - - - // Debug: Print the volume of individual channels of the active sink - for (uint32_t channel = 0; channel < total_channels; channel++) { - printf("Channel %d volume after change: %f%%\n", - channel, - (100.0 * manager->sinks[active_sink_index].volume.values[channel] / PA_VOLUME_NORM)); - } - - // Cleanup and exit - manager->destroy(self); - return 0; -} From 3f8445d767cb5b0e3c387eb4c9da92490212ec22 Mon Sep 17 00:00:00 2001 From: NMagic Date: Fri, 13 Oct 2023 23:25:01 -0300 Subject: [PATCH 04/20] - --- v-0.03/easypulse_core.c | 120 +++++++++++++---------- v-0.03/easypulse_core.o | Bin 36432 -> 35408 bytes v-0.03/examples/switch-sink | Bin 48016 -> 48000 bytes v-0.03/examples/switch-sink-pulseaudio | Bin 50272 -> 50240 bytes v-0.03/examples/volume-change | Bin 48160 -> 48136 bytes v-0.03/examples/volume-change-pulseaudio | Bin 50304 -> 50280 bytes v-0.03/libeasypulse_core.a | Bin 36814 -> 35790 bytes 7 files changed, 68 insertions(+), 52 deletions(-) mode change 100644 => 100755 v-0.03/examples/switch-sink mode change 100644 => 100755 v-0.03/examples/switch-sink-pulseaudio mode change 100644 => 100755 v-0.03/examples/volume-change mode change 100644 => 100755 v-0.03/examples/volume-change-pulseaudio diff --git a/v-0.03/easypulse_core.c b/v-0.03/easypulse_core.c index 47372ab..94c4fe0 100644 --- a/v-0.03/easypulse_core.c +++ b/v-0.03/easypulse_core.c @@ -353,15 +353,75 @@ bool switch_device(pulseaudio_manager *self, uint32_t device_index) { return true; } + + /** - * @brief Callback function to check the volume of the PulseAudio context. + * @brief Retrieves the number of channels for a specified device. * - * @param c Pointer to the PulseAudio context. - * @param i Information about the device. - * @param eol End of list flag. - * @param userdata User-provided data. + * @param devices Pointer to an array of PulseSink structures. + * @param device_index Index of the device whose number of channels is to be retrieved. + * + * @return Number of channels for the specified device. Returns -1 on error. + */ +int get_device_channels(const pulseaudio_device *devices, int device_index) { + if (!devices || device_index < 0) { + fprintf(stderr, "[ERROR]: Invalid devices array or device index in get_device_channels.\n"); + return -1; // Return -1 or another indicator of failure + } + return devices[device_index].channel_map.channels; +} + + + +/** + * @brief Callback function belonging to set_volume. Triggers when audio volume is set. + * + * + * @param c Pointer to the PulseAudio context. + * @param success Indicates the success (1) or failure (0) of the volume setting operation. + * @param userdata User data provided during the set_volume operation, expected to be of type `pulseaudio_manager`. + * + * @note On failure, an error message is printed to stderr with the reason for the failure. + * @note After the operations are processed, the function signals the main loop to continue. + */ +static void set_volume_cb1(pa_context *c, int success, void *userdata) { + (void) c; + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + + + if (!success) { + fprintf(stderr, "[ERROR]: Failed to set volume. Reason: %s\n", pa_strerror(pa_context_errno(c))); + } + + // Debug: Print cvolume values for each channel as percentages + //pa_cvolume cvolume = manager->devices[manager->active_device_index].volume; + + /*for (int i = 0; i < cvolume.channels; i++) { + float percentage = (cvolume.values[i] / (float)PA_VOLUME_NORM) * 100; + //printf("[DEBUG, volume_set_complete_cb()]: Channel %d cvolume value: %u (%.2f%%)\n", i, cvolume.values[i], percentage); + } + //printf("[DEBUG, volume_set_complete_cb invoked. Success: %d\n", success);*/ + + // Decrease the operations count and potentially signal the condition variable. + manager->operations_pending--; + + // Signal the main loop to continue + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + + +/** + * @brief Callback function belonging to set_volume. + * Triggers after audio volume levels are updated. + * + * @param c Pointer to the PulseAudio context. + * @param success Indicates the success (1) or failure (0) of the volume setting operation. + * @param userdata User data provided during the set_volume operation, expected to be of type `pulseaudio_manager`. + * + * @note On failure, an error message is printed to stderr with the reason for the failure. + * @note After the operations are processed, the function signals the main loop to continue. */ -static void set_volume_check_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { +static void set_volume_cb2(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { (void) c; pulseaudio_manager *self = (pulseaudio_manager *)userdata; @@ -398,50 +458,6 @@ static void set_volume_check_cb(pa_context *c, const pa_sink_info *i, int eol, v pa_threaded_mainloop_signal(self->mainloop, 0); } -// Completion callback for volume set operation -static void volume_set_complete_cb(pa_context *c, int success, void *userdata) { - (void) c; - pulseaudio_manager* manager = (pulseaudio_manager*) userdata; - - //printf("[DEBUG, volume_set_complete_cb()]: inside volume_set_complete_cb()\n"); - //printf("[DEBUG, volume_set_complete_cb()]: device name is, %s\n", manager->active_device_name); - - if (!success) { - fprintf(stderr, "[ERROR]: Failed to set volume. Reason: %s\n", pa_strerror(pa_context_errno(c))); - } - - // Debug: Print cvolume values for each channel as percentages - //pa_cvolume cvolume = manager->devices[manager->active_device_index].volume; - - /*for (int i = 0; i < cvolume.channels; i++) { - float percentage = (cvolume.values[i] / (float)PA_VOLUME_NORM) * 100; - //printf("[DEBUG, volume_set_complete_cb()]: Channel %d cvolume value: %u (%.2f%%)\n", i, cvolume.values[i], percentage); - } - //printf("[DEBUG, volume_set_complete_cb invoked. Success: %d\n", success);*/ - - // Decrease the operations count and potentially signal the condition variable. - manager->operations_pending--; - - // Signal the main loop to continue - pa_threaded_mainloop_signal(manager->mainloop, 0); -} - -/** - * @brief Retrieves the number of channels for a specified device. - * - * @param devices Pointer to an array of PulseSink structures. - * @param device_index Index of the device whose number of channels is to be retrieved. - * - * @return Number of channels for the specified device. Returns -1 on error. - */ -int get_device_channels(const pulseaudio_device *devices, int device_index) { - if (!devices || device_index < 0) { - fprintf(stderr, "[ERROR]: Invalid devices array or device index in get_device_channels.\n"); - return -1; // Return -1 or another indicator of failure - } - return devices[device_index].channel_map.channels; -} - /** * @brief Set the volume for a specified device. @@ -493,11 +509,11 @@ bool set_volume(pulseaudio_manager *self, uint32_t device_index, float percentag // Apply the volume change to the specific device by index and wait for the operation to complete const char *device_name_to_change = self->devices[device_index].name; self->operations_pending++; - pa_operation *op = pa_context_set_sink_volume_by_name(self->context, device_name_to_change, &cvolume, volume_set_complete_cb, self); + pa_operation *op = pa_context_set_sink_volume_by_name(self->context, device_name_to_change, &cvolume, set_volume_cb1, self); self->iterate(self, op); // Fetch the updated volume for the device and wait for the operation to complete - pa_operation *op2 = pa_context_get_sink_info_by_name(self->context, device_name_to_change, set_volume_check_cb, self); + pa_operation *op2 = pa_context_get_sink_info_by_name(self->context, device_name_to_change, set_volume_cb2, self); self->iterate(self, op2); return true; diff --git a/v-0.03/easypulse_core.o b/v-0.03/easypulse_core.o index 2cbadb8ce2aad8fd6acc9f195b56c98863945a4b..cf9bb794a82d4a85f1311e2f1b40e713804713a2 100644 GIT binary patch literal 35408 zcmb`Q30#c9|M<5%M@lK7vgAx96{#Gdv>lQZ`Wf>t?%#m|G)n8dgh)MMiSx*{hA}|mRCErMr7hMEB#gB%0&>5Nw%jgBb&8UaKxmEO%9cO^eEPhfh zyzpY`VHxjmBPFsUUr<&eC~FavbqLBT1Z58eW!-`@#vf?Lj;DgMWAKKT|j36>Ls9D0W}8H63`Heu8v~yS+)SJV(}L3V)0fd zf;^Z-_Ff>L4D#t9&jtAqkUsOXi2|A|pcQ~VmR48(z93|4eez`!e@I-^yE3I+k~4SLGVZdQyu6k*ZU8a~uA zUs9mPND}H9fpwzV0=1>EBGnj>g0*6#9#BDFi91hJ!@_y6$*b_sKYfla+Bm+?8o)e( zGpTmlYzUz?X#&73-$*ICi2J7RlE`l1011IIu`9qij9zboRUs6PANbeXsvrych<(>r z@&8u(-{zQb@B}vY`q1V(Tpa%T5C&9aXg32}tSpdcc>te7Q^9D#jp9#rU#cTRTNvCy zP>OHF1S6?ITbpOX0f4K0SUcXZb`=i%FuwwV_OVj_G_O`%M6S&?n+E%09 z$nfnx_q{&~-RQT7R}5-*!;KWY;#FP|Oy@cl?*^F8ktUzPasWH7sBiL_vmc7~jx(If zExdqc7SFC86oBa}m=AoTaWU3l!8YmUS&su#mJvYT%~bp86O<=6&c8FXkG49XYOW!u z*TMIj2?ml{KFq-RAVz)#wXRlE^P@N9ka;-YHVjtnzeyv|y?S22L(si4AXx^w2V3ai z8_ndIypIfh$l%WCZG2G&-|jug)tm9kz#LvkwT})F|CjAjT?H#-BhT(BSnsQVRxmau zpu0~Q0gfPy8yQ@C*f7`>WGDlGLH#Y%Wqc^o$kzgYTjo(wNv#~%33$wK9yY@L9~?tX zI5_Uq#E^oT!3l|4ltihO4nq|Q9$#oE9SRlqh z!1Z+o6au3pu!7#6%71MS2FU+Pv7aRF=HG=E`wRz0Zyq~Du%3@6*7M$(K3cGP>LUX@ z$h8RYZmbh{pq`$mty4?Et~wLOD%@3hc3{t6R0KqefLSe(p%siU1=v9Eq-+6`vh^a^EI_RR{pWmX zZV%{MK>s;entK512k1X%O7mbA?_f9;W;^~lQ109TA@5*3xS#{&)+F${)C3-I8EvAG zCe2i@q%Vb^0YLgvk-kZDNGlu+a?xVZPgpV_7P@%>pTYQcGq~cBp`RHW>6?lvP}b)R z1Z&oxwyAuR&;9zjcdr08!6PQH3GD_E?~6bl+!VrNGVh`>_}e8tG#Z|y!9lk7cCZ`V z4n|Tk46c@&^v5FUsgz8RYL~PO^-6jw6^=o&;7AH}!6hUbs^g%wy%zo4)TaearSP#N;m4yv~FC3Gp{@1<@M1WNxNQ+fr8 z`kM}vdH-{>)I!LMUJEV5T>^VD2q#JbSOI!_0FO+2se2p#MM|Dm4ffCUpR~^MqCNg9 z0*!-(YA>D8k4|t61Lyx?)crp?|MwmksEq^eY$%3%-3j-!fJuEvHWlqyvNaM!S*b~n zD|P7xe;I8?V3{;D=?MYn-rkjLGAQUP#@oP2a7Cm?o$UhNRR4uHB5b zjX+}uHFdy2t#&xj#CX-oy9;hemLK zelNW>h?+@I$-nn)y}l64k$-~}C}^RkwBSH-n>bMPCCtFS2a`n`cAq)~u=v&^|zfg*T3>-n$V z{TmXXOaGI2Zv;h}^guVZP;TtuBp|bU%c(q44Gf1Sfwa=Z#%8h2Y6Ip%Cr>Z7E0gQX zr@49q8%8_GdbAI8GZi2Qrp=`mATVIC*(FJGrc9x`8SI9QG<7hIN3K zKYLz)tEVq>k&};;JDVfWPScM#)5n*~^z`xMdOCT5R$Q6BoZePok(aNNE87(`g;F2( zf#!W(oVaYJH{08nvytgWQ{m<5&!sB=?M{G?cK{In+a1unUw}Z0W}l#|j-EcQ>|myE z0GH|O#&q@#@NxC0^!3^ST`EqBD7nC~N(k9Q}bB(3qPq>gxYheSxi%4X8R}rLoC;JJY_~x90eQ zK?E(jBUb|txcSojX22Zpk38PnPcxrDFhZ`qgF}VD-_Zgpprbr}nC@(@BXXXLhm(&F z+Y5RO+v5*P1wH|;U}6E#psS!k6As6hW58VO$L2V3J$-$cTu*N{aK9$gBp3t~7q_m5M78BQ)-&p>vsCC-#%%H|7dIT#799Y$ckp^`Mb=>ZAngOhLB5Aw5p zG@{_`^J~|FfIG)qKt8lx`_nbvrFR2u7HXqS&! zrz>*(kht#2l{uqy{H>?O*LkR|&bV!OVdcZ_=QTaSx#Q**6w2O~)97M7zwB>(KIT<( z^tx3E@0K^!JPiC@l(_1_c{RmUk+rwmXHN<*`lRwk+QNTM!p?{~zQPaA@v?~r{PV(w zc8Z}OMZ0dUN({dx`_Xf3oQ%3p9SKq^G#&&>H7-hxG9*i;L@Aqkf-x;l4wDU}*Z2w;5js{)&k=Y0;Ulsj;L?cW_y) z(Cd%^&oE{c0$!@wYRFLtx^$Pzf`)zRYQ1xL)?Z&*_QLEZ;vDu8T=HL zuoJCy*DVkkCFynUfs(FV%f@0^V!hcTHkNve#+|{y4j6F*DTBYR*<~dC3 zVCDQ4`|%edhgYvUW~mXlMf_mg);Ij&nc=-`-Jvd@A_ZRd!fM^9Kj8@# z%a2TT+~&Pj>S`oM?2_Au=sRy;r@PG=&>bcFW2jYusEVIybh?D)cjM>XW>t|h%9k7K zh$yYR$g$C}VBB9ee?YQV^GvDC0JSEIE?%XGyvOwNf>9HvM%)>rpLt-pkjk?8A~QFN zSbiAr-QwthZ&4+l%9ZENFBr4rbI<9CHETxw?)>%6Q0~vKrJa8QmyOj}up%~B*z@>D znNizwM|w)td}6KNT{|Yrv>}`;T(dA;ZnxF^hA6If&4u_Gs)x67)oMH+p4)wG*U8{# zpOgxxIp<7w+Q2a_{_OK;g5&ouVH(aCY}OuFG5Ji{!rzYKdfUxc6tI#7m=ozwMqWW6u-i2JnAepma3*G*$X z<~`fdq9eDkY-hXLVUaVup??bEeif~*oLI4U=*+YF)w`>#k}|la&rZ)U8YJ#=679 z<=0hiRtX;7cv-SVqd7k=Xu_sJ`lF-9)7asz?R>Z1q){Fz7sUyxMXNtd|8{Da+jJa zmmga_L*}a8x9LsZ2A6hv+|LU-tR||iAsLJ7){Ct-A^T|ieSG=#+4q5A^ zZI`9KE*XRZ-8BiOXts2bAnSt6_Ef*5u}}Rff-p zzD;gF*ip1`s+~^h(1~}4oPB=qnF_~Tq8Omxb5McSJM^Z@;Y5VO|aQGz_NH; zxuouxBX_g)M%)M%b{})((Aher(1m;S9DN6_ICki)-m~8qr}!2;A1uo4`r_6w`da6k zwu|+zQ}VxW$_m^w5tOKJ7Lu4P>ZW=!wdirR<`D4#6?caCom(_)-0JHIPXdp~xZf}q z=`ufa^OXAWhucKUwE~yyfEHkrA_B1^vs&{#$xT(($CYZ z8XdRD?ex`A-k&p~`@Z?_(uA`vlinC6?EcgIIFr+HW=%MNg9GbgSKbbYtwq6ZR`?hE15J@i6ODV$z7p<&&#r z;h&x1AR8V2WBjyHLKj)D-uo4p$ok7z^T)jzdqlx3cMSMbVQQq2U>_d7VqDIoJ&Vc} z%+#&y#*qDTs{i)ADNuO*&NrM&E8+DQ-fqw`Z=kw4{WnV`xlUe-qAhw8Z%;%YZB^i$UKLj^3|VeK5{q%C-S|66)Fe@35L~Vz*gdO#1ksQ{sj3ty(7!{FKUkpVK(S zJ&MyEdR))ZE<8Ozp{Hl?@}JI3hlJg!$=|p6yPp%aTy%#O<2mz}=TJsXn5I~vLbmV# z=E28fH>-aMR*H>ZG{SSwu#_7WKDGmgEms~C%bLm!e--j3T*WYc@~V>5s~k$ZkxKD?j~n1IZQ1sxbtPe%F~HihKX5rHMMG? z3FpKd?Hbrzd7;fe0b}zO!;6-yt;U`a=F!o}jg&(Ewr{-u!BCSk8( z|2ETCKKRE<`<REpHHll!%h$8kFEh^NFS_+@W43A0#zY%E4NmGQJ4<#KS7CTw+#|k;)mM(+ zkg!e74GC>}-!=sM=)L(;5-?Qz!90tw_N z^vtBD<;-Co@=}ovXB+GIe;($U&uZIrvFTOS%gXAnXd_x{%&0Ut@ek`cQw%C_YyQ+1DaT?mtCAF5SUcj<$}=tvYhc+{6vaO49G= zo%np`7kgdp%hp_%jP&JqE4GQ;Eb|_v7I8iCz+#Epts07!Ck`9@__ngjcFDfjdxsZD zuH4zNSvSa!rBQnbjFZjqHTxI(B$nJQzil1zQAT2m#2V>WFaF-2_=}MDE8aGbZHkR# z-j5gE>LTp)ddHC~14Yj^4m~|c_f8^z{#_-|g ze|&$WO;zhYc}DLVb7;oCx!e^-r;UFoJgyb1)|fI!X0ZK1Ena)`)mxUQr-@hgY>M7C zWVGKLiRyj%l9KJZ4qk~ltDUPoZ8~E1wQ7DDGF$W0A<-RE6!Xp%IKFK^a*@oNIkWj-3$o<{4jT965RHqtTJb0Bu(6!S^Ar za=wMmF!TI3i!+Y;9J;atN?JDq{ z+nwJWI%ZrvW3pI+&5^z7jn*d@q^UGSuAS|1azXf}su4$(;|3g=I58*a-JPWw2bM^0 z-NLZGUeoGekTSmc{o2KAo`yOeX$(%dsd@kR^N$}2HrC7XWTx#Nt-5;$+hNP)@8#;D zVq3$i|9ngJ{_>dD5*^1T-zpb(x$Z-&P9=CZ7V4U88eTGn|3`GHv*WoT9fPhoPf)v1 z)+o2?;=4_({DoIpM;C5yuq#V!eU@$*GOnEa#B|wKtDh6ols5-oZhg|cA|_j;^F$Q8 z-13lb>vw*wTB~wT>b!MYse7(!UOXV0`6=A+w7&X8gQAOuu-evGm>z zpDw!#-v@rQHgVaL`@#9W<-{EA4{Ej@v9>xoyvJjXPd3lpUU69UM3vRU5o?Ceiu1dh zHZDhe{Ex0(w(0K=S~BI{YJB2U3>)z!<+Zb7$;#q`O%b&;kKw+kLueD}iIln1}w4_mcGYI)JGJx)^Bv${S7%C|<#?3B-{{gXJ)>{6P=X?*{y6c*Hlwla|U)?e`~ydn$)XO ze+`wz8=|Leo)kMi?eN!Red|Mv0iLX+>!lJmESoGR?|*Qbb6k^OXjVFd6FJSHd$d+s z-Wh+#7Im#x!P7NoC^j@-daUZ;oRPt{I^dfabD;ET{G_9t%PptDTH>>KoYC1$^EMm| zT%|7>%Qg3TY-!;s#HzN-pA}|j=vUh6)u``Sky89Vx6-_HS>#JIpYr1TbiJ0V?3A2+ zVhKO$k2QTR2xQf@K5_PHGv1&5&QRmywm_!ik%(=-Q$3T{yqw`X>6%GhvSr?>C7<8C znKU!ZN|XJ=ar0}1+=dhr1C>49CPFO7x14CFh|1L2-xsb9jpIq3P^;JxY+HM#TuM2z ziyfQhZyGJPT6%(EYi@bWN8Njagfh)+Kj@s@T=#v{vAvCB*=oniOMa`U29+pYuvj!x@j~yZk6}{zuzC z;T)SO^XO!=gxk9Jt``n$4`t4<%2?~S!ED0Mqhpzdwpz}4Gxz-Z(OxTNJoxeU1N90m zoU8X+A2c{{1AI58wAUOSZLqs(^TVB6R{v&RJFr_UHY)a;(Z{T{zg)#;WXd))zaI5$ z_?@)Y!q=};9(<0zlz!(AyW{P6PsQ1vjv8tw-~5#M%VYD-IWMGy8ex!5R6dmo6;P zyt?hUv&EepHAQc=?wx1TXSuXy%5TrPWLS6N<*OgHwHG$esgN%8afqR%S+uHSO)+i`h&6s|#_FITjM^NBep5xZ~E~Sq{POcsQ zUT3OwxJrn{#>eMhXm~fIn;31l@y%fSeMxWWT_3M4^V5qmnXCCbA>sOiU57gpdDd*N z`|HZB&P075m{P!V(2E`PG05a*g67@4O%b`@cUOnrYkXjOi*;|-u=l=ceQqE;NR)-{325T3_?e=iDv?&V=WI`V zZRZKOQT7G-V?*Odu9!D}fo$cRo;|r{p)$eF! zygR&h7hMv*ryZ5V9v<$yh`Vah^iR%p@+Utp`#sXbIP1~)fcKBSyn6dOHC21fYl)gk z_Z8*!^-KeDBP6aWhX9Vo{tNZDKDmd{kp@AW({wQhVYcVak&K*3H6&@$QTvHQKJrUPL;aX!2UMgxZz zZPqcIy8p78i)F&+kV~ppKSgHAM@K#9tg*}BMcQ7sfqR;kBha;6_&5I$YJhOTjE(9ytDyOxV$Q zbLj!YBxO0l+O9{h4AxKKs4H7189$cjaN|uC&R7?svuuf)jr_iwx8~@I`8IVNu${i+ zW=hLIgABFCwVSsdZ8vL(+%4hPzPov+OH5hj-PXFN2?rcqZYf8_r(3t#&#*O&l?lBu zdX~W#z3Vp{e_pSt8QQh^+Lz8Tk4j`*>~?H=!Cjxl)*p3eP+r$7{-am-`L|wwd;RU! ztLltJ+oSBhsbaUsgiK!D8tC#L~T$`z78$8%m)=g~n zZq4J&!gz(pHlwPy-ebfn$)6jvWb|VV9pS6ZV}6t`vD6WLVRq{2szu9$%lVe2YaT4S zR&sym492YeM+WW~y1U9;h&k2lN3ES~LSonDkaU$JJwr8{99I6k;5Dx*Av?Y*{=8v< zk>vNVvN<6O^Mo3I*y|s6WQ;Lu%a<*%K2i0$bI(V1!_O1e7yQm@^ESP;6|!%c;J&Ne zYw3lgvnmOt{`ab$7Cm}eG}>RJ&R^ughNy@`c@e3hYR-pSmD4!6R<56=>NCS19$<%M zxT&#o+-B9^H#U)W9G0vlxA^4rTHWVDd*(g9{rxAsj$-IAFG zAJ=Awub-{4>wRUX_?&&}(b@xl?3*Z-dv9r0ltbz!TceOgBP(?ealQ@vp_;KdzhdO3 zHI`8!nT|ia8dvMH;x24c&7a>k;rMdz8--G#b=!)Mrf63W#%Pr6Loc@sI z=<9tpd1ca@>Y%2qUjZSu-1}25CGOl6WPabS?bNzT=Hg>+#c`_nhvM7)Ivu_(@_v}9 z{`0F-yO7PVZ3o7<%}zGhcdgZToQl#*eUliiM-Q&#NH#sIl(wC!t!?%}cimRirTccJ zMhS--OG+Hm=}59|wqMJ$S$}iM&v(&tr8%=+Mb|1gc}!lWeIRJz-I`HZUFYlf78?u^ zujD7U9N4j_eAaLWVa*velZ8tbN~b+jE*QR9Iz?JM?_){hfxPEqGf%cFpZ5y?dUr*( zm)3{ybrz9@OEP_DZwQJQ{e8-d@hxIM`6C+gw{n|?Y~Jrlik4$)mmV zm8N}N)vfbXB_nxYd*e{sGvBJKD*Q68jlLduaJj_QJQ<$Y0gamdDaLze7;JmFQ(@F} zcHY9@7I)6SJoPC1$g|SfR+FNyUX0!|nqzA#y9q}gQn$w`pi+Rp|T+8ZAq-kMl9 z=EuJEv+rGIZIwP1p>aIV-S7GNXulzgBFuLz*{x`^r9)$(@7&k+(F;c$koa{#^je|p ziJ$pvJI#$>>~s1u@lELTU75|6Z^}%6< z*ouR%Zk?I3rlJ8{rmm?N*>vlS&YB+Gizc-LGc_Z}-@Yc_b+pqvW?_3mRyO?TBR$uW(b8CG{6&(v^l z%FUlPb?fe2qeG!#E$fWtzgT;4y34~M=_c9PFAu40oEp&N#g%@Q^VPUoG+oTXe3EG5 zGPAFyFB;A)3sj8t0*Hv--Co#Rds?npdi8E{#jhxG6s2tEf(h(h#G~L(iof z&-;CPUviN+_*i-7$~*T(n-x5pDpQ<{qrU%onEJe7N7jY3igv|;N{-j|f4DOD`o{}V z&(pT4)CCJ$_~=b{5FeGUu_@}-iLEvKFWl)qS<>9h;_epKt##LPZcHn!H9kFKLTshm z65gHx5y^T>?nUp>+sjFJE#XMb8#3Sj`0~J8btguq&NMAHXPdij3yibw)cXA*+405P z)OVLG(xjR$4Lf@|?9@)jCn+Z_7^Vvr7%(T9TG>rzPSerU)||%F*3#C|nyEESa4cnr zf-4jJgAb1YF>seFR0J9Jmk`Pi01PI4!z;AOh9MLzBQ$ETgk(GrW`Z&$C;-xIs9@d@ znQg)gq{LZ~A|hI%KuS<<1O-6a3;$pl;rQP2wUC2k1r5OEB4$ER0O}71|6uZke{i|* zy59OnAO~qB{L@>$thc-fa*$O1(LbVBec# z-unK%Spd7YA#HiPY<4`$#$n$TxL~pq|e_=Yvf;rF&saOU% zS;TRkieJFsqxw*uiQea-;u0{p20<=~-Y}x#2{0DoT*Rq30?Y;Rw}?~m16Ua1j%Wg= zfjmrc;2+eVFo?=BsCWP`4^r0whW<^~10C!z00v^rfeyANj_9_@{n&cRzeUKkdTxLl*eI2Cj7=QR@}B z!Y5(-vU7ev+_4|-(+}U#4?oclFY1Rs=!bvohYtjEvaf!@x!xBy=!e_(!`XmCf5xE@ zrPgoYPfkDb@kst1lBd>lAb+GE`IG(d+x_sz{qSFaLpvGhc`0h02JH?4@6Y$;hl%}g zi+;FsKim^=*lsGCdeqtu+6_fq0Zlz>O$U5OKYEh-;V1jyWk|n1>KwHv0R2^n4;~6K zAW?e(xIRU^Lyp1>Y7GZ3n-O1)_#Qzq<165O`R!LfoWXYT-{=P)H*|FI<*+qf7%slx zxw>Gkqdyls69^u;W4L&+oqPiP7{2(KG9c;g=fwu4f@cAtP#=ZfzTo+>eu}^ogs{jz z$dl{h@%JG!#^1-=U@`d&8iT{89#&-db6wdS4#O>oWWZsNv%as&ZUGXB=Vw;3I_|>mA{9mvlk+1Rm9U#@`1k`)_3N!Qx1tQ&_-^#R)neSn;go(%1~4e-?FdU^w(z7N}l+qZB4@QOgZ4_9%WIQ>)$ za`L1~ux+lM{{OWZf3B||-KGE^4%>|ZA3{Zg>`yPH9E~5`bcD~EGH6dfQh9H|fYXMN za*v=AcK8y-={tZAuo3t8KAfg9EVHM|%g2z(-4L`bJunkwXn^S-n7z)r9y^Llw zR0bdY6qx>x5tJ01K@2|*cu>`i-ZA{tCN0{j2GFyvFzD!cU`#*lgO)*G;G?q)Fb}{3 zpKJz*GB5`Oj|{uAL9qL7q?-O`D#1zM;{DG+QTDPqfou-dquzA}ZpZNG(*qtNhY5bY z6eh52GvLyL`D+M4f*dS0y}TVlkf0uTuY={`k`EK)@Vhja>(aOajl-|^!35>uj}u^d zU&Kj!;Q0n7Y>%2C%Yfe^gNd}~D2>zGebf){p>ai^58I;v8w3gJr*j<$K!TSM;2)Of z()dUkKTYFwd&>IZFK8Uzb71|0sBbX{+Eu3Uk%(je%m-yKji<@OM|!ayGa4UF;~Qw4 zN#o%(K8D6qX?!e=pQmwE8oxo~^mglLd>l=_g~rFzxG*}`KsV9#>(MyfPE#76K-05~ z#_4+4G(M3gA3)=iXgrF>>HWG$<1l8i{|8Bc3`lUi=<{wgjl+4j3JQTV5pmdG`n+3C ztlyKShps=A#-aXX@DHYFnjX6T+30?Yv~vlKLp={EEewVO;-sD4G)|BIt27RO zLIvAjPUD(1-bmwgJ=*C054Jm%CO@CX>3ZyGoUZ3SjnnnKpmDmM?=()=GYg%6Nxxas zIP_Z&_y?0c;-ufs(B$dkSVZGc5B!A@n9BOmBZqEPp?>(@7WT6$jnn%zkH)oW@-ulDOoBHfE+#F| z1MSoU|FHe5XnZD(`y!6ph4-B>h0x^be(0oeeISSR>!6zx*e-n^w59PeGPvi7`# z{eJjr8mFI^w$nIW&jrL`Hz(8d7t{DG8n32tEgEm6@fkG!k;Z4!_-`7AU(3hiE`{Dd zgZ50Pab?7zf8e7XSYDUL>HRh8hlkMg)5krY#^Jc1LF1l8(?cKk4jP|Bvu8O}3KF!F zKE7NUr^jsqjn4&jaKF-MoE}%_Xq+A=rqDQ$V7qib1op%C^}~<$!_oFgz5Rlg3aUM{ z{7@W*_5id`Aooxl4K*bXeF75{gB+K^Gc8PT*+j0V@@mvyfjn9&C^C)4VY@5Pc@C~c zFhTv0H^7?!kf3j2!h9Z5worh3`DQ2p(jvj7m!F4@1<6Km>E(ExTuX2tI0ztZ5L|lY z_oMw_3&Hs?=s=1RTzchgkv;JQ_eT!K=PcYW2{e8gg!~2+H@O7=g8XoY;MdXl@&UmM zkRM(U+yeQzjo>NB58nvB8J`Q$K8fvri2`9L!GECu#ODz#&qjK+3HimyKl%hOLjK3+ z0;~tG%eI7kAnNZ5f|sK}UQ6&T$bL71i=p$J7s2sQ9&!kd*Pmd5SD^6?Be**nM|@7f z{ThhIaVH`F6P<_PXNWLic`p=)`v_i#CTcRl&!cg{_r+MxJoo~n3_@NT#o<|kE1~$g zM({TRHHL$W?n-Ep!dw@vKVu0# z2l;Ih!JAS1YZ81cicejFTfsvRNbvoAm~gv?5jP^Z1JZ9w@KdOtO9@^N7fX;_2)-T3 zdlI}B#fdM$C!lr%Nsi)wE5TD?M?gv-csz>RB!XW>`cnvQf#$_=f{#Hwhv4(jx^#o! zw~>4)!M~w-eUIRukRKip+!M_&_<06Qc)XUN_<2F_(`dbVP4FPJ*|rgU6Pib#2!27( z9OE0om5?6zISNeJ9$nO55!4UNr=s~dfZ)eaJWCUthx{o|@YAT>Q3P*8@i2zqi6{?0 zzoFY{f##P6!7EUF>Ja=UvQwYnO~}u43H}bPVVGzM9(Yg^$@GWS(_Yiz78n2@Szk&4U65K@4eMSkvf1>$V zPVi6gO-+#C=T$J_xEhM$4X+=V>k7oE&#~z8_#FI-(6blmX(9MwG+rMFeiM!RXM(Rs z>*o)GPeJRCFxvmIoh`_3(ge3a^L;eI6_DQX1V4}Drx08N**}foE73UW5xfN*!141D z*v?>Nr!gV_6wQ|<1fPriv$`L?j^KNdJwXItjN&A-s-&+L7`zwB40P7iv#uvXIj=4Ls=RKk48=BYO37!Zmf+UXCC#>f)@{b(B zy%8Tnaumk61eZhW-U5OfqBzIz&tp5+pnh2s@_1cXMevJgUGnIM zdlOt9t@9@do`&~Rf~%wX^0*)VoZyv6j~p6L+^={PKl%j!jpE;=A8tdjB{(11Go0YKzB0k1QM{=V+z;uW zOz?6v-ct!KiPqKW1g}N=tRcZaB0i7cE75vxO7MwD|004LA-d-5xfcULW2K7{1(BfH|W5;yG!ulXdSC2_%y`p2yTJ+ zGlH`bZz8w`nvbmnrxpS5=Oe+98paobKSk%3p9Ft_)@30y|8RU7qPzsbC!%#sir}(H zj~u~=q4j43!E@348cpz#Xdj*Hz1n)rW-UWg?LWh8qM{qy14i^%9 zHM0K}!3~j}6$HocAJr55IP%+Tg18=Pa^r@1Xo7+aRg5UbzquC@R`UzMg+%pE+Y6HG=EnR9NX_f z@NQ&hAi;6Jq6mHf#UXya8~1ktx<5KX$V;I4l}&JSbl%7(xDV1(PVjpI_b~A1+PK|| zXguB!^7y$H{JA!kS3&(1#^VO`Qsaff{lo1#pmkt;KU|&QZ76Q15&RNbH)i+4%?Tci*6rm4 zS48?<30{r-vw`4DBp*g_e2(W6JP`RmiQpsA`RzEtgV4M?Pw+sr4ipl+0<9+%1mB19 zj|sjL$-g1^Ph@8o!6nf=r8Wr=!+0EX5SK#!z+45z|44$nAwH4db*Nokf;*u7Y(By9 z=W0v);Z6j{>xmD+@p`hE;CSEPL2x|Z_Yxeh5BPZ@><2tgvk7^;&(#uqF4}iSAirWg zcpce9a5=PY;OBO*JbwNuk&wslL!}X18qJGrg8zUDLAplp>uCO#5nK|T6CM#9uh*{# z{sXNS`1v1f{~xq&^bqokP=5!YIKuLS(0oxKxFxbvmEf7^enE@i_;bP81dl-eF(>#P z?uG^1D!+ohNuM>Q^Db z@%y$F1n)%o#{};{`|KNnZ$s^N5quc(j}Yn~wtoT|Zz+OXp>h8 zd?NCvBf;_cJBr}8sNJ&!=b`=<5j+z4zm4FZP=ADx|FHd!(Rosp;Cqpsc-_VF$I!ZG zO2~(!eaN2Rfk=Km!T+E*+e+{_#P5Xu)4d>Qh84Z)A1b*7!*k!anc9_9nFhx-+Y z#(fm>2j;=Z584DbM*f^ba1k_*90=Zs#>1E3`1=FV1UEqErNacjgW};F!SVMTDhQ7E z@fyV8G7FbB{Jp|fLjD}=I7r=uyd1J$5w(x~gU=Nzh-3Zud7J5kygnKaV}dV6`wNbD ztbaC&=M{v0{JrcjLeF|M?_vm!Ki@n|aBR;Rf}cZnUPB!B>mrKJCxpBtijy~lJpNwi zFG3!-D}~;-#{I?TF*(F>yZC#fYJ@!2V@hywe4kG6lY-%8xDgzm8#f@1+r{69-9gCX zI7uS-Z{)WOf{UX5Um-X?r53!SVUOg3v=PXh0r+j)D7& z+wCOu;Qk7sa{-pe_a~zXo{aXL@rYwT>?+9N$;|MjZPY|6YN-lE7f>XB_9M1mA($orXBp6OZ;6YeF91cdsDi@$V{Z zAmnkoF$8Zxag#*o!M}5ImXODK3J8whA1EXA;OAgo5b{`0JHfS4y!8-#F_$QRNB{<~}z#IsUpTk^3 z@R2Y8KyndWC_h8LsUq${aQOQ%FnJ3uz49{==Ma1W;@E$9T&xifA>{GIc??_gVZs6wLAY0e`Oq zb9~NmCG_BPR}{hV`4Eo})`QQb_1^+6W58M>Fn>%(B$|EGE}K6+d05p z@JkY!g4a&Y&K!0i5QCKw;yC%ZvtiZ0%*)e<4b)QAL3{Wm#NbC!Kpy<|j5pf{G!6cD zJGLhHi9HSKhg?wJ-6ufPj{|=Tgu4;xWqUZfao|s6{C`PIpal*IUgxn=BlLp&1$#7n zSd99PqbSH>d0cR1p5Rprx_^YXH?S@`)>6ME0VUwR06Ds?gNRD4=za+2@s(^}9TY&F z|F89@fx1v93LEfBkUCKN9Yg`PAIrh-R8lq(1&!#wFdN-pVR=G~p$`iB^4}4(L0Urt zL4xMMF~arHZ6X8iSADe~KMoXtw2g2Wt}iHMFjj*Xga}on00#ynEy1PtFDYveO8TOulAYfi;Gog{9yYq6mfmrekf{R z3l|{8EOamlMfW`j_twXL*wIh@G95t;aV&@w;ASvR!u3%(zEtW8UZLYG#=T>O>!*Pd z{JK{Nym*J|(;0kC%H{wDZxx6zXLO+Yc>G{pn6UkV9D{KOyns5%`poG9iEyHTtX~4e z`WnBE2tj?kkHGPRM_XJUk6&MH!r*2k%CGOXm#OBvi|=8*C|%E literal 36432 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 E11##qH~;_u delta 4810 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 xEk!17l}QaUi*0 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 diff --git a/v-0.03/examples/volume-change b/v-0.03/examples/volume-change old mode 100644 new mode 100755 index a5b21624c83e9b46e7b156a63b4a11db31817b04..f1909a88e2a729e5eccbd09ce3e9d281c72130e6 GIT binary patch delta 4975 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 delta 4931 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 diff --git a/v-0.03/examples/volume-change-pulseaudio b/v-0.03/examples/volume-change-pulseaudio old mode 100644 new mode 100755 index a4315a3121bd004b8617858e1c16b8bb371f3537..906d1b4816f5f4cbd5601e1a9cafd78a1c98f506 GIT binary patch delta 4141 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 RLB(>nNb1j{Of2qC{U3xsbE5zN delta 4128 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 ArT_o{ diff --git a/v-0.03/libeasypulse_core.a b/v-0.03/libeasypulse_core.a index 749fcb8bd7742ef023e4a9698fa176b888c06bfd..f50db6030cc663045042f6cea80dd20a80a6dac7 100644 GIT binary patch literal 35790 zcmb`w30%y<|MLVdXI-U!i4-MwA?{n@@jj37`WB)~V=kInGmvN^6?Hp8DC>g?z0@9M?o zFg(~nTu#6`s;a9y*C&LHl`*u*&eHnY*V`%6Fm;h)y9TWb4E7CTJG%#P*jfSFQrdJ^ z0YQ3}?z5@-`ji?y1AQHVLKmrx<~H+$g@k|u1xbi8lkqo)DT9#|`}e&m_12UzjG@SI zVDVlrW<|db1C?03>#4v0{9*AfB!L&+uI*GNJ_@{eu=t|mCW3k_o_WiZA{IXmQWh^R z3%>BF7d}ggSAO|kMMVWm=5#UZMhlZyeB+%kuj)pluuv7Rd{S{-jZ9nvRDvp)D#a9u z@rqfzD%Oog5ta~q5f;3N0NrQ)>SpmxWm)`P6yepfc%?0{4?yNJl!>_xUl_pwEWVh4 z-?*X)-V{Jju;LLzbp&lw3b7i5N=;>{+JbDUsS+*6;xh`UEUMG`M!2^hz%a@To}FyW zb?7w4y2YT20$&PRjp-KSs?n?)26X*L>xkCEKx;^Mq&jk6sVS4{AF`e_&|F|397?{a zBrmQAdWs(h^Pn>{7nacrfSXYdfpe?qC0kDcn_2wS^YDciUk}T82O24nt=9x)C4#aR zL0N~OtU^%sP*Bz_C}aGAW^8>bC~Fp!NkYgwAS)<)FDUygC{q%YF$HBkf-+HR*2Yg1 zl<5e{20_SA9V#fBCMYu%lqn0!#tO<45qQC|5wu0JQ-$oT4jZS$vi~Kr2|h`P*5%l_?+(R*|DG$ftpPCdhL^J{;sv zf&6*k4Y)>u<=d$q&%Xv}37{zgnkJwXfIj3$Wr7^f{3#kxev}Th-nMqt%7T>(ZgEd*O{<&g;mB(M% zedi_&9;}%6IxJp9J&PAy1thCrfPghvF-6MYeFya(&NuUJ@D_*(76i|{IVPf6lq(Pa zaxC~D+aeazEfg}U%^1jalu}U)yzBmF*|n((3c=h4o+1l{l9GCjVgjRDkgX0aES@kB z2Zk|NaYeyWmqB$#t12}a1hjY3Q)YIv;uW9>ixzA6P|F-iff`dusAo9ViE0bfmcoiu zV?YYlikE&sP5MgQd7>H?&WBB2fq(w#b6nB7aedYR<_VlhwcECc5NeYl0L=1DmE(%I zZ~88Y=@t%_5GWJ744lL0^(Kf45pev#zur~_S^-q_ z2u8OW7Ety2T}s#=y%vIq-McRt{3q>gA*JRp-Z9!%qTa~z9X|KHKMLLGw}@8^YInnp z6ujeAUKT9pIu`E+Sk5u#pFuc)9al0k|IFC~MSI5?F69#koF4a{KAscxPPeHt|0$Rb?n1k*Ls*rXWih z01WCcP?zzcNF!ed{B4;{%}OeAU?<=)!+F>U_rExXT5xdOsf8g8HG>lp735H`bVtFG znl{ZG`htPetN#U~jw?De^X$NwQkrE!_~beXGAuC1!G!DU3@8LfNni!NJ=Oo%9-JWm zE5(75xSM|iFZLOp7`=Jy5J5a2N5u2ql|D)kJ&lk7-efESyc_ET9;m11X>n>X*j1;& zxe9kxo&(tP=NAFdB4AcaOhg4EQV}-LyC_@0qHMhj{Tvff#Rvwi_l6sjeth*m>+=QU zRE73Px)S66wUT)>CA`~z11RMdv>U?-K+ST{fr%`4un_th`uL$RN&##BJ$G6uv3Sdv zfc|shw3-MgSPxtOIcr)07cMge^q*6v6$?;1K>s;kS~&vh0_Z;{ODk_c0|EW#OlcLy z;_Zu~rrFki4wT!rLde^f1YXdAa#JdJUuq5yxQsT@81rVTS27o)P5~fuvB=20IlL7P z1{t(i^b?jWmZn267eb@WZe0x0Wq1%jCMr%ju0{<&X2_wE(ICV0dI zHlf`h`h5||gNs6VOy*rM1An_@hQz^>G&soiUJiDH%fT2*hQZbGl=)aBqfN<#s&&c8 zQtxE6sp%Lh2acpr7YreBP#p)wmVIE>z?xk$%cu&SGP2b1%Ts1zS*OgZa*(Gqbjmp0 z=w!)g6!GHVi9Gr`{0lC(7$H)n6oK!18&L+w$zX5>LTxfZmWvvk1gB|yTp*~7S0j>x zQf0+Dg@yxrkoM_`9f!1cB1O$CO@yqW+cxW!`^pmI{QtI2ULc?h@FO z!E~Y&fC$jr19)WGMP1wQFHrKlYOsH1{-kx57w7#~5ojC)s$FzKKRUq}2G0LOsq24q z{_j07P#Xu_+0Y#Bbtl}@f+zMpv#HsRC0k>_EGsqd@t|J1!Cyw3DF~A$<~`xy+}j(; zCV_&!=6D-8iTtB5#=ILYvPRqhh_h$@7k2b^NwyF!V?nU$4eV&*z~x?825dsbf`b;g z@COZagCT_3Y1sd%wwfi>< z4;Qpj5a{SxF#7at7?tIrI~N^7u|@FS1(1OKLzpf?b+JtpqFyJO;@yinYQb%Z3r`hQ zK!*q%dj6w#|4s?erT-@0JA-1(d!QRzC^zzv99Ee!)QaZ+AfR zfx!YPTK@%Ib@uW1V23dSg1O89Po`Tyu)jwTrLWgd&;=8MnEtMQY^F~T)7HVp1_}tu zHJF0?-_GvdZ1*+J?rsw&0oU3F`}#5i1AP3!O>xTFKv(A=pawMN8GyR_f2uFAm9ha< zXDl}}pW|TBcl&mn0B}PewCIIg4Lsl(K=Ye1b6gPecyB)~{X@Wq0v^4CLrsCdqXkqz zNBQ_OX`d6|PXd5Z*q*@3xu>fe$L(rf(hZDdtW-bVXpBMN9_%pdaer(`=Ev9)G z_*?>*>>Cges0HSjAobe!k5hpe|9qkVJWn~MY>uFold0gf!xZc{RFZ)gJs{zHSlTVe zfr0jqh8Mhje)Vc-=*JJ&L!IxunLkHWbkobdQOuX4g~fTMYc#SZiCbF5+Bcb%ugX5BV9xBOxE^O~Np^J8Zf6w2L}*X&|FzZ7J4 zHvUy}-0Bs{@0K>zJPi3=l(OQ%S#_m@A}+VvXH1ML`lR|s#yV(b^0w$YzTywg(Xt79 zgYqMXbdJt%od46v(@{NhPgrSbT!M(3N$L=6--4pf%Yb$st&GijSn(e|4wQlf6jee@ZVD63(U6_WS+ zVDs#?ar?Gst#Wyjyykbt@X?WRd1vi<-bwt~+pXBNzEbsg$qSe3xBncgXEm`@GPM@T z_z3&R`AGSU@DcYJQsb8ClsS%NePOjn?C(=AytXPxMPxpCoApKNSA3Fri{2b9&4p$9 zgUV`!UWX4Tm-dYG8DQglBE?jpW@_e>eX)vTFxGPdnmQY z_@}6ZgJ`Xneu2nHN#8RMl=bCXF03)~9(SfX{od@6(eup@C~J(a3UIzNTO#`8`_Y4q z2MnsesmvX6x%TrTe#$ zUuvc&qP+Y9XOW&Ygo|6-5R*n4K`RkpD{GVToJO6|%8KXIOS;Bc? zpQ9gTM{YSk!biI16KlJ8b7P#Bz0O&LvG%JFtnXUgPud%#N$u zkB2?`q+B?~EziJpEytqxv;U*<&fmX8YPy|UveD*CRL9 z)g2h7u)1=CYS^&GOOh>`&DRn`$FCn~G%9xV`JvG=3s0qf*ei5pxkL3nNVKefhP4zVmV=Z?WQ6eX>mp(;B_yXycd(%9l074(O#PS*+hMU|j0J><>5hdndal z-5a!Uo9J`!niCUy!clSc`S_}7OTwd$sKlP|F??p5wVAE@^4b9#z1g>8 z&Glt&lx^QCUp@T(_K=yJ^s}#RW&|yWs<5;@_2A-redX^B?OB>%ySge}L#%DI9yE#Z zzlx5|^Io8+(XhDUg@XI}Sclm3@vHPQyh@hI{t$CG5?`h5lQ)dlc#z$5w(_8??7iuw zPa~95XT2^lmfP9dxK;PDf_%GSnSYHl|89L@&XG~kAuYdc3g%AVaVK=ZQOStJq_Q?o zl`eHPE?!6KFvO!G3Cdt1GV`}4HM?5WGL(F9lpBpRZ-962}^2r1efeMt!aDv)}-dh z6(-MzyiIH0*HN@i+d;2%$b`FtPe0%Haof$3H4|qHsu3L@*7oquD+9&E{7#Qg;}@+P zU{gG{TvC7Zp}V<;!*7HMdyPJ{|8$*l#Jrt`&H+-(j_f~e`0V$E$pHn=2Z?gKzIZl_ zy4v}s?Lz(Q^lRVO=Y;H>07^7A2uaKk^;A24u;_8M)?o1g6?X;)o|!*%?8@uOPeKmK zdfhM+>9RU?^MuCHhnq#qbwU>I=7=8FP^h;)tg)-!Q%#z2;>^TBrA=qX_e`Jo#@c05 z>E|i7jm{h8w*}~_?8zJ6ec$SLY4U0JiEm7jcYNv@q;kk}|K<8O$HN;|CkyX$YQGV` zYSP0SlU!|IPm`XVBP1?&<(%eQ-8bus;wDOTde&|@ye?tFF~?<#hK`@2`7q~1O6u^+ zrIV`V;Gb<#AR8C;W89RHLKj%C-Uk+#%LU2W@yEUyb4bzh{Alo}!opND*)b|=+1R{^ zJLi`xT58xjjAir3?sj?ja18ILq`0I8|M{^yk(L?@DjF00M708Ue=3z0UE*l)v>`-z znDK*Y^|Kpa)qnfm6e7H4+Z#@$t?-(2Z`bNrHOdY0(vG&id4?w=cUePt&&^UvuB-0? zc}K4cK?l6DBX(xIzto+qujb{JmOFh?rJ?JUp^*-ovN||7CbVZ>Q@n7ZdQ+zCipgR- zdsY>fE{-}-U^2LCt&)khj>L$!wVBg5MrKv6ZJD8I;5PS=jL@h6%WmB<&*s(q+Ers7 zy{BDRvj~qJvnpxJ*kn~V?&PEjU5+THv7t+jIMVnXJ+imY;PUjt$AGG zShTmNli6)p8ox@`_Pt+ozygJmYqM9%-YH*o_N=qzOMkQEVYfz2XuqA8 z@-#g2>Ot;{$q(CW3tGnOohTK`(?57yM&fLhO>mB_^}z4Rhws;`Js4{}dGi3nicNf1 zsrws}*R>zk^H6u{7-=Q0k}tG*&+oQJ`j*EWJ8TWi9X2S4$s8ScLcB1kRpR85j5ttdHIHAZ#U zgY(G-MNhVR&FWE+TQGG|$*hZGN>1GlGO63UV^Q5UFZ0tEowSP!?tB@r{A5awNlK1G zO|5!F@)*~-KGo#|~0Ck=YLIQ8U&NpTlC)(Wr5IR0su+V4t-y!vaGy>*!F-|T8W z>P!l^8F#(FaqO?bJH>4LKfLu`qH?(D6z!vbF!Y?zaht{1Rl)&YYN3IX*LNF5@Rjn14H$J)MosP8)R*quw^KRV0XdB? z3vMI_OC|;!-5OH8DrMtYg?iSSC1&UO^KX4ymupe9E@hFSCgGf z?N?6V;K=pO4aseW-`0lt8@~Bc5;2j`oo!$u z6Ht>sxZ>=-m8J_XT9lRFy6h0-*K&5=oBE@i_n+T7-rwdSJJfuI`IM}~-s-m|zVf}Y zaqg|hkDJ4GMBSB|nsO8Tvp(n+emBeX*iRA5AHu_BkAZjY%PsKO7`gfG;zcJG;)q*;Q^QPq zZQr_2AttA;NVipnl=d|2-}QCpq7C0-H`%Nocx~k&-S1}Q-)ev8efJc1Ub|wX^;LWI z=SP*lq`3R+DPKGyUgN;{E5qV7CU0Js+Kn`w*R?x{DvI{EQ+8Z_<-r;wf%i zR+4!?|Jdg{zu2p5U$&li&&phSw_>x%%`(4{>e1Iz_AZdP-Kwc%bL@cek8jJX>=*7% zxOZT#%`!8k1%wrbBj|CExu<+ts^KgvpMlvpM6>c!vdlOPfDdc|+i z<3+`$vhT-G0Z{uiUaZIYqp( zXMNn}!J`6aN>uN@CMnsj@8p}3x6-ZJXHiG|?pCcYgJ)=c+Aq3wvQqw;0_V3)XXTXh z^BXI`rv_OgMr5s&%AL8T#H}_!efD|J0jPb}77m>XHTLAqelq(Lj3La!DFYc;H1wY)H=cK5FI z6HoJ}m-DUlF8$yhE}T|To&8()^r+E~$_wr!?pU?g^wzfP?sCDS&Y73o*+1WNTdtw7 zYWX42q9YY2u04Oi$PWMI6|vSRCC;kC^4*n(Cse<^mi22i2;~%5+b2EGoPEtJ>-d1O zFJdi)Dzl#M_G6{blD%R#K?67+J|e+jNK$|CpX{Od9r=o{D_z9}B{(0Jc3{{2#rxT^ zrCkL9v%0S}M~ohu#F!+Oyy(!b%tpK8b2C&MVq9i;ADI4+uGh3W8K;kHe($ni)zb*)Lycj{H?{8ne*W=8!Mb`mp6rwzqtte6Wjk%W z^u1goLTpoH^`CDC{k}YD&+gJ~OR2X~9yjdwC|=sU0g|T&$c)L2aC^yh`Wl#)E}r+I z^|Win%)RPO25wzX^_Q=BR-)(J6j0^vCEvY&#ffCU#zKAb^}|X=^Z$ryyE&g3+%fR7 z+j#YJWsUMHF1%aMx;F0$>+rlS4Gv`~t_#dH#djdz%S)x*yc-I}+^m^mva)ADv`%eoMsxwPRJb4~MTB zHa#)$ZpPR=@o_)8w%cdE-)F;=f2;Y4Q!#Y-m-N?eN+rvS_ccY=)~HFZcM!KqJ$~8z z%sI>1f%|?YY_LAR&LjQt;X$i4qQ6Z3u>bIZbvX`p>AG3sYF^Sa2S{&w_xzaCo=K-V zvWiRF21$+i_(o~PZG(}iUi+3td^nM4G`()Ed0yMe$y>Kwn`+#l^81_dwr=58sUtNf z4Nu;EnB5@Lrr{7aw)pNjm-Gj}-Va@|QF>|7ubr;a*K@i)g($Sf$!=4~sr{2O+wx+D z^`!bABlL%w4NJT`P3>x7R@T)wdW#fRKDEp~c`wpGIJ;ZLe3pfl=&X~zqh?BVTz_k} zXNvTz(jZOM1#9D`Y?zoZF5|%0G$XtHi~&BZ)a#`ZH*A`0Chd7}l5%!yTy`!)E{a3ToA&lYklJ8+h(>W_nnF6$IT&3=R?t(e;@QoTlI2kz{IQOb!j&F zCl-Ew^Je0-NLwxT59bZ970)-Mn;Wa{>^2u-Iltw^xkgtWobi3$%7{ds^fC2{tzq`H zr^=;OV!GG~89^3t@+)P=o3x%UkN>EDZ=g`NrTquJ(;Mo(k36!gaSU7iNO{R`RkhF( zrE}J+2VOGMT~HX_Sv)5BkzV4Z;OEY3$5j~1dd6#u-CK6`qFN#I55sU_w+vkIc)cr( zB-ekO;}g!2X|j)wH%oY~e(!N^@0JMWRNE|0b_VpX}{N}m@%U`!wbDG)DJNHe! zc5?B&60IwnkGfgk$x~PIQ}5n(I&->vYqr9cyo)Av$6mhrQCoX%!^{eqLVwqouj}Qu zm%XT--*{7KNw*#Im|wE|ky90ccfMZmw7jibziO4Dvh7rZd$r%fl{-R1TzJl#>bsOb z4nFQO?!BJ2Oq6Q4^}5GrUugO@WSX0%Y8{dne891E(tV@HJ_#RJ30CKgY5@8 zQ+Rf4-}|e}ZBNC1mr5_-ITEc`U$`0BmhjCxzjEK^9SQ@ci!tO*Wiv#cZ_%ApV!LYRSr4%|`8Q$q##R?z zD`YOqE@KF}In0$>rK;s}WUf?hPFZn2li@bsQfGRp>|Xap<0Z->b_O?bm;FrFRFlZ4 z+j+XDy|(k1{7A=wYhxmkMl72>XRci3%$}X+EhA*Z+=jZ!4F9QVS|#BjeEP(jU6LJ9 zX5sFe=lgZ|?kKt_d`~wvl|3vfU_N)ne1lJJbqdEnFZn&f+brkNxZwAXzPx(-`rtv` zRj(y#Cf-+4Ffz0V&XcHnZuV-xq3gdUAD*HioS2(3k9jsRM7G%Ekk=bqu{Em?G+H*i zF_jlv3T~V3JAY`U)43Tw&%35ZJX&y6Thx2)rktCF^OC$6gKsQ7GDb+sW&PgBoGCMH}=?wD(+6cehFY9DY&l%BPqdg}B(~oK-ftW0p#$UHw`1bmGajW4t)8f&B6>EYEo_PYwP+JX#=#Uv@5jYDR*FkkTIVshsn7FZ z-)bEqx$MFhrAd<$dIG&>tXsyqv!+Jr!jf47?mzn(-DS9Yn973quCY;{+IM~ohzc3^ zNH+3tl9kMWp^|c(FkO$smj@Z8b2L=!Qq3Mqba?W#g|k+N>n&NRzDQyB&090|#R8f- z_Sze4y_w!3Wt^qn=(1tc;daZ0m>m*Ql?#-<5YW- z1lfoiqox~wF}!}W@#poLnju{qu72qp{isCN-C^tc7u+>DY@?BP2IhCY;y-$IpMUH1 zx7Xip-Rdmu>@2;PcbXP0ap`>;VC za-L!+Flvcj2x3r9WH)DynaJo-oZLK{8N7nUcUu9&|>xSVfO zy6VA_t0nihO=V2qb4Y6IkR4T4LQHMTAGHp0$thiz!ZTG5^$gK!a$5fLobT+aomR4Z2tLwCK^(qESI2bwMHz*2YHf&yPMBq3(8|RV9OS-qz!@bbWTz z!@catEKhZIp6B%X`)1}c&O_65lRKk{^*h$wPuFq_V<;Y;xl(^#OX@?*gZk){Jq6Fu}%lq+na{ZA5p2lpYv_#54Eff z*D6M=Uu6>;p6&d@w{fKrEAiZBwQFxde!214 z&XXT*`v5&|ket zZSn5y2V;e!%p@g_=yjypH#@rU7OlCt@aMa@Su&jIui|PIUA-qQ(cK$5?{3Y=oUXI= zyNZnmi&yf~TJ~<8Up{@9ld#s*nn}VX^JFrfsT2&`Ad@a5p8v6=ac}l$}%!Y*_8{9kCHs{^t+k{e+vhI5g-acZ9_|`X0TG8W=?fk}> z*CyUM{o;7Wv&RnNQ;c02I2qh6FW|LrLHF#f>I?An*7#M2)g6IT-%n(*uTz|ZHeDZVnlZOHZJHh)?2z_VlM zkcE$S%~786bw#({Q`M|AsrJSp_NTs8S5*XNT^)5jWZzPWEBUfKvAvo#d(zEzO*P*9 za+~5v19twr-`01|zC7_L_t3M_8MYJSu3U)QIrtqfpuR9oXN2V>_{mAAgUe^*bM1|f z4{S=Q8~tPVni=;lu{Oz^h}Jxs?-ls`Y+T^r`O#Ke7w%A6w6Q~TUcju^j&bvb@0Iwq zSM+M3+_9h6Tsp1HUhH=LGT}{x!S-ww*4e>(99R?9Nj}s1@+-IE!u_uvHNPr-2#P&(VcBxEeF$fWuJNbdT#84)DHu%^3zvO-E{Y{q?VW3<+S)l&Q#mG zkEdyRHJ!gUMSIhZ^QQYFB3o9Q&UxXo&%piR;7s$}+?V^+*J%eg`Eq4m<$X1)7R?m1 zwwfrKvc&SM#fyehOG1m!mGU z9{;L$ITI?Gdw9I~6Wxm|YAzj2J2?9Z|5^Rp@M7cSJI%{Av=%3(W!)4X|5a2kTzRnR zh9PG%&1U~TxjU^$9DJ-iZTX%1qRomvO_k}cX0hLYJv{ilVQbF0jEZ(8DP`xYdp=yA zb^YVH*ykCWRqMipt^ExRoWw_FYOasHb!<}&{|nc^KSzd}UEJNmy0!Xx-i;}xwPq)$ zj!&rcT*%uwAUe%(;k~$>hPybK9wi*<*@Nc<9bFo7tM1r{gVQXEt=Lu`n?n-qI(2@( zNOOKM>)^YK))~@G7l)p{6nSEs^ON-B)(nfebB&o3Eo>boF{kKh>1s`3>gwp~=}gm^ zA~=>ZM8PW){DTjV05NctD^vs-_LmUK4*(1%e8DTUei1_`Ojc;*APLDNAj|}1%1{8L z8BoFO!Lpl$=SqvSVnjrAM1ho`+!P9cvhGQvr{tN zfPZkg@ao?Bhad-OIsDUGzNELj2y&2A|It6ZSAQc_%3%1y*WUVGz4ftUg8nJ@?=5FS zybKfU#Xddp2wdB#8GX}#qxs5}|I;`$=-lzmKqqENXsyd8nd&4G_agnM;lBAHMi z(kmm(=`AlotBC3=E=;LNo{@|bbmA&;v1-C*N=1>mXAY$6>^p#*!qKr@AdBy*kL>Q<;M3D$J>;HwBAPd$& zFQn!&$jKp&^VIwW3_hw4<(cR{4>d0VgE0tlNp!=AnooeS5a%LJ%_G3v5r2y~HGcq$ zMBEuIzzmRwDG~gG`jZDzSq3#9z}o|eFN6kzM2&&qEklHXj6`|-B0}8N`pc1W4A83x zLz*ChtO#T9|KPcRP~QS1N-p-pulK`az>xH%r=%bG#(wyxet363d_X_#!uTNv{9glO z9Y|EX0P`O`+hhZ zaOlrOG)1ZS4gAUJM?MM3zeDm=JO}cJ`jJ2055L_Hf7}oM1vs=5e!m(fDo%sff#Cjp zUw)X-54Y}zyY<6;0Eg`!L`#o~?V#NV#1+xfqhdPXTl>+I+7Cb84=+RdjZo*PJpt&i zLVVB=kO7I>3&87B#5?3E%%Ea8c-xHlO2l^xiWy%4@5^t$`r!=X>)!4R_Wk3W3E4LlI&qzl3)@TlH1{ytdQcO&5I_k%k@}ScKf!?0DpBqcR05BkI>U!i zVT*q!prB1!4Qe8y2Si~Nw{?QYQvaQPbhBX_9&At7U|%p4pe=eC&1k3$KKdyz{U0MJ zDY$|dfgJFls^@?Efd^5NdjPJA@!XJ@8rw%fpZl6Xfu_ zG??qtxFU_iulK8MLVEF*VNqgY=1}1Eex**Gd-y(yFwC6C5)7yR25AUIIC7=)6 zqX-)W3F@bFJqSR8FT=qtWOQ1e$y>jZdWUSQ@AI>jI6#Ig9;2Py%E?g5yPB zccW+=uDcab2&4&!!~W9O-BKEdpTcAPJ~Taa{Sh<{^{0VIvUu0`XGG)~u}i?07*yV^AQIW$h!<4EIlJ@;vx zuIB}f)Af9(ak`%A==@9i&5p*Q-+I75m>dx&{dS5bPanr38i#t|FO0xc){h=}bg2sU z!+TrU&uTPI@7HV^*QLpa(zqUtZ=rFzo_fSdKfI@LXulb<|1(VweIBX|0zx2>dZy4g z)Dw&J7$Hvj(}j>PLGpeyd3~S<`)3!ro`8Dj<6D3@X-^G}Lwg260gxJKdg%S~8Z0P> zVo<&w$?qljQ^d0g-i)}Ij6e^x(-8c__OGDvX*3>yIBpkScfu4-lc)Qklg5pJ9M-Rg zE>2*(^nK8t#z)iS18AJ?&qx|qqsbpe9GXX;{}*W-`YjyUUqI7C_w#)kr|%;#Xq-Nu zztK3|PH}WS2m4F6a|DfR(Cjzrhp(h@`gv&!jnnm08eB$AHFF5QqMOk9J^reHy3t*R&rVPSZ~x_aqvJ<9-T_ zdn!#2ecU@}d?wAFrBEqI&`$dJa%r4CZ!l|ke5d3A=y>GQ+_8V3?=m+ps< ze)#Tw_~Cvy+8(LfFDO({?V<2PaX7UHpnU?lhvI0cDS7A6PDu_JfTC=fg<{Qmo*mSKc1klSJ?!SG6tOv(sdqO@0^>-P;%h5!3A^1jQzbC=P(0R_6;P@vG zIRwY?Cyd|~XnZ3H?uEt?pHpzZq|i8SBjkUg^AP+D5hg6}i{{~Og4dyinnv)mXk74h zG1fC1z5ywVkk>`?@HD}d(fqke@HYZAj5319BmMZg8@G!;uW2IWLy>A080g2dyvoc?L{)ycVMQ^Mc?f zQM`Ih@KChbwh??iT1TG0Bh;9$wpB55)6dK>91UE$SXC=WaQM>L0zk%delN`;%P=Z&YxDiM2jcB}g65Iui z*I|O+K>E)U++5IoMhU@xqV-r#@K5ljCP?t}Dwy!R8iM8(P@Z$Sre{CotqGYr{jM#w)!>t!LqXCeQr?1!%=_%38mD8Uz?`5a5| zLKIJS5d0d7W9bAJL2(1$-^TsI<9(TsuR#61MR2^o;^zgho)Kt#@%?bjy^uZc2|eG? zy8ce^6j%`?aTK4hp3lfX@&xxod^E|?e4aw^+o(N5f`nq)~|==c@BzynB#SV&nYA?B;+%YKkpNK6dJEb1c%S3!1RRR zMX0|o36A^umf+RUFp$~_{tnHbE`mQnc77-L3)Jo(f+r)ti6K8>Kk!k0Ai?*cc{qgN zd}Plsg5&xs1dl`WO^x7zNdF{)m!t94Cb%Sus|EzGMfk!W&_-VB6&Jp|$;`sz`LcEaRzYxDgaOwsf zSa){`J`BaNYJyKeypG`3h(9AZ8}TNBYohhoN^mL&fIlAzj?^%|5d0}RxBMjd3lx`y z(E7vk(*)%u2tEPDF=>L!AwBX0ABy77aDtyl>uVIjN1%OtJi(Ws{RMxnhwU7P&JVK) zd3@i%m*7}_9lD56zQ2p$b!fcy6MQ9#w;2R4M&ojv;I_zbIRx)O zaqk?#ouNZO$|rario=BjUy1C$MQ{^jX9dCW{iAw zGlbyqc}AGV^usj>o`>|$=!efCxD49=ya`@`+TBTTXA~ds{SR0Sr?Lm?C;ogEb3708 z2|Z@W|8)e%dYTAci{g9-!S&Jn|3z><+SjDe{DQ^M&f`da7{OIgek{RLKpmK-5PTZ) zk14^io%0EP2d&>_1jqJ!6TBPQ8A5Q}uULZbMe`6p-;Mh_9$g-E0{1ZR=i0d43urvv5c2rB7W}z3mRCjn6~^NR^it!6=BF&d712CYC3phb z05k~hi|jNe_SY)FOA?WNPi*0 z@w}=g_+r#wVYF_rpSw|fkRkY6#8n7xjP|L?1kXYHoe{xLpml9Qa6CU92+l?N-3dMr z&BL_>ABp<8k>GfqClDO>_YlE1p!r-u@X2Vucua7-9^Voiuiq~O$LkB<55WGvg68KC zw9jCE7|n-K1jl~UBslIb-mkD8ynZbS`8w3!r38P9<_VkNGtj&ZA~;^B(FDiwA(7yC zogN@~0NO9`eO7G$W8{Z?LVhyJml7O*o>EJ2JdP~{e~aela1{S=yG|$$jO&MM5WEe| z+bIOUh~mbKez+CE!%*B_N^m8l--F=Q$Ukcd&P4K&1jpxiKEXqf|5FJ*0-fKE5G zyR!rjL2;mv;1wvIR1kbO%0DLfHYERs;6IU_T?Cgz>y+9gz#PWon1{GD@(1RsX#S5N zxF_Nh2wsQU)hD#e=EW9df!EG93SxWLf8*@ zo#qnqc%Q2!_$;*V3`c&&dT<iSROzBltRek`%oDKmqF_ym*793LXfT! z{5o2{WdxT*=Y&TD$MO0V!GEB5fuH}u_Wwa~qlb{6kNP_R%_A&75Um$Qg4-ZF)d-%A zt`~F&jz1TiLGWngA1i|2LH=1v@MCD+dJwz_*}s|AP2jf{UW~=|*rbR~=G_i(>r(72C8{=hs8`9YW9X2_p22`+-xkrTli(Rc(99Djcxj^M`V zymWxzchGz|LvZ{(hYEt@eY^&77-nH;!`~}xCFIY*j)T-q$jc-9l~DWGKlogsia6Gf zpSLj}tlJQWPPN=UWoNvEL37df4bX`3xc72@MA6 z2Ep<9zk<+11vDU!KgYoR#qD+ydT@V*(76E1D2mk)VeL@~z4?HJ1I`4fTIJWZ_!7b2!F$jGQ zfc+qc>{me?`vKdpMQ{<+FFisJ{#}bDggmz2gXGA54#BbgQG|Z{Iou9Hej7F07>o>p zYoh(&7@-IMF2@~09@|+*a%AUgf@3>B6C7Vx{ze@88UJ2^g0jG1>}NdB)d;>7wL1lI ztS1TWFLs1HzV2Q|$m8EtSWC#`cH;@&g62&sp$GrY$!S6!>nR{OzCTb#=)upyyddPU zo_2!kqWRWC@C7K|3c)Xnf`t8ppFnj>p%Q;P^g_Kf&eDc_0{Z zY>&V?1|yG<$MzHv9JhO);M0&Fo)h|mQ3D?d`4V*A`%Q5C{4qM_QsEbca!M0A4)*#J z+dl@qf&PR?7HyOtPw@FDuTF4hl-DA7D9Y;+9Pj&634R6TO$lC#^5z7uM|mrPx1#(4 zf`3AJdxBFA0nCZu_&Ll~1Rnt>07&kF7s}7jZ)%8p6CD123`~B4mtOg4h;s-&7jf)A zJT7*KhZFMnzGyVT*+_mf!SVOi`2@$`2S_4#9MZFk;Cm3?M{xXH{y~CYMDm#g$M=P@ z34R;N=MuaU@ym$AEDEUfEcWd5XaTuiw&#(WxhWCY@n8^4%)+S zAqGE+0`lOuXZ+ayplR^G+p)F4PwZ(@Kjeb)UjD&afgJc-Al!9GFWcMMlLLPu`Tw>46i^rHMAHVm6QmB*eg{#2?Z5P0(r)u%J~o|Mf43|=Y_)11+P>f`Z)bz#Ex3vvv` z9q^oUycz}dO)iS-;(wJALd=H9{>OV literal 36814 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 From 5ade76858cf637d8e156dc8a1498343351ef8ae2 Mon Sep 17 00:00:00 2001 From: NMagic Date: Tue, 31 Oct 2023 20:03:51 -0300 Subject: [PATCH 05/20] New stable version added. --- .gitignore | 2 + v-0.04/Makefile | 20 + .../pa_context -- interface overview.docx | Bin 0 -> 33970 bytes .../pavucontrol sink update flow.txt | 41 + .../pulseaudio/introspect.c summary | 79 ++ .../pulseaudio/mainloop code flow.txt | 17 + v-0.04/easypulse_core.c | 843 ++++++++++++++++++ v-0.04/easypulse_core.h | 90 ++ v-0.04/examples/Makefile | 19 + v-0.04/examples/alsa-mapper_pulseaudio-api | Bin 0 -> 73864 bytes v-0.04/examples/alsa-mapper_pulseaudio-api.c | 91 ++ v-0.04/examples/change-speaker-mode | Bin 0 -> 70144 bytes v-0.04/examples/change-speaker-mode.c | 88 ++ v-0.04/examples/error.txt | 103 +++ .../examples/get-card-profiles-pulseaudio_api | Bin 0 -> 71216 bytes .../get-card-profiles-pulseaudio_api.c | 63 ++ v-0.04/examples/switch-sink | Bin 0 -> 70656 bytes v-0.04/examples/switch-sink-pulseaudio | Bin 0 -> 72880 bytes v-0.04/examples/switch-sink-pulseaudio.c | 62 ++ v-0.04/examples/switch-sink.c | 61 ++ v-0.04/examples/volume-change | Bin 0 -> 70192 bytes v-0.04/examples/volume-change-pulseaudio | Bin 0 -> 72856 bytes v-0.04/examples/volume-change-pulseaudio.c | 101 +++ v-0.04/examples/volume-change.c | 82 ++ v-0.04/libeasypulse_core.a | Bin 0 -> 39626 bytes v-0.04/system_query.c | 720 +++++++++++++++ v-0.04/system_query.h | 20 + 27 files changed, 2502 insertions(+) create mode 100644 .gitignore create mode 100644 v-0.04/Makefile create mode 100644 v-0.04/documentation/pa_context -- interface overview.docx create mode 100644 v-0.04/documentation/pavucontrol/pavucontrol sink update flow.txt create mode 100644 v-0.04/documentation/pulseaudio/introspect.c summary create mode 100644 v-0.04/documentation/pulseaudio/mainloop code flow.txt create mode 100644 v-0.04/easypulse_core.c create mode 100644 v-0.04/easypulse_core.h create mode 100644 v-0.04/examples/Makefile create mode 100755 v-0.04/examples/alsa-mapper_pulseaudio-api create mode 100644 v-0.04/examples/alsa-mapper_pulseaudio-api.c create mode 100755 v-0.04/examples/change-speaker-mode create mode 100644 v-0.04/examples/change-speaker-mode.c create mode 100644 v-0.04/examples/error.txt create mode 100755 v-0.04/examples/get-card-profiles-pulseaudio_api create mode 100644 v-0.04/examples/get-card-profiles-pulseaudio_api.c create mode 100755 v-0.04/examples/switch-sink create mode 100755 v-0.04/examples/switch-sink-pulseaudio create mode 100644 v-0.04/examples/switch-sink-pulseaudio.c create mode 100644 v-0.04/examples/switch-sink.c create mode 100755 v-0.04/examples/volume-change create mode 100755 v-0.04/examples/volume-change-pulseaudio create mode 100644 v-0.04/examples/volume-change-pulseaudio.c create mode 100644 v-0.04/examples/volume-change.c create mode 100644 v-0.04/libeasypulse_core.a create mode 100644 v-0.04/system_query.c create mode 100644 v-0.04/system_query.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7393e46 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +*.o diff --git a/v-0.04/Makefile b/v-0.04/Makefile new file mode 100644 index 0000000..b1c5107 --- /dev/null +++ b/v-0.04/Makefile @@ -0,0 +1,20 @@ +CC = gcc +CFLAGS = -Wall -g -Wextra + +LIB_NAME = easypulse_core +LIB_SRC = easypulse_core.c +LIB_OBJ = easypulse_core.o +LIB_OUT = lib$(LIB_NAME).a + +all: $(LIB_OUT) + +$(LIB_OUT): $(LIB_OBJ) + ar rcs $(LIB_OUT) $(LIB_OBJ) + +$(LIB_OBJ): $(LIB_SRC) + $(CC) $(CFLAGS) -c $(LIB_SRC) -o $(LIB_OBJ) + +clean: + rm -f $(LIB_OBJ) $(LIB_OUT) + +.PHONY: all clean diff --git a/v-0.04/documentation/pa_context -- interface overview.docx b/v-0.04/documentation/pa_context -- interface overview.docx new file mode 100644 index 0000000000000000000000000000000000000000..6cbe2d09c38dfcab843409c88d5b9d8666c90192 GIT binary patch literal 33970 zcmb5Vb9kl8_AMNBY}(N|u5&C>Sab5D+BbhY)CVix*`U7zij2@QMN`(Gs?`aWb}X(o=S~Gj`OW zceA!?NE)?SWkeKxe24a570R6zRX|OuGn+9+A*BCZm>)ML;^l|Cdb8m&_h;QisRE5JkVNQlpP`w8Em~O7>dwk>qQVBA$aYjRQxPW zc1l6RLcDT38b`T9OQFoFgK-KmC>d6HBE^GHGKjxO1^UB?5HdLG8d^rm%ip6i zk%khndQwOP4IDC0r%C#);K#1#u z5kALJ;bk}A@mm!>{C4nVtR2e9MiLTN>X*%ghIqVB%l5DrqE9J!Dop$10IL_mJPF|p z$-dq>0od?w@JmVg`+mKhI>EQrf~#aP0T0LRC-?gk%)GI3V`*?p#rseDm4kuId{g10 ziqbBm`v)TOk>Z^ap76(UvfL@C9KzEsJ8i7{*sry?SQQr}#uP@P+N$4^Nb-&yQ6 zkmOi)RoDDu*w3b0+0)eT(FU%R-{b{H3j*1Rve?={)3|b#_TxPX-<_0cE55zT{`r>~ zHP)SZ&iG}}45OQL(=Z=IxWh;UywG$UcU2%~7W3~n`MmwUrZG!{qIJ_Z<2($#sdnK1 z)B*-PCg(d~KJ)>!KmurCWNWD4U~A{dU})=L{AV^~#E;7L{+SJ4qI=#uJYYhKsZxHw zbCHon30*3AWo1!TYl~!WA32U`M0ILzpEfu%Ln4klN&@iIDH>8^Ny8<9!YzqZScwQC zG@c|tLS&#+Ex(}5_>*+kx6w2Yw=`avGyq2+Yi~)8?61iTVNdTRa&-g;w+wM7VyLaK z!Frp~SYU2eLz`g_BGdyL{UFNYWn?iW<|O{YPcpu+04iVy&B~HJHBBmY)E}XbjRT2-0p%D!@n5_zN_xFk*Kt%m?wn0RA`T5Xa8( zpJ3N>)7uk0au28Uvp=GHcQ{&w@iH$xClFA$sIr!CM-9YASmbIMC3{)4@-;Ho4(;F8 zJAHrp0<#T5f5`FxkL2u}`l@|^{O5So`^7ai1IB?IFeZrq9FOmIc7F}WWH)pVBP{q< ztGuFzYX-5f7&}s5+SYdu2J1$&ruusO=B6g%V$+yy1ihQlbwk`GFe1$mG(BTZQ@<6g z2%Ub0ar>5i+IXQn@DPP-EMn7E52DF#cSs|mS`qznH~BqjqTGw`%1qKsh563kl@kZ1 zpcWfdd%KTcAtekl4ukw4fUy~+KY^dMXenMWSmioDA{I>^hRgOhUb`(sON`g^6DXVm zx>kU?KxCGw8Q7HG=q0b|)cOA_>auItHt+x*@__*X;R3vLwRJFJ_}4T91fa7uU_t)l z?7yaD0+T!-0E1k8g7z~wsHTXOi(m+yg9uFqIVsR<@RrpGKk>h1%g!S^54l}BU3!~l zB$vt0#=Bk#a*vuP!$NpqdMND$q)h@c} zo0N33tAk8yR&?z&@?Kdvw_5|-PKDXml@1HubF_Zj-YK$tJ9jNe*SAQ>B}GA zeo2`6By^%+P@w3svLQ(M_vKv)p2h^=y}i7_{AchCWza2O0OZU9Nc(5Y`%6|=V}ozT zPEO`FrjCC!jhgC~>SILwD}Wp}3(=6MtT9B;dCCxC3uoD^$Wcsc7w(VYoYDG5H@+Gj z7#`R@5*$Ui>f57osU-iTCRE4P`Ne(z;IYJ8EEErwca56;%@k4P>^05BS`|~5uwac! zRP_go8FxcIDo#Z|y`Pv=IO5HrNF@1wylGT$Oi^=P;4~>a$K{O1rs{nAZ$_^uq1ioJ zo;Y5j!1{4Z@GMd2+Ga}r6_2P!|Z<&&#*r;O` z=O2WspzFtPaYM(q9DiUbc}K?>I2`e93%m{0LswsDy;CfF{FgrShLQdlfRKZS{nujm zmp+dF5T`&@(Q$X3Jwz2wDA`J5OkK2@7^xYbtjijC zJ3^Ch+ol|?EBw3_0#$tmC6}zjVYpnEGc^hoflM=2l!K~7nY#rk_7&wIY^(kMwa5stP55L2(g&HyFMbSLY?IqKkf_E{!& zv)kRKGxGJqUWAcAKqsQAG}M163Zn#JWlPf*Qma?bf_+)?kW98HWONuPQ4nzn#okR( zPd;#sB0$w}bWXDGOao;$irBwihJ5%E`SfK4iIV}czyH^ZzL(17gzhs0yWG^G3fv|n zzno8?aF4-_?2j5_zDhu9dJk;A@kGm6OY5x4A>yx_x$A&#w*fhcW}|W%e?y-sY zO`fssLSnAEdm6?I_9m8{w_y2HNbwpQ>?}5lFP#Wc!Ny?Ub1ryRS7oYgi=a$9oUMs| z5i<-Wz*q8qtDqZ(ms*^@|3yW1`PJix)I5CjmAmUQ427%9>ZAE>=_B zWxD|NbcgFC32v>dx-Tu@=a{k;T)xs-*}I}%7ngNpv~}Z%JVHF_lx&*ttXK|sI?{zRtJ?KD0V{oYgqK#)||I7Wib&uN&O`%zJUvL@X{d9~z z#3lj(-+3)uf}5t#|JuB!e%p+t0#=b^!1)2~?^V{x%-GtP;jbstpJjGmUD9@!4YlJ@ z4e|Hn&R5Ca(;)|E|GAy$BtOCaQ$VX;qfEQW+W91gR*@97M|KFDisHX-mFSUpDCGHc^ww>U(>24=0V6LqYs5G?r9?atf~Iq#f&tsv-5cRu=9aR}wibeC+I%ZeL=52(R7W-=D0QKbZqX6Iah+>AyQ4 zX)o|_6Efr8=#KwL*&K9z@&tX`xw-kOes`rC@d)u`$M(puhQDEZ-L3FB8ZmFN(F;N6 z!`D?MkM7tRvzQ%u(7z5;u`?r5?@t=}!3T{1jKAP-rRYM@3hPZ&W`yN*|R?*l^xw>rw78Xn2+AW5){E7|C6c;|3Elk zaCRm|7JCgv(SfL{dIhe zn04tM+qx&D^CR9({i#*OmUcLWMkZo zDU}2kd!#A+jt^_vN19~q#46)T8vVQEajRlrjfesBtZzY znLo~;d8JF7pU-y)9KZt~$LH2*b$Tbb@OlfIINX28M%(Kwz_{iX?Q}$=-6-n8snT>^ zGhpXk0Hxi|gVIOX5ah>MAfH1*SVh)G^q>JNUfPj$yUd&7YcOuH) z4Xpk;0JbM|%IyjuhInQgH1O60OdT6-6MjG*r_#W?`3-yERV^*oxGX%)1b>{+M2icc z5>8*S#hJN(K~K;Yjunbst1#u+JltH`SpAGr)wY-n)}{{$P=-E7MH`THaQAVkeb<48 z--52*bD}RwEm$J3K5x*Fq^}OWjb>JEDHkfPBmJ&o4u-E#p<|V_ha}W?mjKqS$8z6D zTu$_>riNT5A%o?e90RixK4@fy(p#of@LY&J%gvf34p*)4fUH6%WFelxLSBk_aLjDe z4RYXp5Y~0me~MCG#u&4YF@oYm!QSha3q`$B_K1%Rt~=&xb1P(gUjL3r8fTX}4;Y)& z8!^}-tIC(md&^H`EBaYw@^#qknpxv{*CyAf6)+XL(;)hsn(c;!Hg~?Oj32wYPDS5v z6Ld;eGzxx@Pni@l2c-7Pulu;9q|w9x4Q>b!lpYSI9S(9|-#t#wcAn~PtRbnR%-&<# z@U>=5;vcA~-7cTMXyyyO$}%hMMm=~N@q`kLoP2JT<@WoF|JOCf$T<5IFDMX@J@!9_ z&c@l=z}Nwh?El$>=2O;f(il+(FCS4M&6D8>i1vhK%gj}Zs;SmYVVWe^D=+(fzK76xo>uN+De4Y~&ErSY(f5=-`9j>4s#DzlX$($1)ESi$6 zDq&w^Dt2GbZRi_oC1VgwETUxAVkIG(`9r8BI3vrR7c30-*(=xg!It2Y#Gy)!IWr)S zA>DF@Ro9_^b@5tsye$(6hot$!mxZK9RLyX<jRv$DgSpDWE|}=F0GhCcskz{gd;$z&v52u%Jl;n?tYKQ}ej=)~7!8vi#O?bo zTcJ7_S9{!52Bmz-bFpa0*6o;|Y7ZtIJ(k?!tpz2!@hy6}V2k+>RRH2n>MSi9c0|*W zLXwQes*U+{cJ&PUqk_x@WZ`!@BjxR_X>Jy+?vThmW9$7@LJhAVtiX!D&qH7mdbp&Zj}*(!>%a^ z;Kw$rBMioD+7uv1kHYLQt|tOLhDT#w;kwNl#2rJf2V7jPt~cFTNn05{P#?$1Q~dA9 zKV})e+r5wl7U}g|-AQ9+7(h*Ie1Bd{n6u=Rteef;S$#p=4^_!nmJFwrAdp5S87({U zbto4~EGM+idx#t0AcnOLQ8@O}bpZ;(Q1rd?2$|XlI{ebj$BT02C4BbwnV!M@b+Xbn zRA&>hbx+sUj8)x@J`@1T>^4zxK`Ql|5|s>pX}eLqdkhmRNCk-HLk#HE9l0typ32qFD? zJL&uWZp{5k$A_Ene$kupOtEW&e!1`}Tl@O9eUa4}xcTH-w@bBRoqO(s;oJO*O>k-A z`#$RX_B`4&IJ;==m0kemGH9!}KyZ;MU$kg@c^Pwh_(aC_Vg8AIIm3|k5R!b9=)>dH z;Ts0u+0pJ(x6#=qRB=vT zvqPWvwe4x`<(=;rw>G|^_)S!|NS98&;FDvL<)1%;Ue}K~ zUT>_Ov?+!|T1D?}+$3^a?}l%CFVww}#Rq45nZl?M76*5By~S>x#9!{3%wD%AYAfZ@ z2OlRJr!Q{rHQHVe&ehMi9*&rn^8-TRH*pPh<9?Y z-sn7^@g8q(rec3QL9asXq9%wY9>iW7UBB%yxMU4gUBZw zfodsgImxfUJy_kOwJBMgxJoZ?61HMzJ=p!%Vk0V3OATNDx5?!ZGLeT)5vl>Qi`Y;> zgAV!Vd?sVP$phO}YZ>c%k|<+$nt0J+oLE??4L>9K8*oxbrBnoO%4C;0B%KvS2p4m4 zyv>w^yKBJ9pzEKP0z7lCPSPT48PSSDQa)X)NAcPvA1S`eT;-p!jqCe;Os`a2B3TI2 zr?<4+_45N#*^HaE9TPr8mn&L0zm11e+9U>J&o(4LtLpP2x+}<35N+s6a_uZ7k%I}8 z3bLq1V_04vj?b_A$T2hwHPyJ8*oZwY)_LJ$*1Vf#*~D=_r^Y zQf?-S?Dyy}B5^bGOTs-3f5UurZ+CI=DHeN656Zgd-KF&t*;akUhYRn4>e39vSi=FN z!Nc7(A8gEatenbBPK z@O9SwvuEn%N8{)1=Jl@cbSPiGfXU;}l}AuClY?<|D0|PW)id@vwvuNF7bwx>J-Sbd zkC)~ccpS~vET!sS5j|9ejqj-KZ8pa=$rp(XB|yjxwi`Ek(?r8pWZuI*IV?2(7rU#w zp97ZhlpoDmiiiiBn{u4=ljHE_AMNTxeVP)95Gjna;07`TAX?;ATezJ~|Q?nM{R?q!1ra70p9zFd)#OqMPscO7F z425i;Jon)`%c^}0c-5&dpgFvw?J2yNggb_nAc6;NDM!PhBVLGB3T-PQ?lO>8^e+o= z?-wEY7TrteBP>5ureun;lR)lNIHohsD#u8Ik?YBfNOvFYI-BN$QgTgWQ*E_6%OX!(S zLU3wt`Cz`@CvU8mP`NBE0=m53Dy!Ae-HlfE$dOWfo(nv$(;wE*YiUnnS(1`&YuwGb ze6w|LT(<^{LnVRu`$wWeISzNk6&jo`@v1er-owY5(b3I6FD9>TC4--yk{{JQNCfaO zd+hwswBB~DeREse>4q)&HVd*nTq8}b+KD99jQcn2%WKlNcaJ0{KpdP%O`$otkekBJ zGKO%(qdWG>NyWt-4&w7jFk6THI)To}g&BZc5^^vYTZgAGeyuC}h;1K9TvYc=BSqer z96^e?)9?@4IgwVi9cOe=*#>v$C$bBRGmfO?kYMhQ+cket*nn*ZqO=Xx?E+Nj=>sYl z02Nbz_hxni%WK2p`k}ZX)vkEczzFaF=+C5lR^3mK1Bha^|1{Fzrc#kln$lb_O8G zZeWG_qM)VrGBm)EioH3$mYr=F%pASj(L^for2ifpyE6@5|_&6 ze2Gi8dYJGNNzW6;)HpmsR5-#)qz;`bQ{BLQ_k-jW=C>1)zl2pk!r}@<^9Y6q4$ADF z3;0t`C{%_0+wKmO;_hz3FDNrdSUtz|ukJvUp;OFvpu~5u00Z7MT^a4n`hTia0XD!; zJ%aOC|55*c1GrcZM)C;u5eUr8AwUH5gpfNr&H#qt6%MHunw%nPnmV+NP=3Xg&M4++ zOd2W!x*)ru&Xx{q`6LWsKhVj9qnAAa_mSOQ6-gSs1dF5f;$RQF>|P%VD*!4 zPz*`!*wHG{`6r)v+f>;VCmU3|#Xg{RiS&-zD_T8AZQGF)x*a-;MDa-F3HMs4s^{NT zvVUAIzT-3q(hZu7qx{oaogn!%m>thqh8UQrxPhSaC548V-^dAjLRR19S z|7%5+wfmkdbv$kb=AN=t|9*UGnLgh^O))Uq@nYlXlj>T>sWvxEzhTlj9?ac3N8FA& zF=p!AlI3~9SkyE7EyJayLq_m*v?)fBtD*CqrtYp5n{3v+tNohc9^&!d>sWO=pB{eq|@8c1FvyJjfo~ z$KJ=9cfl`ec9;rmm|mqI&T%1d^jvJ1h};TX?KNXoC(K{3zf{1(m^0Gkj|WcM?yKzI zUJRuuKdbrGnw~zI&VSmJ%s(Ep555{41bXzZ?p?18F3V814#afi|;M(I#W?+fWr6Fbr+F1H5NW_jJ( zf77CD`kte`9OO_96ZF!kpc;cAWdfyrhP>ph1u_>xCNc3@W+TXR_JhM)3$ZorO9|t8 z?R0|W(AV|Buj}VHvl%wOcxTO0WrCwH+_TW&pC!?ocb;lnC_ z#mc@&4CQQ@~phQ^prk~&Zr@0w3e~XkR6K)r={1&(?LIhBHzgbQ z;cpjR9j(nOnPBH!p8dFAIi%;*Yk%3T-Oz}!4|X!e0G7)-^t~`CNJrDv>gcpG6ki@wd$#E?Y%^a>EL_iKu{Nh)m?U*1^$pkngeM0E|#}O z6NSOUXV^dKD=o1EAnhIXYHVO^`IIX1L`D5%Z?V7x>ak1I`gsm!8JzZC~!YvZF{SWD9@=CsGTMe2q#KKF66!nQthF5BRNlGdzFOCU?cnSO zS*QEFlm7{sCc%Sx4ADEEEL;2PJm#QdNwPULKjZjq15>n~Thins3=9_AA%j=2wBS!Y z!qx5c7VGSRltmk)Z9L@HCSiw;5hrH}RQaX1N<24ZMLevm(ZL^_HjuhW5!`Yv(9U+P z(KoG$)N4I$7te!^oo9TwPADR5^vn}IQ>E&e( z_;IgmCJtF?vkqBm>>)RvY{fnx)TUS_%OIh~Fmrk_;QPnBAss$)<`oPW2DZYJnKSgd z43m0j8(SJCne^=rj{`rHCl+f=BkG@ZP?{$4&~g3x8U1dJO+-NjB5^sA4YFgtv#8l! z)7EjSo7^WGUnPIPrgh{{4-W47ie=IaJ2tfW;5ruC(UINnxL~+-b{}OuICj3vt-)jH z4L*R*usx?<>SqZ{8?FY)gsI)TrDVc*i2-G3>d(z@6pgjujB1D6maG=$X%U!GyH)ze zGsG;Jjl%bRiN|d0;%5dJ*DRu2FKBBzUy58N_g>)htv+Q_=K@?P4lUuy2wYX?+E&Y& z+!i>@Rf|LK(!sEo*gVqY_4msYPUVq)|Gjto~nF^EQngwUPg}&a8CwK zLrbSt0&k8W{#PuwpcV|9HiqW^+f&E4j1i)#3ZN`|q^P zyw%4Dx7K$e>UN)Ami9J@*Lb~Bv!{;-CD_~7(^fiI|JM`!3)@J2_4<>q#*%IJ5%qH7 zPtSN#9PDOJkdP?xg0*)iQCXKR6ca%*(1yNkRynGc0u-^X(6r)p56$dNhcBwT702MyHEBvmMB- zS9~z(z2zCb!(%^;H*XoL#eE#0t+e-ABls}0#myZ!N#CfZ+9)=v3%B}cXVvX*kMO~+ z@|a@lLoZUyNWVUb9#3G^4KRFGk6c8i>z#+TWWimm@m~C9+qO4IWZIT0B#RT7Jg>Kl zwlpN_;v2O{d~5Z?)*gF)7^~`HiAQ6Xl_M#p->sr&&PrW9&);kIURJ#QI-VdT{n}y# zWlFzI!8a=T5FB0eanbF|?eiK`b`wX`$zG(It5s(CH8$?3xMADcyv4D8RIs%=c&(-# z&Pa^#gd1ytn>nK{05AF02ts#GZ+9Q3@?Br>e*)9>7IfZRUvP~=c}*(+%{ktY6_cT; za{wl#1CQrn(QWxQq`&8jFS9@n7w7IgUK)jE8~EVOG$w=PJz}a`-Zpn58YUek!?FDk zR#o9xINZSKdDV4zTq~Q0*9~-gS3~!IaUL{i>)9XC-LZWpVrP^gQTT(~ZQXWrcRfyC zHbl#yUnnENJWp{e+=(2Cz;wLGYG@ETY-YRPDa1)0BN7V*)!q@szVfuQ+FepX94Ncknvjvntn}e4`CW$T=hfzIYv=3{h zo>gm$4FhRoK#ZI}usy(9K&usVHQa~i3rUy5rIJ19_m;SG#HjuH)N`p&WqrU3wTJadvZH!f$T=~F0m#c0~M)gX4VU#3C*hM%i&v1oGY61lX8zUSM zVa^KUR%Bu{1-UBpE(=KkPVFmwtdTHr_-OQz>D|Jo{>C(QTA~^}uOnjEM4F{3$bGNP zE5uLMCnSNEQZE6)mN;ufxc&O1KQsjXMFV)>E~nm@k^*0xTa!{ehIkJ^gBT?UK*PU{ zQ2{_>7iZy4Yt%l9%AlpxPvHOIN!HDgXmW>+rt`{fKafUYOC*5q(< z3|GU#TvLGK0w4ES=?(CgeX&MCmc&`jMj9d|;Qc!b;Bs{KL`zyB&jGt< zwcM$3Y#OK8ng!I{zMaNeBc^_9@t+j?h!?I!<-u{fS)3AaUH8!JGz#-{jMETpudq%=+JM51=VZJPv()Bt zK020H@Hk&~y#jrjxv2W8p}>(}cGc_{On(;@q#s&zs7_c;KB*yAUY<=;K4zj%h=_Xc z_&eEXiyB0VjJ1A||A#f?z?`{2W+uF-nx_X4FE3Zs#uk`{rw4h_s%Ha<$HDP*S$~aY zU%>KT%YrAPqxRs#7y9odS9eFE1iz+djs*v)z{1hO1B)P%+v?Abk>qu`08nysV*h}$ zaQ-*cSm{5Z&M*G&P}DLpCQr2LL+m=6dz0zeJ+pZj-uhzFrU(Q@h?J_7$eH-sHn+7! z;yg{yW&p-9G(p9&MIk?F4|Va3$RGSOz+ak(Fj1;N-95Nab zIAPku!zsxXT9HT|fktDZooh&l4wM`2&Q_Q)$r$+N&WZB($}H&7@ieO^IK|M)EHmf& zMj75TvwVy$UGzLL{#erXjNbE;J`7-iis_W9fd*9E`D4-Pcvz(iWvk~%xOvzGO^;;a zU-y{h-QOKyGot1ixO-p@--v0#*F>&%$$`GFB1Vd?W&^M&{*8t9{(r+F7%QI_Hrqik z=`hq16s(v28|jzR|3)(YHVQzhE%}3lY>%2Nl!>oeo9^ixE2<0Of_=0ZtY3Z%y?1=9 z;M7nAF*Tb9^8qgx+fZcc@Vi}&JJ&Q5zg-izOqAzW(CE*07Jzzt;KAl#?SDsv^XOj@ z0Uc9x7~+=D*6!sI&34Rl`m;YrRQL2DykF!7t?K)j4EL`U> zC-%I6y%4sFfw^Vkh3eC>Xa}w=i9a=)k$NN7#~@*6-&bQX`cmZlXA-n)cV&H~N?SfJ zvfl-$qSAQLIDG`dW`dZe@L+q1g{G)#^Gx9-aFUn*>@+c*?T0?CA9Li4d3Z4~mkO|o z2nBUuy_pf~%*@RoEoG!cS+U++d8qZDb(7kJ1V~$jTo|}=T56dTIQa(KPv5U>eaAr7 zuT1wlEJSnPX=D_-9i5Qv1u(@+?kuX*v0MRl{7i z$s(zU6j5h~ABhBAp+}VuX#LBeE!wab&UMly4*t&MEelAS%03h726jcPEQ)Q(L6#`qrICn&*6jFwJPEZg5#0MgL0}+*jb6PDDv{Ruy7T%yx4g+=~05ZY{s1m z;sV_~V!6%+T-SK^=297O8WuKHsx;CqrOYJsiy(utXZkcCHQr+~c)PHo4qUpeo425v zdVkv~1#{?i>ue>omQ?{VYL|crAyrU%I^VG$Jstt4Ny~-LvceuW4TzuIaY#Uw)Ct`- zc2O!Lg;34PrXc~K+7*Qv79iU9Yu`A!$TIyc>iuY74}u}Au8vrOes}|T0v;m$UlkOG zEV>HzV>A@h^LlK74`joaT<8{2n{T=Q@?D+2um*aW^g8JVmrmcUtalG#uIy%qeeXPH zm!|xI%3#3W93-d~VP@!tC~`enw5{TdNB?$H`~kAGO~-3@-pHL1Tx8{PpK!&`e?JGP z$6f`TZMV5njeP7=zvA|pq;oL=yiSB&eDO?)Xo%6u!hY&)LXiJ8qEp!`R515{Xr7xh&z%avx=)NjmfSk&kBoe2eG161Htxf?Hf z$C~q|OU246M(Z4!OU=%(tDtvPERqPN`J`h9%CM{8!OG0rO0O*z+26raswH++qSOFP z@7dMnBXxFFzPCxq)*1~{Xw3ZK=&#TEhw?c#JRH+zLU0*&Wh33h$aHCHj%D=-uxh7# z^pg?LaxyX$5Uzy!N?}r{K_|Kx}DeOzB@c-WX_LYlaF~F`hmJ?^4v!0D0HpIZC@8!LM6Xxt{+YTBX zU`Spg5G-8cj5!S&Hk-@S-#EZ3aLI1RmzRc%+Ed!*X>t#VnvkPTSjzEXFu-l@f1_j_ zYqWP?r+!+6ByC#+HLyjWE_EDXC7fDO@WNA-g^Xt@HhAm|Gn3oihf`_~Rfyzq!Icg6 z1o>;VU-X%JsM^}K9aP=o6+VFbTBAJ|p29RwJ(syj#|V#{d8oX8_w(}=pA-8fHCuoX-v07nb&e*CkK`@|A z9_wL~cjX&fZsV8Ru*o0LzLtG8>0OUt-z@ChISK}ejPI-M{Z+~+@KHJ3%hdYN{W@r~ z6*7Y74Yzx`Ds)|Un0d?CIdmUOCOj|8nv=`%*?t#W-1iAb{Be(aBzr%cO1bF!y?QgF zUD;yBlg#7^T=b%MY2*5<=1PhviJl=+XZsFywZj&)n|^SDPo4)3e@3=>X>&nFE&KBu zERQlDj2<+T$#SLz@lo`l;F@8FjS$fwf2CnP{UuJcFKzU^DRLJvSyzvDa&CRAz6n-# zJxb5idpgZhuKi3no93gmY&vTj@tMyI7he#@YIR=`P@?gIdQn6y#s}TT__`Mn8Z1s) zUJX3KLWzSfwt5IdpAn0C(dVqHpYsd9Io?mwU}wq;+~;D_DCgghPCJ`B>mo*wCHhOD zv{BAa)p9>yXS=w({6+J+x!$uHLCR-8B~R5^n97BtML~-p%WC8>wyoc^+R`|1{{V#) z{R1f7>YqUVl)=tJNTEPqL|GS(iHqZWBV19u$?|`E&tqU+*zV<0xsV4vz50R_4Sss( zy8>M;_eoK)E7xBQ&v}8Gjae|jr4v{S-Bx%(dLVa(4Qw`6F~F7n=uEwq1-`HigNFyV zaQs=XvbK2qp6^^=gSkK?jsuGNbq*i|kO@Et+5Cc7=-{aO1@#bwQ{@(Zxbj{MMjmW{ zJLWW90MF{9nGU3Pjd^LWEhrfH7K;yuzHxB&Ok3EXlaUXw*LHF+U7ycQ zU^RNcknq9^f(k?3@vdS$3v5nfIyklm@gxmR8MVC;sf4SKd~DeKSG0h+5wPuy4x1(`d*g2$Rs5J3RGrikUi;;x3RE z4Zr@@rYAsGXJU%mhrm~|bpV`fjUB3|#Z?kW@V!|y6Ho#_dU3hdQl!370v;-)&mm=4`*tM61F*%bL#;@Z&?}WRyEip7l7j2cUHG>tQu5pW zUQpe6oXS&AL6}7dfP*FuLyzEnRWMJnM_CX5C?f7OVy$k#n#R2HDQ zhN0|UKveekTmv%O;9W^&IZFmE11TUoEKQ=1_NE9WShE{7lNlfdP=Nvx~4QIk{x-Js^K=#WR;dzhuGaA)#p3)5o5)Y z43nMFdc@1L)q?zXh`g{tPDY%ka&VP%4RUY+mW4S;(fBWM;_WthQ3f!u-p7DWU>TzN)Z* z&J+SB$V?ctpa5VL5ETmF^gXBBzWwl9poYB;v01$PmQmL3hYj)o2f{UK7bFfHZAi3< z8mQYI1)Ch=r}7R14s343>7t=VbWzV0q5?^Yzf(z+UFitvjS(xQd`3@5qOsBHhpd9N z8c~^r2&PRZ%nl3b3jBT+7yQR63!mX#EHJah1h-gAuS4zWEp}sXj?SX@g1LpOE*_YVVQv zrTViTy#$Cxze_;xEs`ceE3MVjryb z*VSlT>rzQY&tK3oB<_YQ+IB%n_%^T{#7E(^f4O^Jo+SJt%w-yjzBt*0B(4KdQjD2(}Ds zm2wGFkJll7HcDQB$zeZRYDZMSqG-Sn@+9hlm5z(5lBC4zbq3Yy1|(F0n7@ADrv+LN zfNhm%WFQ|eL&GJftbk6NB8a%A_}}L?d1PZ%VqH)#el-|wh}?6evqT8osLp#703zdA zz=u5d2V$lb{kkO9cKR9|f@+kwfFJ5lbyOo+{2%~?pE^$!msv4omr}xu==~tzl>AGV z!J`Z!bvt#tQt6!}N%>QPZ@%+E;0TV}1p!RC!~5KS3LlcOS80!UFdx2_ZjiOPCdNfD zQdT%dPNV?= zY1)&>PpZR=A@D)S4=X7bSFG+k6K$`MK}zE*SuQ{pQDsje<%~46(zr~zX}^||b^t>m zC$&sz0K<^fZOxrZ=uD!dAEpu=TPY7he;6`=DbF*V2TkezVW@0mfh@J!pglV;N!9TG zRB)c?UkX-Z*)(h%eC2w3@pj;ue}iAfsC&Z^R0}W__>E0(5@=((rH!0kB$s(3B{V1- z&O~;uogiytox)W^J^E_Dkcq!#MZ?%){~HXCs}Cw!kb;5(cgLyaRGkJ(04}!}%P$nT zN5%N}GSP9k%r|BU5UR%p9qivawN|LVmzIAIU1?heELx*%5R^^8f*)*JJyjiMBa|C?Om81J6san?u+th21*3t#0RRl%OSxK7YUgS+f zTkR3!uv;4yeI|`vtO@58n9Qt+NpCZ{MJC-b_C=}kUR#cvK~Z>Tq)zY1pA|$cOhqNN zJIKPM+4nnGV{nr2n7iBP6Is<#qBi@VMoyTOq_8wiD{;W$=aKQk+UKcEqNy@#_PF;H zn$&|K3!0U&I+X^OXh3Y{DP71)6}H z=nos~UFIw+u~>dQYC;co-y2AK;O-=q;m4@gY4_BGeyh`ddmL}r#{Rtx&9lmUWoeTd z&D%4(0Nnxu3e%uNFibvjlryjN)zl`fzy_5EUD^ee=fNV*`T4H#{SMc9Mzm_V?DVnD z5>(OBxU^9fW4w4obDu7sm?NSL>kTQLBQ=O~h@>0GEFLzAL*+*>Duq;}#P#%&wVehM4@lVPk@6Qitc;^TyXCL-LS9&u?4Hk- zUpZ1(=x3YDO`FFwmtYV)RTdm8?!vfPoK$6`uro@wV~8UQO{&)(>;QXVm!fSW*(p?nq67w7IF*7Z zM9Db`DU3^YV}H0EG*^a2+U#-%^{aytegPWNaEI^da2G5*bgPAeTY(Vh&(8;r#r~iK z5wHLsh4V|gfF7?=OfC#+%l^s39kK85>_-q1M$3N{nv7iltiTJ63gOomAjk?-N(_Vv zq}(8;02C^x0t7T2CI<u}1LT*ry9T=Jy@ECVgscG(?IavXLr1B{5i@*g zn7Dvtv1(uv@CH!p7tMeTpgh1G39uL$7hZ9rX0T1@A}{?-oj7*su;9NS`{5WTy|1b> zAvT?2Bc7^MT)jch*r=Xy^rfEiPQZV~ci(IRIVO*yee{$YwiKE-Dp=>N|L*-GDBxSY z7CS_r*rh5p(6Gv7nk4@m!X6c~s;f+=!5WZJqao+YoYb*@`IpujZK*$AYS>yLh=Z*} zb3ht3msl;1r10&ls!cljMDhc!?>GMUWOK~766I!l&DMFWDxmTjpt@>c4Svz(7o4GS5C0k=R%FDTc9die;wY#X92gv4O>DQynzSEF-um1E{M-~ ze(4|-fv;VtK53~S5a9=yWgw5L-8}=p>8)XwhtNEE2PbG5;1?b|!=|CV)S4jkGi(A>G~GozmR`(%s!i z=iQ^8b38uhdGGtI``)$g9~YOi*6f+@uV&Wl*?Yd9{e9D96#fLdMSxZ0YzPmt))BI$ z1A~2x@UV>PX!ryr@BX9iR6Y-d)HDi7QL}GRa}nZoxcX4F;JJFs*5P`)2`0%cJH(>k z+ORvvokT4zq8yyr+iU!tl}+U{w(`66NB2vnm-b7SZ(rr?&56R4eIh7og(+%nU+*Iq zY5~sGR!aL56AHf!gguu)c;fl6ANm-g;PW?2K^9iL+O98ZJqxgk_)nf%*@*Orj*a7Q z?`Ou(kh|p9$*^+b*N;`%wpk%ik1(riSZs2FZ8NelP&GxEaK$~&SzsE#>s@3T!_%tk z!mi!P)Lf;`4;%LHQew7Oz#{_f1}FKfXrxHnQ%D+1fKRCzttMOO!0W^8kHTpWaFZDQ z*IKvn=@SpMnbWIHlv$b&)S?Xw{`a8pYrfL3fYJ>ruA?h^%hTrgR`>?psKIXJjEDL> z1nDjJHrnp;d+g@*+_UEEIgMNFqOo0f!S^|8BM<&v#i9?+z`k$KN@fYVcohE*==%0u z_Sfwmol|!<;}L{AsajH%iHDUK(yDuG zwB}L6!w|zGCKTH$B*V&EOR!A2oHk_-3)xyMEDtNO3N!EyOJfs+)O#eb2c8#aSTAJ` z8Wm|g(#s0U!Kl~h-h?6a@HcXRQQ#K5eEVklV<5u}5#x)sGp+9CTfV=m{u9;QN5cR; zAX9||1E|jr)&GMYC>h%t2^tva>)QTQ2x<;L6~b!HybY^v_!5hu(}prOIY)vXmB8p>QS40r`1|J?lM`@4{s{k@AzEAjJsWQPr{ zz)=94s+Y6rp@GlrfVQ3a#J%y! z`R=8oxU<^p`o)aM^SC*&q?vn`g)Ac8ePsF(%Dc0p?RzrL+w=2l1<^YePO^|*Rt{GY zWBh}tf&2FPS)GeB?+&FJaDA<-Ywpy3tw~D)2oa!{DJ_ z(-%lGCfmM4N+it@PcLh&-7;gu!#OP@edTJ+89 z?mrmBtsU@tB4r5nNdGGFr-QH0hmh-a&qN3arI5Qx^SRZD0<;d9!n^rKbDD)`ksYG# zT+7*;0L^HhQarRWuVmS60#hR#(o0VG+V*lMHln#X@b>=BMRV~X+Tj+jD54={Ya1gc zpGspeaErB9ujOQJm!7X#pCE8S@7Co1TEms2 zDBq=3%taLM?W6-AVfY=fLN(FBhozGv-P>@N1T)s-;xVg>M6(rlzV3Q=!c~dm+Z3Iq z_w>jUH#Hj9mTPfWjFuq@<3zicEOOb~IrUp)``6uj2(yJ}$F6*qA}`{0qe6ZfZ=iLc9NJKP7hXlYCk zUYqO4sj-h?(N%d1n=i|$L4L%_xw~%A=tmT;v>ZDpJj1Ut7rGNNSCVO#nSDJ5Y(fM! z(eeYEgr$K^U>%l;3O9T8ws{WE`RjA;?ki_gR;DTMy~gNfvWl!JBu(SYr!HS^hfgih zq{IYC8Px=zESkE!i)Cr2d?Z+LH@Zi8b!z_xS?4nQ_~61ZA$?7yaypYXF8;}i9DKh@ zt-D{!ih$GWz~3E&)W3BQQ@=V0qW@_JA6jv53;mSOdc|}}*3F$9 zbIc%`z02?>y=Lk7 zsFxSV`^WC9EFu{0b3+uc--s-82x2x3d@BX0kVN_lzJ_Mjp2TI(lCCnB?TQM>0vO`7 z7<+chQG5c?RZHzFS97)AVG<-X9qq;J-SW11KjW~eoKKi$0wbbbv#awo;q>*88lxS6 zAr6y1$-EaM`S?Z6&E^d&;%INe$YwZOh7>6PA_Nx#-@%g(feZwXl8MmCNK%5#`0G4? zJ_J&Ia5|u2$@oTVDYU7!@DoHBaRj6!%jyr7e-aJa=B8mWm=>*}O4IzM0SD2VDovQfDNH(-pz)2VVsKNY0*$bi_2=k}XBJsEHn+~<#Ju@{fLiiNFFJga^O?Sb+T<55xj^0zv5gzu*Dw$QoHo4Cj9(2($l(1OZ?cNs9m7 zF#v?)q%UCsF7fwKT2O;#00!U&gzqyDf6sIZ^%HRXa?MJv80`%$ImhujU?7441A%4~?6yXh z(8%-@6)+G&6C5C^0G$O-a+)8-CJb1Ip<(32;Zd$fSb%}h0cnSqX@(4E-?sx;!iSFF zt_6G2bE@DXz(9C7e`G)75>%@frN>iP~-2M6l&#|G(a;wQ3#Pa``&S6D z_#Hwh0T9A%{Xc{dmOmkczI(C7@!jDp^}KAs;iy#bMdtwAnSV|1Dsk`i=W*&L9?D7J zhI^8l_rWRo^y&e-`}XjE9zvA-#}I(|>xy^1O%z>j!ikrL%zUvw?xX2&oeo~12~0Jke9>TC z$_SE5S#=a9HZ2WrH1XVxCrn{u`|2%~r(vV(1f1{L*dUL`mX5vOW#QF(Qdu~0y#(~HUqY<46}^_7q-P03zep#qZZQf)yy%w$q^0;X6%lx zVJmtupB%GAzI;(BB#$^wi??%cFDhmKNIlaqZFx*QA+=PMzI)=;5EmBUjBPpRy&=sv zJR#cV#duxKg3!x`ukMpw**{#Ef*xS8LZA>5sFY!b9MRFu}aNiOOJ*Lc}-)_F@T9L?lmr#sMqb z*s$jP!&p>T*H;0Xh21UFyZE!gakJeH<&Is~h=H`4ZFyz#;FCDY7$qog8ESo6vj(&m z=+U~qKsdPd5HJ<)QY?`=(wCrJjKMPLw<=t{4>b&b`P`+g^!;$`JT(`bZ8q_d4~#vB zD`OJ3Ll4}y%~oj(_ab~0HszONQTUqfb*(maNi9fNOE&91i#d(p?t_UfWLOwB>#_`x zamJp8XE7E;QoeWNpI)zvPrvC2%viPV&^JXvu2sW4zlZ;>!2$RQan12dXg<55!-G2|vxf8_QkhyIn)Lft|? zdjGcy_3-3|6pd?@h9HA_Sj%5nhJfp+xPPtceB0bvb4lkeb#c`e|IL=o{dLU{_Azh*LEh=k$Jpt8*f~eD{K(PO zeiqKg&7^}G4#dTH>)awvYpKz=eqXrbDwc6l@X;vo3^T&p_fg-5bRcT`s5uvjSdW*L ztrAY)Q6E&lG&BTLYxXH<+4GO+xlZ>ASDj>|`x}M79hA5&!YglX1AZ#;_lj-Ur0k~~ z55l*Qjmj^n=ylex)X*aF@?n%!7e3+))t|f)M=*YOfFhHxd`w|*JGxAcE7iN~DEi)Z zvQ~bwAA8(L%hS%3b1+jtS?l2mdBP+nU5Wc=l@x@S7u<_N@$0k|+}Pi2GZsgrro{VU zUhljZ=h`SaUba=zO!(RuyXuy}AO1lQ$PMdNj%4jyFmp^cjB8rmP-mpYR*7C+i0xzv zw!HA=o5lCdE#u5#GxKMonl2Q4s@m|7y6wys&&KfSufDqg=~3ua{WCx@uv&-BYpquGa3?IOB?{SDcNK84N=-N- z1+VMA&@5nJ!N-~~db()qIx6#rM>v6G#-RrxhB{C0i8~g}Ru^6eh%H*ljNdqdLzOD0 za)u6mv}YmKoX^Q>D3hiHr6yir4A9>?_p~QA(EXK%UaYHmG9h@-II*UAdN zgxl4nqL+%XA0d_!{j2y{@9l62a$33kh{2Wem7|m1m=mBH^$UxTk=xGgw zkC&DR%Gqs(=7XS6ibAHKU@J#TPfMIA2MvSb$1qX}=pw5T*E?2?gb~)aWIlq1p_dLC zMkqFPA21A;_INiFj^Y=BG)kB#6#r%>x!y95-5r_`bsfkRb}-;Ptd@#eXhH_^h>4)tZtRME^1xZDd)ZW3>0kTMnl{4$yRJ z=z!@+eFO7ahi7Hh;Q)SnmrH%w3Y)5~z?+&n*Td@PW3Ae6PxhKBHBpn+V|>NOI!MrH z2#4=a#w!4GKag>nYUD7M78oz4L*T|;3+feJY z6H-ZuqdzX+GU@!Tl64HJHI|^$UUeQ7{&meH$BfgnE>4>-%20LNG^62Da8E*d9W{XoNoP+Gs@3#ApUnnY17L zdne^y>x1!EZ@j6tQX)9^cZ&$r$r%iFDF^t8@S9T73XKv(EhK)%%< zU1h5h{_LuP>X)u0>$(29EBMh2TwVmM6NyQ-E2ihUe`MHCxBq1>W*Y!=F=WmQ;vK7^ zznF_pu0PF1$L_D@g8Jbf%*C2lT)iqS;a=+iE6pR7JHLgm0lW+uSpfloanpM`)(U%Xbkh&wRx!gSSpMLfw*!&ND^}sNJT-T*n+~Jg>G|K+h zpNa&Vobb<{rpG`%neBjjdQI?)A_<%PsYpyeL;RvhJ~aP>B0)tqShm)uN7`#etn<{t zdqw}pJ7WIi`#Yj-b^D5Vfz*;7IM*-1Ipnln^sT$1e-ll=W>`6iyE^O+%vmyz*_%5D zNQ6w50}`!vxiQKcPrD+Q&-BSBRruE359Awk#!rONF@!qR#-z+-8*b@$XO5F{8^6jf z(@jN1m-)w33PTLLJ{8Tss+`t8UUvTa#&oNeO+lid2VQCBl&2+}-ilK-bA6B~5X#C& z=2v473K#<+)gQ*d81pP39Ea<=AqhSWm_qf27#>1?I8kC#4%4+J*Rx&NdjynpZiL>Ha_pggk0eF3LiB z*e_@y&hpv9iEF#S?fYaQkD7dLpEk7&%yQ!u+VQKS+j$cq}FZNSqSMUaF*|!!Rvrc8m2!Y8Np^+@R0)$b zph~=3=Z-v(o+M>Um(l~{1a5Mbp{d|ikZLP$Um(Dn%3sp9G>D+if+U)Qn=okZ(EXjv zio^+|3$n=>P>7axvA3R13Yxb*4Lr6k-s8N21MGAXsnX}K@Kks|mfbY?)kG!1nBCv> zJb4vW6JXg8PlMd$@#dzH;59x&DL2MT_Ts)41A@u3zK>T#g?79TeTQe6tu!NpBP{ju zu#AWasszl<{NC`6~cQdn8f3Y@eT$-7vL2>hRiiC&2Kg7 zo^XxDbzoK$FGulQIA_%Zi8ZWu(<>otV?8*aGHUVMs<_1#1OBfa0qk1sQApbAvV z6N#p|A{7ITkrSmb8#H8%_B7%R=dV@@?c>#*Djcc`Otwgh94$K+y{IXOPj942z&#$p zi6w-N>tic)77KIm7XZn>DDnqY{1E1@vk}aafN$`|=O)*{OUueL$l>K2w^`g>=u6Km9*gU${N&A`KS-}-k zK7bkCcdZp^qIx6LMH&4o6u7l(Y9CuzDk&lXzSe?cbGl<%Zhz+tPu&2{AiOLEaE4`< z)Nzx4KnAypLmEZVkMHl|bZ~o2TH7gsEaw8>psgZRo@1+pUbRLNDp+gkkzC34oiZz( zCB+i1P zJ8Ow?RT!{=W`ITKR3_E0v`9(#c1QKUUT&gT>xC^cqD)e)gx zx4cgkK1v_wrBu6fj^5%&Ut)Na58&&;!&!*M|8oYTz9k_zN}22=6F; z+?n)@C@K>$4W5!9)8K~)G7Vu_znF$nqhC!!06Ab9%8bA;bwH+}AqZp|e4hawtsec_ zQAE%$9X&$f9svB4K{njMu{oQG#W&Cg&{x_VBfN5aG zYUf-t()Hl?0WCz!0I(3BDlueROT#Acc8_$Ds4j9m?JgmFguMU@Vh#nckcf#F8wARm z2?FJ<(AxS$q8%FVL#MK(z}i{MiL?#jqq0MpyhRn(0)@%qGbwD)-3xs7N=o%atlo(1 zkurUJ&rM%1jfMs-+b}_-HdEE7bJ;c$plDM;@!~~O*xgb`M~xhp;nWUo;3)$n5+d2~ zg_+^nBUfQltA;DDGO*y6X`>h~*nuQAXkSVBo+S_yU}rA3h8BM6VQveZ)2Cx@h1apx znvl~Cck9aj{0J$>8wV2LKXC+R4f^A2e%)%p6KgaeM+gHkYzz;@Bb(>n@mA&&d>jFg z7EbOfr1)hGwgWZj%bGk#p@igWRVK_~Yp4GwRAqyuN^2fb`|qUUToGUbI+g&bu&GqO zY`G}gW)>6&>5N{G&foxah6JE9GJBViH*u1B0iBVMNPf6$UFV{#-P!Rvn#l1@WA6{X zAVdTr6{jOc5|ZEHpp_x8a|3P^!YIUl5eK526PK3bAwNgu6+6&gC*mSmv|8$rI~I?ARdSCAgbSwu3nIsN^c%G1W;v*BhlHP z?>Z11#vkk`HHWpfP=g~QFulclr%D>CJy0?2URRwX52SX=M7u2J7xK- zvHr`-Ji6Z%%?Y35Q&TmA>z9aWr)LK4g3_N<=k;fh43Ms6D?d}H1WQcF_(2q5P2*nl z`cfEy<(h`Q@?8Zo-n~~}gs&rYN8~0>Xxer}f-M1=p101H*jYHkYb67j;Hl6aqTox` zP1Zg1L!mnGO_Pb$n)dO_=2gN@>1( z>(i$}G~IN&R3AeW>x$vQI|VM8A;+S2Qw2DHSB{?p#5Szoj7^);J6VaM42!&a+WT%N zzGsO|2M@voHWvfJ0DCLuG9zGr>hTHG?$8-4n!;ZM0K_)NzQSJvY{T(Q5g-dvi5MU= z(J?=G0B=*`RPn3U^Yr&Qkl;lMI4j8W#oIZYO3r|;*u#gkjb4Ti!64}7Z=!^4bi&7_ z`#Y|fGq!sS;tCxa0It|Xxu$y>l{=;J5;$mZ04K|5tj5;hBZjR75-@R44j`_lpMlKA z9yX*pZ=oV_o8?)HgUnML?~z$?BrpeX>TB!+x~JYWLmDl?vXaAne2Tzm`{0nk?XHBk z%&-9sGEE1pf=kR zwc+Yx_EBaGBEAyWof%5K*qypVG{+Q}bc5bE)UKu$q{=kd1f5GsTSAMnXG0YKP68&u zk81xS0bW}b$m#WCfq#;Ks6DhY()!mYy>tM6u$(G$CQfCPH2FyaNbt2Hq&aP%{iATp&1(QDX#P5Ld(XOE7*-IvMra6UT{f=-`+}=%9 z06#S92p@Wai8>bYpv*i1H&FK1D-Cj-yg)*x?4c;)L3t!MtQ#Q>2nlZH0yz>MwX|hM zIp?R>d!Ac#FB&yZ6_J_SS=u$Su7zpx?!#R2-2wc7Z@>2hHrM55=203CindQyk6^F} zp`Kc>sg*9#{s)`{pC?IvAgWQOl7_cEjfNDPFoQ5+NdMZQO6C-x8o9W|WC!^(h;Q>) zz19i_0sH`>8vI~UE+d+-``#d`!4YWC{#Mz?yMxjELhLoLECIRa{JETL)bh`G)Y8Fi zhWNEMJ(7@ytpn)0+b!lY+@B=VHP1xLgT|iJYf<~CzGe#O&ZCaOI z5Fu;wZ&xs1VCVY^YBSB5G!E+9UhdzlIp$vxmLnTnJ^xS)J>+4_qCNmS|D~mllwB%` zdp+u7Z~}&|=u91X!rTm_-CKp|i`7CNo|b7vZR=HAI8IwXbUH6dNh|h_ZR^Q0MMe+2 z*D_3CsEI!8FP+d6*uMNTV|@gr!G*PJXFohegd z_(f^>w9f1CSgfo5>oauLLXKZg=34lt^kgWk9!=sVjmR-96-~Dk5xjeBOEuA8RI+uB4Kwx{$E|^c&?i=-=SZWhJatn=PgH3^ zqC*uVI;wt%jyf_xK(Lo|j1@+|TuQB06{t~-UcM~$buEaxU#YvlEW~1T<%(TJjmM4k zB#Uuv^feG0DZE-Vr6hov44?&$r__p_xZe(1!*!EL4q6{CvQ7G!Zuw9jnGLm+)ERT0 z!%C?EiJ^!zWA?732^1N=iekOM<+h?f%N!}wOv@Zi6$nnOkItU2+Ej{QHyV@_rwkP% zy)KH%n^DzZ&Y&`lstNU9qA4~w61G|~!rFKm0%@5l!l=9=4~Hk4Nb!Qin>HOu3JX1q zMD)Cg3OP~PVBLUES$rpU8_Q7SwC4L!WRE~!wDyQny)w9rcd3|T`@7g2egZt~z1xBh zq>i@SU%aRF&_qv(%e}55zjj~}pYe~X5(+rTbe(e8KI?f{Lf-S)B`IZA>cDoHMxIzT z&%s{+bC$Y!?7Q5?vC#hFD)(_vzx+};i6bOh%t#*m5+mmb+;X|Tk@qE|w8i504Cr2-lVS0*N_X~ zgTYy8@jfPAUM7^!u&~bWLe}egu-}xAzxcZkxMxfFGMA!T;t?0EgKv*t^DcVX>%znR zn+`~>YS+BOOH<{sMur*hcy!4uPu=!xDODBqIV{{baFQbx4{#o-@ev)guUJ#4{EY~C`6$~XQ9}FxVJqZP@ zTv5l54=6yDa^SRI5dP7m5-BGw9wOI(et51^sI{K;gj;~Ivd}dbq)YNax+E8*OQg-q zlySsvp%`XQ%4rUE(q_056FT^nlkp)|?EhgKOw1bJ-KNmdGRF zaU=#Zuk~i|4Z0ZWTW^(aYl%^_v>E<-J70WYK_`fS1r@kwkuP|QiIb}cFppnf!h&JV zWuEO|U8v|@-~xdHEO9^P$Lc^h*%GhNZ7=7=%ABb z?RHH+%5W){XSG^sU%;dZuB_|bh0ht0|J4YIAnf?Fum>9UFil*p0ZF!Dc`OE7_=tEb zJkQfT3*q8Joan5nHmDc=q4c`TrHT1M?PBjlQE^ho#Wp?FBHI?YGcOlCai)>~zk~RH z%R#u?yn*pln7_(N$HPZb*WIMmvxF=_LPn{rBh@3@*$Fzemz6L_=N+G;z)uR&*iq%w zsr8OB!Yih$u_5%Zjl;*mTokEF68Dum#5D+7JH#~!Dp6lWP`8sUImR4+VS+J^Fe0vQ*fD65xvV>9sf?3Eer!wPg%Hd^GjfzoU1PklB5}`nvaSF;ceV z0h3JAQt$y3en$lC|CDW_2rpgg*{-z)wV@Wu`ZiX5M;_+KpeRoHmZNo59s(Av$F8+p z59sa#6nD;=(;G&Mw%i4Em9idq*h*3CYeBod?Vx+0>w9*&ZQC`5>*j>YE${p1>ftoI z?#E)`st*N|54RVUAVkq?_6MTi0{GvQvsjbPO!j2LXKg@XrL;(KcE1R`KO~>D1_Xx# z4M=bVXH7ip+yUVYpm1Eq+2e--+0S}w9tRn2C$7Srvpq-85jcWCP^ z#}`&R-NV{1DwrUA!Zv}i3HFpG7r9=GS4 zmMVR$ZOVD$okqMoxG&O32*s*CnV$sdOt0$Q5;T=3>})xHaAO&+fl3%pgJU zd*LU2?vfykol#|Tb!BFdQPoqMWWdNcv(q8*ENRd-yywk8^-M>_XvEd0he&)vIMcMl z_yQ!~)2DRKG!mQqIt(M^tB*qrSo&+l`R1~%bf3MDC#kO#f0 zT;s-(zspmK&DlZ{TTp;?3}SjFJCz!x(cduNWs{|2rGYT*Vu_wWL&!oGo6p0B3cNcOgG~dm^(;ez0jIls&-W`|JP-I{sVIuyBwj{V8z}RJ=?#HK`U;Jm z`q#y|htDkcLrK(ft<{_O$(n)I7MHi5A~8Q2*F*8>lntZ@H_@%_Qb zd3J-3*x8Bt1Y(hBsF(s9%*kB+4ZKW3F`f}R3bZh+*^KZ|kyyl%<@_V~FX`sv(_qR1 zspGII8)vPa*@5em+O3$D_~F)YoX*V5rJD5}O!hQl>e*Ja6*H@0z3aSJf|X;;!>8W3<=5flhiNf-qNkn!k;!Xsw3FiN!*}2 zP~{@!Crt141-2cZ?ztE3JnH$7m+$}h=HMf%J}-BRc^*k5tT&Y0`IA>PO~*7+ow4SV zFAK(?+Azr4IIBk}mGJ^5)QiB_HhjLm3a9MIJ3T^*p*$=7Of#&l3){bD5`;1w%neDK zYrxq5ng;c`FC_syF$s1_#LJpN4VG3~6yV zb@8#jY~KnBM0HV%%jP90>*7n_2%q<;e&hS4X;RL9v-Iu}$Aeo*Le|?daWox@J=(ks ze+j|(*=&6oiA^Zh;zUc{H|nHT>cJ`yIbWZtAAIc1Odp}Vq5t58!7lKUOKZO2h+K&O z{^Z(xADvqLWnILyW6jYh)>$Qa?{Q&Gw2Pq=M?g9_m~{|jn<<7W`U)&`jpsl#8K$Zn zv>4}|3b{CEGaFZFhQR_vW$C73qc_^332kYMGW%hEgOAHj zgb)NfGNNR?g_Y%fId?uqd($<7zqzcYOWW1Cc+kXO1l! zzEGPQ&p2*!s&^9i8sEpi19oKhf%{!kS%5HRsoM7JbsS)S2ZMpBrskr{xS9D@=@8<*x*!O5_9~lo)UhMQC+Y`Q_}F@4%}^pycxHnwILg zpV|?Z1+FnRRTje&VWfwXl%hu_Nw!I(bOlq>(VIVKr@rOiBbkuNpm54~f-nSmjAhJ} zGKJAhEzppaflV*7WE^Y6azT|^>8>yi|(P+oB(xZ{WGLJiYqTAU7UvkYLi>U^&GaORPK-3k%YlN2i^Ms$ zCWk-2?reA9_`FOz#g)p`xp>_Y0`BB=B~)A87o*Y{!gq4=b)#DToiWGW#={fVA&J}7 z>c{$fZ^V`4K8t&nphBJ=#Mb&ZKc_B2pKifVNr5a*TP5K!y4pHzaIKeO$#G6gtywq@ zIltycaaW@;*VB`PrsMvm99r6$X0#vmmVbFl^FrTmJ7(;BrRRzX8Ly13ed2hzK+tYg z&K+5rkH}YOaRbdssp?rJL(Tx5UjOW1X3TzW8f9`l9oBjRSQ>cx&NYL70R{G)YC~-xw4XS57aBo z>D3iiQf4@kpfF*5F5(J=by0f*a|VZ#RLDsyB{>CtDEhkBdW&teMX2T!I=jrm_&PQq%>AiHn?UFnR4NDZbX4QQ0s~`6 z3FX$iL;ZT~vqO@4saGy zmcVn?YUN#eg&hlbR5L)v>$8>Bz&=ri|3-PGfOEY-a<{a3;d7rAbQ`oKX?PT(KLiu$ zdW|++!P;+d*6cGd^B`Ie@~PlJxp+{8X;|R@Q?ULe9`sS5h+qbA7buGQ{SUbN^G{6x zC?^P1^wyGpZ>4Xe0V+)Qdjk|=wBW12(%UsKgZYCD|5E7s_we6q+Wr+T0MyFuXgGkezx=L5sS1K6!7|jfgu6^M1VJ}oG0ks{{lY97tR0x literal 0 HcmV?d00001 diff --git a/v-0.04/documentation/pavucontrol/pavucontrol sink update flow.txt b/v-0.04/documentation/pavucontrol/pavucontrol sink update flow.txt new file mode 100644 index 0000000..9428de8 --- /dev/null +++ b/v-0.04/documentation/pavucontrol/pavucontrol sink update flow.txt @@ -0,0 +1,41 @@ ++----------------+ +| pavucontrol | +| (initial file)| ++----------------+ + | + | Callback function triggered when there's info/change related to a sink + V ++----------------+ +| sink_cb | +| (pavucontrol.cc)| ++----------------+ + | + | - If error, show error and return + | - If end-of-list (eol) is reached, decrease outstanding tasks count and return + | - Update GUI representation of a sink using w->updateSink() + V ++---------------------------+ +| MainWindow::updateSink | +| (mainwindow.cc & .h) | ++---------------------------+ + | + | - Retrieve or create SinkWidget for the sink + | - Update SinkWidget properties (e.g., volume, mute state, active port, etc.) + | - Prepare context menu for the sink + | - Ensure the sink is displayed correctly via updateDeviceVisibility + V ++-------------------------------------+ +| MainWindow::updateDeviceVisibility | +| (mainwindow.cc & .h) | ++-------------------------------------+ + | + | - If idle source/callback is already queued, return + | - Schedule the idle_cb function to be called when the app is idle + V ++----------------+ +| idle_cb | +| (mainwindow.cc)| ++----------------+ + | + V + ... (Specific steps and logic for updating device visibility) diff --git a/v-0.04/documentation/pulseaudio/introspect.c summary b/v-0.04/documentation/pulseaudio/introspect.c summary new file mode 100644 index 0000000..d9616f2 --- /dev/null +++ b/v-0.04/documentation/pulseaudio/introspect.c summary @@ -0,0 +1,79 @@ +* !pa_tagstruct_eof (context_string_callback): this function seems to be a callback function for processing string responses from the server. It examines the incoming command and checks for errors. If there's an error or if the command isn't a reply, it sets the success flag to 0 and prepares an empty response string. If the command is a reply, it extracts the response string from the tag structure. If there's any issue with extracting the string or if there's unexpected data in the tag structure, it flags a protocol error. + +* pa_context_stat: this function sends a simple command to request statistics. It leverages another function pa_context_send_simple_command and provides the context_stat_callback as the callback function to handle the response. It's used to retrieve statistical information. + +* pa_context_get_server_info: similar to the previous function, this function sends a command to get server information. It again uses pa_context_send_simple_command, but this time with a different callback, context_get_server_info_callback, to process the server information response. + +* context_get_sink_info_callback: this function is a callback that processes information about a sink. It first ensures that the operation and context are valid. If the received command is not a reply, it handles the error. If it is a reply, it starts parsing the sink information from the tag structure, extracting details like the sink's name, description, sample specification, channel map, owner module, volume, mute status, monitor source, latency, and more. The function seems to account for different versions of the context and extracts varying levels of information based on that. + +* pa_tagstruct_getu32: this function seems to be a snippet or part of another function and is possibly not a standalone function. It attempts to retrieve a 32-bit unsigned integer from a tag structure. If unsuccessful, it returns an error indicating a protocol issue. + +* pa_context_get_sink_info_list: this function sends a command to retrieve a list of sink information. It utilizes the pa_context_send_simple_command function and provides the context_get_sink_info_callback as the callback to process the list of sinks. + +* pa_context_get_sink_info_by_index: this function requests information about a specific sink identified by its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SINK_INFO) with the specified sink index and sends it to the server. The response from the server is expected to be handled by the context_get_sink_info_callback. + +* pa_context_get_sink_info_by_name: similar to the previous function, this one requests information about a sink, but it identifies the sink by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SINK_INFO) with the specified sink name to the server. The server's response will be processed by the context_get_sink_info_callback. + +* pa_context_set_sink_port_by_index: this function is designed to set the port for a specific sink identified by its index. After some validity checks, it builds a command (PA_COMMAND_SET_SINK_PORT) with the given sink index and port information, then sends this command to the server. The acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_sink_port_by_name: this function sets the port of a sink based on its name. It first performs some validation checks, then constructs a command with the sink's name and desired port. This command is sent to the PulseAudio server, and the response will be handled by a generic acknowledgment callback. + +* context_get_source_info_callback: this callback function processes information about a source. It starts by performing some initializations and checks. If the received command is a reply, it begins parsing the source information from the tag structure. This includes extracting details like the source's name, description, sample specification, volume, mute status, latency, and more. It appears to accommodate different versions of the context, extracting varying levels of information based on that. + +* pa_context_get_source_info_list: this function sends a command to retrieve a list of source information. It employs the pa_context_send_simple_command function, providing the context_get_source_info_callback as the callback to process the list of sources. + +* pa_context_get_source_info_by_index: this function retrieves information about a specific audio source based on its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source index and sends it to the server. The response from the server is expected to be handled by the context_get_source_info_callback. + +* pa_context_get_source_info_by_name: similar to the previous function, this one retrieves information about a source but identifies the source by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source name to the server. The server's response is again expected to be processed by the context_get_source_info_callback. + +* pa_context_set_source_port_by_index: this function sets the port of a specific source based on its index. After performing some validity checks and ensuring that the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source index. This command is sent to the server, and the acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_source_port_by_name: this function is designed to set the port of a specific audio source based on its name. It constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source name and sends this command to the PulseAudio server. The server's response will be handled by a generic acknowledgment callback. + +* context_get_client_info_callback: This callback function processes client-related information. It first performs checks to ensure the received command is a reply. If it is, the function begins parsing the client information, extracting details like client index, name, owner module, and driver. The function appears to be prepared to handle multiple client records in the same response and will loop through them until the end of the tag structure. + +* pa_context_get_client_info: this function requests information about a specific client based on its index. It constructs and sends a command (PA_COMMAND_GET_CLIENT_INFO) with the specified client index to the server. The server's response is expected to be processed by the context_get_client_info_callback. + +* pa_context_get_client_info_list: this function requests a list of client information from the PulseAudio server. It utilizes the pa_context_send_simple_command function and specifies the PA_COMMAND_GET_CLIENT_INFO_LIST command. The response from the server is expected to be handled by the context_get_client_info_callback. + + +* card_info_free: this is a utility function designed to free the memory associated with a pa_card_info structure. It releases memory for various properties and profiles associated with the card, such as its property list (proplist), profiles (profiles), and extended profile information (profiles2). + +* fill_card_port_info: this function populates the port information for a given card. It starts by extracting the number of ports (n_ports) for the card from a tag structure. If the card has ports, it then proceeds to fill in details about each port. If there's a protocol error while fetching the details, it returns an error. + +* fill_card_profile_info: this function is responsible for populating the profile information of a given card. It begins by allocating memory for the profiles and then proceeds to iterate through each profile, extracting details like name, description, number of sinks, number of sources, and priority. It also accounts for different versions of the context, fetching additional details if the version is >= 29. + + +* context_get_card_info_callback: this callback function processes card-related information. It starts by performing initialization checks and then examines the received command. If the command is a reply, the function starts parsing card details like index, name, owner module, driver, and the number of profiles. It then calls the fill_card_profile_info function to populate the profiles for the card. If there are any protocol errors during this process, the function handles them accordingly. + + +* pa_tagstruct_get_proplist: This function seems to be a snippet or a partial representation of a larger function. Its purpose appears to be to extract a property list (proplist) from a tag structure. If there's any issue during this extraction, it flags an error. + + +* pa_context_get_card_info_by_index: this function requests information about a specific card based on its index. After performing several validity checks, it constructs a command (PA_COMMAND_GET_CARD_INFO) with the specified card index and sends it to the server. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_by_name: similar to the previous function, this one requests information about a card, but it identifies the card by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_CARD_INFO) with the specified card name to the server. Again, the server's response is expected to be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_list: this function requests a list of all card information from the PulseAudio server. It employs the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_CARD_INFO_LIST command. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_set_card_profile_by_index: this function sets the profile of a specific card based on its index. After checking the validity of the context and ensuring the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the specified card index and desired profile. This command is sent to the server, and the response is handled by a generic acknowledgment callback. + +* pa_context_set_card_profile_by_name: this function sets the profile of a card identified by its name. Like the previous function, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the card name and desired profile, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_module_info_callback: this callback function processes module-related information. It checks if the received command is a reply and, if so, starts parsing the module details. This includes extracting details like the module's index, name, argument, and usage count. If there's an error or unexpected end of file in the tag structure, it flags a protocol error. + +* pa_context_get_module_info: this function retrieves information about a specific module based on its index. After conducting various validity checks, it constructs a command (PA_COMMAND_GET_MODULE_INFO) with the specified module index and sends it to the server. The response from the server will be processed by the context_get_module_info_callback. + +* pa_context_get_module_info_list: this function requests a list of all module information from the PulseAudio server. It uses the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_MODULE_INFO_LIST command. The server's response will be processed by the context_get_module_info_callback. + +* context_get_sink_input_info_callback: this callback function processes information related to sink inputs. It checks if the received command is a reply and, if so, starts parsing the sink input details. This includes extracting details like the sink input's index, name, owner module, client, sink, sample specification, channel map, volume, buffer usec, sink usec, resample method, driver, and more. It also accounts for different versions of the context, extracting varying levels of information based on that. + +* pa_context_set_source_output_volume: this function sets the volume of a specific source output based on its index. It starts by performing various checks, including verifying the validity of the provided volume. It then constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_VOLUME) with the specified source output index and volume and sends it to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_set_source_output_mute: this function mutes or unmutes a specific source output based on its index. It constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_MUTE) with the desired mute status and the source output index, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_sample_info_callback: this callback function processes sample-related information. It checks if the received command is a reply and, if so, begins parsing the sample details, extracting attributes like the sample's index, name, volume, mute status, proplist, and more. The function also handles possible protocol errors and is prepared to process multiple sample records in the same response. + +* pa_context_suspend_source_by_index: this function suspends or resumes a specific source based on its index. It verifies the server version, constructs a command (PA_COMMAND_SUSPEND_SOURCE) with the desired suspend status and source index, and then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_send_message_to_object: this function sends a message to a specific object within the PulseAudio server. After checking the server version and other conditions, it constructs a command (PA_COMMAND_SEND_OBJECT_MESSAGE) with the object's path, the message, and any additional parameters. The server's response will be processed by a callback function. diff --git a/v-0.04/documentation/pulseaudio/mainloop code flow.txt b/v-0.04/documentation/pulseaudio/mainloop code flow.txt new file mode 100644 index 0000000..f4c8b96 --- /dev/null +++ b/v-0.04/documentation/pulseaudio/mainloop code flow.txt @@ -0,0 +1,17 @@ ++---------------------------------------------+ +| Mainloop | +| | +| +--------------+ +-------------------+ | +| | I/O Events | | Timers | | +| +--------------+ +-------------------+ | +| | +| +--------------+ +-------------------+ | +| | Signals | | Deferred Callbacks| | +| +--------------+ +-------------------+ | +| | +| +---------------------+ | +| | Other Asynchronous | | +| | Tasks | | +| +---------------------+ | +| | ++---------------------------------------------+ diff --git a/v-0.04/easypulse_core.c b/v-0.04/easypulse_core.c new file mode 100644 index 0000000..718aff0 --- /dev/null +++ b/v-0.04/easypulse_core.c @@ -0,0 +1,843 @@ +/** + * @file easypulse_core.c + * @brief Implementation of the easypulse core functions. + * + * This file provides the core functionality to interact with PulseAudio, + * allowing operations like setting the default device and adjusting volume. + */ + +#include "easypulse_core.h" +#include +#include +#include +#include +#include +#include +#include + +//Variables shared for count_profile function and its callback. +typedef struct { + pulseaudio_manager *manager; + pulseaudio_device *device; + uint32_t profile_count; +} _shared_vars_1; + +static _shared_vars_1 shared_vars_1; + +/** + * @brief Callback function to check the state of the PulseAudio context. + * @param c The PulseAudio context. + * @param userdata User-provided data (expected to be a pointer to an int indicating readiness). + */ +static void context_state_cb(pa_context *c, void *userdata) { + pa_context_state_t state; + pulseaudio_manager *manager = (pulseaudio_manager *) userdata; + int *pa_ready = &(manager->pa_ready); + pa_threaded_mainloop *m = manager->mainloop; + + state = pa_context_get_state(c); + switch (state) { + // There are other states you can handle, but these are the important ones + case PA_CONTEXT_CONNECTING: + case PA_CONTEXT_AUTHORIZING: + case PA_CONTEXT_SETTING_NAME: + default: + break; + case PA_CONTEXT_READY: + *pa_ready = 1; + pa_threaded_mainloop_signal(m, 0); + break; + case PA_CONTEXT_FAILED: + case PA_CONTEXT_TERMINATED: + *pa_ready = 2; + pa_threaded_mainloop_signal(m, 0); + break; + } +} + + +/** + * @brief Initializes the pulseaudio_manager. + * + * @param self Pointer to the pulseaudio_manager instance. + * @return Boolean indicating success or failure. + */ +bool initialize(pulseaudio_manager *self) { + // 1. Create the threaded mainloop + self->mainloop = pa_threaded_mainloop_new(); + if (!self->mainloop) { + return false; + } + + // Get the mainloop API + pa_mainloop_api *mlapi = pa_threaded_mainloop_get_api(self->mainloop); + + // Create the context + self->context = pa_context_new(mlapi, "PulseAudio Manager"); + if (!self->context) { + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // Set the state callback + pa_context_set_state_callback(self->context, context_state_cb, self); + + // Lock the mainloop and connect the context + pa_threaded_mainloop_lock(self->mainloop); + + if (pa_context_connect(self->context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) { + pa_threaded_mainloop_unlock(self->mainloop); + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // 2. Start the threaded mainloop + pa_threaded_mainloop_start(self->mainloop); + + // 4. Wait for the context to be ready + while (self->pa_ready == 0) { + pa_threaded_mainloop_wait(self->mainloop); + } + + pa_threaded_mainloop_unlock(self->mainloop); + + if (self->pa_ready == 2) { + return false; + } + + return true; +} + + +/** + * @brief Cleans up the pulseaudio_manager. + * + * @param self Pointer to the pulseaudio_manager instance. + * @return Boolean indicating success or failure. + */ +static bool cleanup(pulseaudio_manager *self) { + // Lock the mainloop before making changes to the context + pa_threaded_mainloop_lock(self->mainloop); + + // Disconnect the context + pa_context_disconnect(self->context); + + // Unlock the mainloop before stopping it + pa_threaded_mainloop_unlock(self->mainloop); + + // Stop the threaded mainloop + pa_threaded_mainloop_stop(self->mainloop); + + // Unreference the context + pa_context_unref(self->context); + + // Free the threaded mainloop + pa_threaded_mainloop_free(self->mainloop); + + return true; +} + + +/** + * @brief Nested callback to load sound card profiles for a device. + * + * This function is triggered after invoking pa_context_get_card_info_by_index() + * to fetch details about a specific card. It is responsible for allocating memory + * for the profiles associated with the card and populating them with the relevant details. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the pa_card_info structure containing details about the card. + * @param eol Indicates the end of the list. If eol > 0, the list has ended or no more data is available. + * @param userdata User-provided data, expected to be a pointer to the profiles field of a pulseaudio_device structure. + */ +static void load_devices_cb_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + + // Cast userdata to a double pointer to pulseaudio_profile + pulseaudio_profile **profiles_ptr = (pulseaudio_profile **) userdata; + + // If eol > 0, the list has ended or no more data is available + if (eol > 0) { + return; + } + + // Allocate memory for device profiles based on the number of profiles available for the card + *profiles_ptr = malloc(i->n_profiles * sizeof(pulseaudio_profile)); + if (!*profiles_ptr) { + fprintf(stderr, "[ERROR]: Failed to allocate memory for profiles.\n"); + return; + } + + // Populate the allocated memory with the profile details + for (uint32_t j = 0; j < i->n_profiles; j++) { + (*profiles_ptr)[j].name = strdup(i->profiles[j].name); + (*profiles_ptr)[j].description = strdup(i->profiles[j].description); + } +} + +/** + * @brief Callback function for retrieving device information. + * @param c The PulseAudio context. + * @param i The device information. + * @param eol End of list flag. + * @param userdata User-provided data (expected to be a pointer to pulseaudio_manager). + */ +static void load_devices_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + (void) userdata; +#if 0 + //Variable to check if devices need to be reloaded. + static bool reload_devices = false; + pulseaudio_manager *manager = (pulseaudio_manager *)userdata; + pulseaudio_device *devices = NULL; + pulseaudio_profile *profiles = NULL; + + if(manager->devices) { + devices = manager->devices; + if(manager->devices->profiles) profiles = manager->devices->profiles; + } + + if(reload_devices == true) { + for(uint32_t i = 0; i < manager->device_count; ++i) { + for(uint32_t j = 0 j > profiles-> + } + } + + manager->devices = (pulseaudio_device *)malloc(manager->device_count * sizeof(pulseaudio_device)); + + if (!manager->devices) { + free(manager); + return NULL; + } +#endif + +#if 0 + //TODO: rewrite this so that this is called every time load_devices has been called again. + //We need to detect that. + //size_t newSize = (manager->device_count) * sizeof(pulseaudio_device); + //pulseaudio_device *new_devices = realloc(manager->devices, newSize); + + /*if (!new_devices) { + fprintf(stderr, "[ERROR]: Failed to resize the devices array.\n"); + free(manager->devices); // Free old memory + manager->devices = NULL; + manager->device_count = 0; // Reset device_count to prevent out-of-bounds access + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + manager->devices = new_devices; */ + + if (eol < 0) { + if (pa_context_errno(c) != PA_ERR_NOENTITY) + fprintf(stderr, "Sink callback failure\\n"); + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + + if (eol > 0) { + manager->devices_loaded = 1; + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + + // Store the device's information + pulseaudio_device device; + device.index = i->index; + device.code = strdup(i->name); + device.description = strdup(i->description); + device.volume = i->volume; + device.channel_map = i->channel_map; + device.mute = i->mute; + + //Pulseaudio operation to fetch card profiles. + //pa_operation *profile_op = pa_context_get_card_info_by_index(manager->context,device.index,load_devices_cb_cb,&i->profiles); + //iterate(manager, profile_op); + + // Add the device to the manager's list + manager->devices[manager->device_count++] = device; + + pa_threaded_mainloop_signal(manager->mainloop, 0); + #endif +} + +/** + * @brief Load available sound cards (devices). + * @param self The pulseaudio_manager instance. + * @return true on success, false otherwise. + */ +bool load_devices(pulseaudio_manager *self) { + pa_operation *data_op; + + data_op = pa_context_get_sink_info_list(self->context, load_devices_cb, self); + iterate(self, data_op); + + #if 0 + pa_threaded_mainloop_lock(self->mainloop); + data_op = pa_context_get_sink_info_list(self->context, load_devices_cb, self); + pa_threaded_mainloop_wait(self->mainloop); + + // Once all devices are loaded, loads the active device. + // get_active_device(self); + + pa_threaded_mainloop_unlock(self->mainloop); + pa_operation_unref(data_op); + #endif + return true; +} + + +/** + * @brief Callback function handling the completion of the "unmute" operation. + * + * @param c The PulseAudio context. + * @param success A flag indicating the success or failure of the operation. + * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. + */ +static void operation_complete_unmute_cb(pa_context *c, int success, void *userdata) { + (void)c; // Suppress unused parameter warning + + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + manager->operations_pending--; + + if (!success) { + fprintf(stderr, "Failed to unmute the device input.\n"); + } + + // Signal the mainloop to resume any waiting threads. + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + +/** + * @brief Callback function handling the completion of the "move" operation. + * + * @param c The PulseAudio context. + * @param success A flag indicating the success or failure of the operation. + * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. + */ +static void operation_complete_move_cb(pa_context *c, int success, void *userdata) { + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + + if (success) { + pa_operation* unmute_op = pa_context_set_sink_input_mute(c, manager->current_device_index, 0, operation_complete_unmute_cb, manager); + pa_operation_unref(unmute_op); + } else { + // Handle error... + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + +/** + * @brief Callback function handling the completion of the "mute" operation. + * + * @param c The PulseAudio context. + * @param success A flag indicating the success or failure of the operation. + * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. + */ +static void operation_complete_mute_cb(pa_context *c, int success, void *userdata) { + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + uint32_t target_device_index = manager->current_device_index; + + if (success) { + pa_operation* move_op = pa_context_move_sink_input_by_index(c, manager->current_device_index, target_device_index, operation_complete_move_cb, manager); + pa_operation_unref(move_op); + } else { + // Handle error... + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + +/** + * @brief Callback function to handle each device input. + * @param c The PulseAudio context. + * @param i The device input information. + * @param eol End of list flag. + * @param userdata User-provided data (expected to be a pointer to the target device index). + */ +static void switch_device_cb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata) { + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + + if (!eol && i) { + // Move this device input to the desired device + pa_operation* move_op = pa_context_move_sink_input_by_index(c, i->index, manager->devices[manager->current_device_index].index, NULL, NULL); + pa_operation_unref(move_op); + } + + if (eol) { + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + +/** + * @brief Switches the device (audio source) for the pulseaudio_manager. + * + * @param self Pointer to the pulseaudio_manager instance. + * @param device_index Index of the device to switch to. + * @return Boolean indicating success or failure. + */ +bool switch_device(pulseaudio_manager *self, uint32_t device_index) { + // Ensure the context is valid + if (!self || !self->context) { + return false; + } + + // Check if device_index is out of bounds + if (device_index >= self->device_count) { + fprintf(stderr, "[ERROR]: device_index out of bounds.\n"); + return false; + } + + self->current_device_index = device_index; + + // Set the desired device as the default device + /*fprintf(stderr, "[DEBUG]: self->context = %p\n", self->context); + fprintf(stderr, "[DEBUG]: self->devices = %p\n", self->devices); + fprintf(stderr, "[DEBUG]: device_index = %d\n", device_index);*/ + + if (self->devices) { + // Check if the name attribute is NULL + if (!self->devices[device_index].code) { + fprintf(stderr, "[ERROR]: Sink's name is NULL.\n"); + return false; + } + //fprintf(stderr, "[DEBUG]: self->devices[device_index].code = %s\n", self->devices[device_index].code); + } + pa_operation* set_default_op = pa_context_set_default_sink(self->context, self->devices[device_index].code, NULL, NULL); + pa_operation_unref(set_default_op); + + // Use the introspect API to get a list of all device inputs + pa_operation *op = pa_context_get_sink_input_info_list(self->context, switch_device_cb, self); + + if (!op) { + return false; + } + + while (pa_operation_get_state(op) == PA_OPERATION_RUNNING) { + iterate(self, op); + } + + pa_operation_unref(op); + + return true; +} + + +/** + * @brief Process PulseAudio profiles using a null sink. + * + * This function initializes a null sink, iterates through all `pulseaudio_profile`s, + * retrieves the number of channels from the device's channel map, assigns it to the + * profile's `channels` attribute, and finally unloads the null sink. + * + * @param manager A pointer to the `pulseaudio_manager` structure. + * + * @note This function uses the `iterate` method from `pulseaudio_manager` to wait for PulseAudio operations to complete. + * + * @warning Ensure that the `pulseaudio_manager` is properly initialized before calling this function. + */ +void get_profile_channels(pulseaudio_manager *manager) { + uint32_t module_index = PA_INVALID_INDEX; + + // Static variable to track if the mainloop is locked + static int is_mainloop_locked = 0; + + // Check if the threaded mainloop is locked + if (!is_mainloop_locked) { + pa_threaded_mainloop_lock(manager->mainloop); + is_mainloop_locked = 1; + } + + // Callback to capture the module index when loading the null sink module + void load_module_callback(pa_context *c, uint32_t idx, void *userdata) { + (void) c; + (void) userdata; + module_index = idx; + } + + // 1. Initialize a Null Sink + pa_operation *load_op = pa_context_load_module(manager->context, "module-null-sink", "sink_name=easy_pulse_null_sink", load_module_callback, NULL); + if (!load_op) { + fprintf(stderr, "Failed to load null sink module\n"); + if (is_mainloop_locked) { + pa_threaded_mainloop_unlock(manager->mainloop); + is_mainloop_locked = 0; + } + return; + } + + // Wait for the operation to complete and for the callback to capture the module index + iterate(manager, load_op); + + // 2. Iterate through Profiles and Extract Channel Map + for (uint32_t i = 0; i < manager->device_count; i++) { + pulseaudio_device *device = &(manager->devices[i]); + for (uint32_t j = 0; j < device->profile_count; j++) { + pulseaudio_profile *profile = &(device->profiles[j]); + + // Extract the number of channels from the device's channel map + int num_channels = device->channel_map.channels; + + // Update the pulseaudio_profile with the number of channels + profile->channels = num_channels; + } + } + + // 3. Unload the Null Sink using the captured module index + if (module_index != PA_INVALID_INDEX) { + pa_operation *unload_op = pa_context_unload_module(manager->context, module_index, NULL, NULL); + if (!unload_op) { + fprintf(stderr, "Failed to unload null sink module\n"); + if (is_mainloop_locked) { + pa_threaded_mainloop_unlock(manager->mainloop); + is_mainloop_locked = 0; + } + return; + } + + // Wait for the operation to complete + iterate(manager, unload_op); + } else { + fprintf(stderr, "Invalid module index for null sink\n"); + } + + if (is_mainloop_locked) { + pa_threaded_mainloop_unlock(manager->mainloop); + is_mainloop_locked = 0; + } +} + + +/** + * @brief Retrieves the number of channels for a specified device. + * + * @param devices Pointer to an array of PulseSink structures. + * @param device_index Index of the device whose number of channels is to be retrieved. + * + * @return Number of channels for the specified device. Returns -1 on error. + */ +int get_active_profile_channels(const pulseaudio_device *devices, int device_index) { + if (!devices || device_index < 0) { + fprintf(stderr, "[ERROR]: Invalid devices array or device index in get_device_channels.\n"); + return -1; // Return -1 or another indicator of failure + } + return devices[device_index].channel_map.channels; +} + + + +/** + * @brief Callback function belonging to set_volume. Triggers when audio volume is set. + * + * + * @param c Pointer to the PulseAudio context. + * @param success Indicates the success (1) or failure (0) of the volume setting operation. + * @param userdata User data provided during the set_volume operation, expected to be of type `pulseaudio_manager`. + * + * @note On failure, an error message is printed to stderr with the reason for the failure. + * @note After the operations are processed, the function signals the main loop to continue. + */ +static void set_volume_cb1(pa_context *c, int success, void *userdata) { + (void) c; + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + + + if (!success) { + fprintf(stderr, "[ERROR]: Failed to set volume. Reason: %s\n", pa_strerror(pa_context_errno(c))); + } + + // Debug: Print cvolume values for each channel as percentages + //pa_cvolume cvolume = manager->devices[manager->active_device_index].volume; + + /*for (int i = 0; i < cvolume.channels; i++) { + float percentage = (cvolume.values[i] / (float)PA_VOLUME_NORM) * 100; + //printf("[DEBUG, volume_set_complete_cb()]: Channel %d cvolume value: %u (%.2f%%)\n", i, cvolume.values[i], percentage); + } + //printf("[DEBUG, volume_set_complete_cb invoked. Success: %d\n", success);*/ + + // Decrease the operations count and potentially signal the condition variable. + manager->operations_pending--; + + // Signal the main loop to continue + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + + +/** + * @brief Callback function belonging to set_volume. + * Triggers after audio volume levels are updated. + * + * @param c Pointer to the PulseAudio context. + * @param success Indicates the success (1) or failure (0) of the volume setting operation. + * @param userdata User data provided during the set_volume operation, expected to be of type `pulseaudio_manager`. + * + * @note On failure, an error message is printed to stderr with the reason for the failure. + * @note After the operations are processed, the function signals the main loop to continue. + */ +static void set_volume_cb2(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + pulseaudio_manager *self = (pulseaudio_manager *)userdata; + + if (eol > 0) { + //printf("[DEBUG, volume_check_cb()]: End-of-list reached.\n"); + self->operations_pending--; + return; + } + + if (!i) { + fprintf(stderr, "[ERROR, volume_check_cb()]: Null pointer for pa_sink_info.\n"); + self->operations_pending--; + return; + } + + if (!i->name) { + fprintf(stderr, "[ERROR, volume_check_cb()]: Null pointer for device name.\n"); + self->operations_pending--; + return; + } + + printf("[DEBUG, volume_check_cb()]: Processing device info for device: %s\n", i->name); + + // Update the volume values in the manager's devices structure + self->active_device->volume = i->volume; + + // Print the volume for each channel + for (int channel = 0; channel < i->volume.channels; channel++) { + //float volume_percentage = (float)i->volume.values[channel] / PA_VOLUME_NORM * 100.0; + //printf("Channel %d Volume: %.2f%%\n", channel, volume_percentage); + } + + //Signaling to continue. + pa_threaded_mainloop_signal(self->mainloop, 0); +} + + +/** + * @brief Set the volume for a specified device. + * + * This function allows setting the volume for a specific device based on the given percentage. + * The function performs various checks to ensure valid inputs and that the PulseAudio system is ready. + * It will adjust the volume for all channels of the device to the desired level. + * + * @param self Pointer to the pulseaudio_manager instance. + * @param device_index Index of the device to set the volume for. + * @param percentage Desired volume level as a percentage. + * @return Boolean indicating success or failure. + */ +bool set_volume(pulseaudio_manager *self, uint32_t device_index, float percentage) { + if (!self || percentage < 0.0f || percentage > 100.0f || device_index >= self->device_count) { + return false; + } + + // Convert percentage to volume + pa_volume_t volume = (percentage / 100.0) * PA_VOLUME_NORM; + if (volume >= PA_VOLUME_NORM) { + volume = PA_VOLUME_NORM - 1; + } + + // Debug: show index and desired volume. + //printf("[DEBUG, set_volume()] Index is: %i\n", device_index); + //printf("[DEBUG, set_volume()] Desired volume: %f%% (value: %u)\n", percentage, volume); + + // Ensure PulseAudio is ready and devices are loaded + if (self->pa_ready != 1 || self->devices_loaded != 1) { + return false; + } + + // Debug: Show channel volumes before the change. + /*for (int channel = 0; channel < self->devices[device_index].channel_map.channels; channel++) { + printf("[DEBUG, set_volume()]: Channel %d Before volume: %f%%\n", + channel, + 100.0 * self->devices[device_index].volume.values[channel] / PA_VOLUME_NORM); + }*/ + + // Create a pa_cvolume structure and set the volume for all channels + pa_cvolume cvolume; + pa_cvolume_init(&cvolume); + cvolume.channels = self->devices[device_index].channel_map.channels; // Manually set channels + pa_cvolume_set(&cvolume, cvolume.channels, volume); + + printf("[DEBUG, set_volume()] channels: %d\n", cvolume.channels); + + // Apply the volume change to the specific device by index and wait for the operation to complete + const char *device_name_to_change = self->devices[device_index].code; + self->operations_pending++; + pa_operation *op = pa_context_set_sink_volume_by_name(self->context, device_name_to_change, &cvolume, set_volume_cb1, self); + iterate(self, op); + + // Fetch the updated volume for the device and wait for the operation to complete + pa_operation *op2 = pa_context_get_sink_info_by_name(self->context, device_name_to_change, set_volume_cb2, self); + iterate(self, op2); + + return true; +} + + +/** + * @brief Iterates through operations in the pulseaudio_manager. + * + * @param manager Pointer to the pulseaudio_manager instance. + * @param op Pointer to the pa_operation instance. + */ +void iterate(pulseaudio_manager *manager, pa_operation *op) { + //Leaves if operation is invalid. + if (!op) return; + + bool is_in_mainloop_thread = pa_threaded_mainloop_in_thread(manager->mainloop); + + // If we're not in the mainloop thread, lock it. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_lock(manager->mainloop); + } + + //Wait for the operation to complete. + //The signaling to continue is performed inside the callback operation (op). + pa_threaded_mainloop_wait(manager->mainloop); + + //Cleaning up. + pa_operation_unref(op); + + // If we locked the mainloop earlier, unlock it now. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_unlock(manager->mainloop); + } +} + +/** + * @brief Create a new pulseaudio_manager instance. + * @return Returns a pointer to a manager structure. + */ +pulseaudio_manager *new_manager(void) { + pulseaudio_manager *manager = (pulseaudio_manager *)malloc(sizeof(pulseaudio_manager)); + if (!manager) return NULL; + + + // Initialize pointers to 0 -- good practice. + manager->device_count = 0; + manager->devices_loaded = 0; // Initialize to 0 + manager->load_devices = load_devices; + manager->destroy = destroy; + manager->switch_device = switch_device; + manager->set_volume = set_volume; + manager->get_active_device = get_active_device; + manager->iterate = iterate; + manager->get_active_profile_channels = get_active_profile_channels; + //manager->get_profiles_for_device = get_profiles_for_device; + manager->get_profile_channels = get_profile_channels; + manager->get_profile_count = get_profile_count; + + if(!initialize(manager)) { + free(manager->devices); + free(manager); + return NULL; + } + + manager->device_count = get_device_count(); + manager->devices = malloc(manager->device_count * sizeof(pulseaudio_manager)); + + if(!manager->devices) { + fprintf(stderr, "[new_manager()] Could not allocate memory for the manager devices.\n"); + return NULL; + } + +#if 0 + if (!load_devices(manager)) { + fprintf(stderr, "No audio devices were detected. Aborting.\n"); + destroy(manager); + return NULL; + } +#endif + + return manager; +} + +/** + * @brief Callback function to process the PulseAudio server information. + * + * This callback is invoked once the server information is available. It retrieves the default device name + * from the server response and determines the active device by matching the name with the available devices + * in the manager's list. + * + * @param c Pointer to the PulseAudio context. + * @param info Pointer to the pa_server_info structure containing the server's information. + * @param userdata User-provided data (expected to be a pointer to pulseaudio_manager). + */ +static void get_active_device_cb(pa_context *c, const pa_server_info *info, void *userdata) { + (void) c; + pulseaudio_manager *manager = (pulseaudio_manager *)userdata; + + if (!info || !info->default_sink_name) { + fprintf(stderr, "[ERROR]: Null pointer in active_device_cb.\n"); + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + + // Get the default device name from the server information + const char *default_device_name = info->default_sink_name; + + // Iterate over the available devices to find the active one + for (uint32_t i = 0; i < manager->device_count; i++) { + if (strcmp(manager->devices[i].code, default_device_name) == 0) { + // Set the active device pointer when a match is found + manager->active_device = &manager->devices[i]; + break; + } + } + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + + +/** + * @brief Request the default device name from the PulseAudio server and determine the active device. + * + * This function initiates a request to retrieve the default device name (active device) from the PulseAudio server. + * Once the server provides this information, the active_device_cb callback is triggered to process the response. + * + * @param manager Pointer to the pulseaudio_manager instance. + */ +//TODO: REWORK THE WAITING LOGIC. +void get_active_device(pulseaudio_manager *manager) { + pa_threaded_mainloop_lock(manager->mainloop); + + // Request server information + pa_context_get_server_info(manager->context, get_active_device_cb, manager); + + // Wait until the iterate function signals that it's done + pa_threaded_mainloop_wait(manager->mainloop); + + pa_threaded_mainloop_unlock(manager->mainloop); + + // The original loop to wait for active_device_name to be set + int timeout = 50; // Number of iterations or timeout value + while (!manager->active_device->code && timeout-- > 0) { + manager->iterate(manager, NULL); + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + + +/** + * @brief Frees the memory of a pulseaudio_manager instance. + * + * @param manager Pointer to the pulseaudio_manager instance to be deleted. + */ +void destroy(pulseaudio_manager *self) { + cleanup(self); + + if (self) { + for (uint32_t i = 0; i < self->device_count; i++) { + if (self->devices[i].code) { + free(self->devices[i].code); + self->devices[i].code = NULL; + } + if (self->devices[i].description) { + free(self->devices[i].description); + self->devices[i].description = NULL; + } + } + // Now, free profiles for each device (if they exist) + for (uint32_t i = 0; i < self->device_count; i++) { + if (self->devices[i].profiles) free(self->devices[i].profiles); + } + if (self->devices) free(self->devices); + free(self); + } +} diff --git a/v-0.04/easypulse_core.h b/v-0.04/easypulse_core.h new file mode 100644 index 0000000..9129942 --- /dev/null +++ b/v-0.04/easypulse_core.h @@ -0,0 +1,90 @@ +/** + * @file core.h + * @brief EasyPulse Library Header. + * + * EasyPulse is a library designed to provide pseudo-object oriented programming + * functions to simplify access to PulseAudio. + */ + +#ifndef EASPYPULSE_CORE_H +#define EASPYPULSE_CORE_H +#define DEBUG_MODE 0 // Debug mode flag + +#include +#include "system_query.h" +#include +#include +#include + +typedef struct { + char *name; // Name of the profile + char *description; // Description of the profile + uint32_t channels; // Number of channels this profile has +} pulseaudio_profile; + + +// Forward declarations +typedef struct pulseaudio_manager pulseaudio_manager; +typedef struct pulseaudio_device pulseaudio_device; + +/** + * @brief Represents a PulseAudio devices. + */ +struct pulseaudio_device { + uint32_t index; // Index of the device. + char *code; // Name of the device. + char *description; // Description of the device. + pa_cvolume volume; // Volume of the device. + /* pulseaudio_profile *active_profile; // Active alsa profile of this device. */ + pa_channel_map channel_map; // Channel map of the devices. + int mute; // Mute status of the devices (1 for muted, 0 for unmuted). + int min_play_channels; // The minimum number of playback channels of the device. + int max_play_channels; // The maximum number of playback channels of the device. + pulseaudio_profile *profiles; // Array of available profiles for the device + uint32_t profile_count; // Number of available profiles +}; + +/** + * @brief Represents the main manager for PulseAudio operations. + */ +struct pulseaudio_manager { + pa_threaded_mainloop *mainloop; // Mainloop for PulseAudio operations. + pa_context *context; // PulseAudio context. + pulseaudio_device *devices; // Array of available devices. + uint32_t device_count; // Count of available devices. + int pa_ready; // Indicates if PulseAudio is ready (1 for ready, 2 for error). + int devices_loaded; // Indicates if devices are loaded (0 for not loaded, 1 for loaded successfully, 2 for error). + int operations_pending; // Counter for pending operations. + pulseaudio_device *active_device; // Pointer to active device. + uint32_t current_device_index; // The devices being processed right now by the program. It's not necessarily the same as the playback device. + + bool (*initialize)(pulseaudio_manager *self); // Initializes the manager. + void (*destroy)(pulseaudio_manager *manager); // Destroys the manager. + bool (*load_devices)(pulseaudio_manager *self); // Loads available devices. + bool (*switch_device)(pulseaudio_manager *self, uint32_t devices_index); // Switches to a specified device. + bool (*set_volume)(pulseaudio_manager *self, uint32_t devices_index, float percentage); // Sets the volume to a specified percentage. + void (*get_active_device)(pulseaudio_manager *manager); // Assures that a pulseaudio operation is not pending. + void (*iterate)(pulseaudio_manager *manager, pa_operation *op); // Goes through every step of a threaded loop. + int (*get_active_profile_channels) (const pulseaudio_device *device, int device_index); // Gets the number of channels of an active profile. + //void (*get_profiles_for_device)(pulseaudio_manager *manager, const char* device_code); // Updates the profiles of a particular device. + void (*get_profile_channels)(pulseaudio_manager *manager); // Extracts profile channels by copying them to null sink. + uint32_t (*get_profile_count)(uint32_t card_index); // Gets the number of pulseaudio profiles in the system. +}; + +/** + * @brief Create a new pulseaudio_manager instance. + * @return A pointer to the newly created pulseaudio_manager instance. + */ +pulseaudio_manager* new_manager(void); + +bool load_devices(pulseaudio_manager *self); +int get_active_profile_channels(const pulseaudio_device *devices, int device_index); +bool set_volume(pulseaudio_manager *self, uint32_t devices_index, float percentage); +void iterate(pulseaudio_manager *manager, pa_operation *op); +int get_device_channels(const pulseaudio_device *devices, int devices_index); +void destroy(pulseaudio_manager *manager); +//void get_profiles_for_device(pulseaudio_manager *manager, const char* device_code); +void get_active_device(pulseaudio_manager *manager); +void get_profile_channels(pulseaudio_manager *manager); + +#endif // CORE_H diff --git a/v-0.04/examples/Makefile b/v-0.04/examples/Makefile new file mode 100644 index 0000000..6f11288 --- /dev/null +++ b/v-0.04/examples/Makefile @@ -0,0 +1,19 @@ +CC = gcc +CFLAGS = -Wall -Wextra -g -O0 + +LIB_DIR = ../ +LIB_SRC = $(LIB_DIR)*.c + +EXAMPLES_DIR = . +EXAMPLES_SRC = $(wildcard $(EXAMPLES_DIR)/*.c) +EXAMPLES_OUT = $(patsubst $(EXAMPLES_DIR)/%.c,$(EXAMPLES_DIR)/%,$(EXAMPLES_SRC)) + +all: $(EXAMPLES_OUT) + +$(EXAMPLES_DIR)/%: $(EXAMPLES_DIR)/%.c + $(CC) $(CFLAGS) $< $(LIB_SRC) -o $@ -lpulse -lasound + +clean: + rm -f $(EXAMPLES_DIR)/*~ $(EXAMPLES_OUT) + +.PHONY: all clean diff --git a/v-0.04/examples/alsa-mapper_pulseaudio-api b/v-0.04/examples/alsa-mapper_pulseaudio-api new file mode 100755 index 0000000000000000000000000000000000000000..303795927e1b86bc04ad6abba490730263529324 GIT binary patch literal 73864 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 literal 0 HcmV?d00001 diff --git a/v-0.04/examples/alsa-mapper_pulseaudio-api.c b/v-0.04/examples/alsa-mapper_pulseaudio-api.c new file mode 100644 index 0000000..47eb39b --- /dev/null +++ b/v-0.04/examples/alsa-mapper_pulseaudio-api.c @@ -0,0 +1,91 @@ +/** + * @file pulseaudio_alsa_mapper.c + * @brief Demonstrates how to map PulseAudio sinks to their corresponding ALSA device names. + */ + +#include +#include +#include +#include + +static const char* get_alsa_friendly_name(int card_num) { + snd_ctl_t *ctl; + char name[128]; + snprintf(name, sizeof(name), "hw:%d", card_num); + + if (snd_ctl_open(&ctl, name, 0) < 0) { + return NULL; + } + + snd_ctl_card_info_t *info; + snd_ctl_card_info_alloca(&info); + if (snd_ctl_card_info(ctl, info) < 0) { + snd_ctl_close(ctl); + return NULL; + } + + const char *friendly_name = strdup(snd_ctl_card_info_get_name(info)); + snd_ctl_close(ctl); + return friendly_name; +} + +static void sink_info_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) userdata; + + if (eol > 0) { + pa_context_disconnect(c); + return; + } + + const char *udev_description = pa_proplist_gets(info->proplist, "device.description"); + const char *card_str = pa_proplist_gets(info->proplist, "alsa.card"); + const char *device_str = pa_proplist_gets(info->proplist, "alsa.device"); + + int card_num = card_str ? atoi(card_str) : -1; + const char *friendly_name = card_num != -1 ? get_alsa_friendly_name(card_num) : NULL; + + if (udev_description && card_str && device_str) { + printf("Sink: %s, UDEV description: %s, ALSA name: hw:%s,%s", info->name, udev_description, card_str, device_str); + if (friendly_name) { + printf(", Friendly ALSA name: %s", friendly_name); + free((void*)friendly_name); + } + printf("\n"); + } else if (udev_description) { + printf("Sink: %s, UDEV description: %s, Incomplete ALSA name information.\n", info->name, udev_description); + } +} + +static void context_state_cb(pa_context *c, void *userdata) { + switch (pa_context_get_state(c)) { + case PA_CONTEXT_READY: + pa_context_get_sink_info_list(c, sink_info_cb, NULL); + break; + case PA_CONTEXT_FAILED: + case PA_CONTEXT_TERMINATED: + pa_mainloop_quit((pa_mainloop*)userdata, 0); + break; + default: + break; + } +} + +int main(void) { + pa_mainloop *mainloop; + pa_mainloop_api *mainloop_api; + pa_context *context; + + mainloop = pa_mainloop_new(); + mainloop_api = pa_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "udev_description_fetcher"); + + pa_context_set_state_callback(context, context_state_cb, mainloop); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + + pa_mainloop_run(mainloop, NULL); + + pa_context_unref(context); + pa_mainloop_free(mainloop); + + return 0; +} diff --git a/v-0.04/examples/change-speaker-mode b/v-0.04/examples/change-speaker-mode new file mode 100755 index 0000000000000000000000000000000000000000..1417c3b0af36b17c43348cc91d1e8ec68586c297 GIT binary patch literal 70144 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 z z48m)j-d>}FJ*QV`!G6%#!|oJ{vaE+FX>H?`!(pf23NO2H7+%r0FG^ZPnJL^x(ey&T z0!!Q?v0_okXf{s>AA&HZ{wOC>mS8M0MQJ%cKr1fe|3m2Il}4xE2rt)Ou3gSXS16Ks zj;L{h%_j&%y>hM7-fM>STD|sy>`6k)RBful(3Tb_Z$*f|Dyv5RDF9^iNQACH5^Bg5 zi#mc;*OiY|zve zR$86iKxMO0kMLUeI&HiZl4rzEuw^)AdTqzhcqE7=b92K=i5VfuXI*X=Q zUxQp@UsE1AtZt`S#eez@lVsxQ;Po-~vk3`Kmlc`n zyx_j1H8D#Ly>ynLEL<6t^OkTmoJ{0e?ujwdV0?k-QjWOx)1j@f*T&Mp>?`a}vqZSk z>?{`+QFY{TGqZt{#ZR*j&*GF4Ec^Rxo?M?yBtC2p4xoiue2TrKaRw2_M=kNdZV@p{ zn#@32L1W9JO9Hl7hZXr&4f~e)K#jq|1=JeL#05sLcNfC@wucHkx~U%1<6wlXz^R_< z;&6Vx4}#Z5ZQd|E#imnZxI#ql(f+E|ml?s?+!p0ji?ND!r`T5~{3T1FnNIE^H)(Op zA_ld^#S}YqkS;Sx&-4y4>o}VSHEgwuYY6$*$gaj27P)iK@hX{&H^FEDHTK$@SojS% zJNCyRggw4UQH7+~jlyqqd!qXg;$0R`B0?~C^T{%(u^p_@Dtu7m(V~{k*lnoAXV~08 zTMN#{z||+g2%{{EKqz78JqnJd$p|FOP!|5xxB@8*#v!P|_np!jYHb`JuTFtS`xO9} zM_z2!SI5U$d{5tCRV3DXa8GXujGnj8S$ay$UzE%Y{(m4GpBK;+2jMopK7cqBU7F%V z!NO&xLl#Ei4@^NV{!0d5(^qUxxxuuqa8aDt#XmRrnm${|O)=Ku)%Nf|ZSXbSC}v;7 zzlHbTdH8Uq?SEkKHGR(DBdoxePk#g`PWiI!f7{?|`Uc`SbWt0LcZ#p^_5?6O(fWTH z^FX>ZeZk-hRLanMN-2!;(4qei&1pWG>biu|uk~n3@%sOE@agv$=+g8JeiHhLPNm;~ zgP+3<^@*1Ew+7#)CZpD`_}czoGWdHYAN{5UU7EgSI-Kxn&B(|9HNc3kT7IyB2f8-+ ze?ao>UcUT%8ZTY^jSb1I>7nUQEkoBmH2p0PU*mzA{?LaMQ&PoKD4nC=*01qXO`p(= zCiUt6ZG*4;*Z8-lUsZ+~eD5*%eGgyPDKwoBan9w}{{_6GEL#5|EwJIz^fR9P`t|=6 z@{-6Zn?GyTLp1gC>$9d`0WOK0;(yNIYpVH>g)e>9^y`3<>?ppj$7rezBmJdI@w6Ym z4H&iG;+u7w2PS=vkeo~LHT`$IbMbZEN7K)F{8v0p>DTOBe2t%Ks&py|if5mJOfXBo ziOXtybFLXpy5T)PVd}r^!4==vKcbZ`O~23J3pD@#XNHc~a}eJto`Qe40{_P{$&p^u zoRa$Z+ZFg + +int main(void) { + // Initialize the pulseaudio_manager + pulseaudio_manager *manager = new_manager(); + //pulseaudio_manager *self = manager; + + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudio manager.\n"); + return 1; + } + + #if 0 + // Detect the current mode of the active device + const char* current_mode = manager->get_device_mode_by_code(manager, manager->active_device->code); + printf("Current mode of the active device (%s): %s\n", manager->active_device->code, current_mode); + + // List available modes based on the number of channels of the active device + printf("\nAvailable modes:\n"); + printf("1. mono\n"); + printf("2. stereo\n"); + + int max_choice = 2; // To keep track of the maximum mode choice number + uint32_t channels = manager->active_device->number_of_channels; + + if (channels >= 4) { + printf("3. 4.0\n"); + max_choice = 3; + } + if (channels >= 5) { + printf("4. 5.0\n"); + max_choice = 4; + } + if (channels >= 6) { + printf("5. 5.1\n"); + max_choice = 5; + } + if (channels >= 8) { + printf("6. 7.1\n"); + max_choice = 6; + } + + // Prompt the user to select a mode + printf("\nEnter the number corresponding to the desired mode: "); + int choice; + scanf("%d", &choice); + + if (choice < 1 || choice > max_choice) { + printf("Invalid choice.\n"); + manager->destroy(self); + return 1; + } + + const char* mode_choices[] = {"mono", "stereo", "4.0", "5.0", "5.1", "7.1"}; + const char* mode_to_set = mode_choices[choice - 1]; + + // Set the mode of the active device + if (manager->set_device_mode_by_code(manager, manager->active_device->code, mode_to_set)) { + printf("Mode set to %s successfully!\n", mode_to_set); + } else { + fprintf(stderr, "Failed to set the mode.\n"); + } + + // Cleanup + manager->destroy(self); + return 0; + #endif +} diff --git a/v-0.04/examples/error.txt b/v-0.04/examples/error.txt new file mode 100644 index 0000000..edb3387 --- /dev/null +++ b/v-0.04/examples/error.txt @@ -0,0 +1,103 @@ +Operation state at cycle 0: 0 +Operation state at cycle 1: 0 +Operation state at cycle 2: 0 +Operation state at cycle 3: 0 +Operation state at cycle 4: 0 +Operation state at cycle 5: 0 +Operation state at cycle 6: 0 +Operation state at cycle 7: 0 +Operation state at cycle 8: 0 +Operation state at cycle 9: 0 +Operation state at cycle 10: 0 +Operation state at cycle 11: 0 +Operation state at cycle 12: 0 +Operation state at cycle 13: 0 +Operation state at cycle 14: 0 +Operation state at cycle 15: 0 +Operation state at cycle 16: 0 +Operation state at cycle 17: 0 +Operation state at cycle 18: 0 +Operation state at cycle 19: 0 +Operation state at cycle 20: 0 +Operation state at cycle 21: 1 +Operation state at cycle 0: 0 +Operation state at cycle 1: 0 +Operation state at cycle 2: 0 +Operation state at cycle 3: 0 +Operation state at cycle 4: 0 +Operation state at cycle 5: 0 +Operation state at cycle 6: 0 +Operation state at cycle 7: 0 +Operation state at cycle 8: 0 +Operation state at cycle 9: 0 +Operation state at cycle 10: 0 +Operation state at cycle 11: 0 +Operation state at cycle 12: 0 +Operation state at cycle 13: 0 +Operation state at cycle 14: 0 +Operation state at cycle 15: 0 +Operation state at cycle 16: 0 +Operation state at cycle 17: 0 +Operation state at cycle 18: 0 +Operation state at cycle 19: 0 +Operation state at cycle 20: 0 +Operation state at cycle 21: 0 +Operation state at cycle 22: 0 +Operation state at cycle 23: 0 +Operation state at cycle 24: 0 +Operation state at cycle 25: 0 +Operation state at cycle 26: 0 +Operation state at cycle 27: 0 +Operation state at cycle 28: 0 +Operation state at cycle 29: 0 +Operation state at cycle 30: 0 +Operation state at cycle 31: 0 +Operation state at cycle 32: 0 +Operation state at cycle 33: 0 +Operation state at cycle 34: 0 +Operation state at cycle 35: 0 +Operation state at cycle 36: 0 +Operation state at cycle 37: 0 +Operation state at cycle 38: 0 +Operation state at cycle 39: 0 +Operation state at cycle 40: 0 +Operation state at cycle 41: 0 +Operation state at cycle 42: 0 +Operation state at cycle 43: 0 +Operation state at cycle 44: 0 +Operation state at cycle 45: 0 +Operation state at cycle 46: 0 +Operation state at cycle 47: 0 +Operation state at cycle 48: 0 +Operation state at cycle 49: 0 +Operation state at cycle 50: 0 +Operation state at cycle 51: 0 +Operation state at cycle 52: 0 +Operation state at cycle 53: 0 +Operation state at cycle 54: 0 +Operation state at cycle 55: 0 +Operation state at cycle 56: 0 +Operation state at cycle 57: 0 +Operation state at cycle 58: 0 +Operation state at cycle 59: 0 +Operation state at cycle 60: 0 +Operation state at cycle 61: 1 +Operation state at cycle 0: 0 +Operation state at cycle 1: 0 +Operation state at cycle 2: 0 +Operation state at cycle 3: 0 +Operation state at cycle 4: 0 +Operation state at cycle 5: 0 +Operation state at cycle 6: 0 +Operation state at cycle 7: 0 +Operation state at cycle 8: 0 +Operation state at cycle 9: 0 +Operation state at cycle 10: 0 +Operation state at cycle 11: 0 +Operation state at cycle 12: 0 +Operation state at cycle 13: 0 +Operation state at cycle 14: 0 +Operation state at cycle 15: 0 +Operation state at cycle 16: 0 +Operation state at cycle 17: 0 +Assertion '!m->thread || !pa_thread_is_running(m->thread) || !in_worker(m) || pa_atomic_load(&m->in_once_unlocked)' failed at ../pulseaudio/src/pulse/thread-mainloop.c:179, function pa_threaded_mainloop_lock(). Aborting. diff --git a/v-0.04/examples/get-card-profiles-pulseaudio_api b/v-0.04/examples/get-card-profiles-pulseaudio_api new file mode 100755 index 0000000000000000000000000000000000000000..e14e739fde1f0c3f1e23456b8c959f3f4838e978 GIT binary patch literal 71216 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 literal 0 HcmV?d00001 diff --git a/v-0.04/examples/get-card-profiles-pulseaudio_api.c b/v-0.04/examples/get-card-profiles-pulseaudio_api.c new file mode 100644 index 0000000..a068814 --- /dev/null +++ b/v-0.04/examples/get-card-profiles-pulseaudio_api.c @@ -0,0 +1,63 @@ +/** + * @file get-card-profiles-pulseaudio_api.c + * @brief This program queries and displays information about available sound devices in a computer. + * + * It uses the PulseAudio library to interact with the sound system and retrieve information about + * available sound devices, their properties, and ALSA (Advanced Linux Sound Architecture) related data. + */ + +#include +#include "../easypulse_core.h" + +int main(void) { + // Query the total number of PulseAudio devices + uint32_t total_devices = get_device_count(); + + printf("Total sound devices in this computer:%lu\n", (unsigned long) total_devices); + printf("Available PulseAudio sound devices:\n"); + + pa_sink_info **sink_info = get_available_sinks(total_devices); + if (!sink_info) { + fprintf(stderr, "Error: Could not retrieve sound device information.\n"); + return 1; + } + + for (uint32_t i = 0; i < total_devices; i++) { + if (!sink_info[i]) { + fprintf(stderr, "Error: sound device information at index %u is NULL.\n", i); + continue; + } + + // Display sink name + printf("\n- Sound device name: %s\n", sink_info[i]->name ? sink_info[i]->name : "NULL"); + printf("\n- Sound device description: %s\n", sink_info[i]->description ? sink_info[i]->description : "NULL"); + + // Query and display the number of profiles + uint32_t profile_count = get_profile_count(i); + printf(" - Number of profiles: %u\n", profile_count); + + // Get and display the ALSA name + const char *alsa_name = get_alsa_name(sink_info[i]->name); + const char *alsa_id = get_alsa_id(sink_info[i]->name); + + printf("\n- Alsa ID is: %s\n", alsa_id ? alsa_id : "NULL"); + + if (alsa_name) { + printf(" - ALSA name: %s\n", alsa_name); + + // Get and display the minimum and maximum channels + int min_channels = get_min_channels(alsa_id); + int max_channels = get_max_channels(alsa_id); + + printf(" - Minimum channels: %d\n", min_channels); + printf(" - Maximum channels: %d\n", max_channels); + free((char *)alsa_name); // Free the memory allocated for alsa_name + } else { + printf(" - No corresponding ALSA name found.\n"); + } + } + + free(sink_info); + return 0; +} + diff --git a/v-0.04/examples/switch-sink b/v-0.04/examples/switch-sink new file mode 100755 index 0000000000000000000000000000000000000000..f3272fd09df1a64da3bf670628a7e69d0cafad5b GIT binary patch literal 70656 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%0A9!%R>|9Zpj;_t2Zp$64sl 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 Qg}-${y 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 +#include +#include +#include + +static pa_threaded_mainloop *mainloop; +static pa_context *context; +static int sink_count = 0; +static char **sink_names = NULL; + +void sink_list_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + (void) userdata; + if (eol > 0) { + int chosen; + printf("Enter the number of the sink to set as default: "); + scanf("%d", &chosen); + + if (chosen >= 0 && chosen < sink_count) { + pa_context_set_default_sink(c, sink_names[chosen], NULL, NULL); + } + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + sink_names = realloc(sink_names, sizeof(char*) * (sink_count + 1)); + sink_names[sink_count] = strdup(info->name); + printf("%d: %s (%s)\n", sink_count++, info->name, info->description); +} + +void context_state_cb(pa_context *c, void *userdata) { + (void) userdata; + + if (pa_context_get_state(c) == PA_CONTEXT_READY) { + pa_operation_unref(pa_context_get_sink_info_list(c, sink_list_cb, NULL)); + } +} + +int main(void) { + mainloop = pa_threaded_mainloop_new(); + pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "sink_switcher_threaded"); + + pa_context_set_state_callback(context, context_state_cb, NULL); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + pa_threaded_mainloop_start(mainloop); + + pa_threaded_mainloop_lock(mainloop); + pa_threaded_mainloop_wait(mainloop); // Wait until sink_list_cb signals completion + + for (int i = 0; i < sink_count; i++) { + free(sink_names[i]); + } + free(sink_names); + + pa_context_disconnect(context); + pa_context_unref(context); + pa_threaded_mainloop_unlock(mainloop); + pa_threaded_mainloop_stop(mainloop); + pa_threaded_mainloop_free(mainloop); + return 0; +} diff --git a/v-0.04/examples/switch-sink.c b/v-0.04/examples/switch-sink.c new file mode 100644 index 0000000..45a8739 --- /dev/null +++ b/v-0.04/examples/switch-sink.c @@ -0,0 +1,61 @@ +/** + * Demo Code: PulseAudio Sink Switcher + * + * This demonstration code showcases the functionality of switching audio sinks + * using the PulseAudio API. It initializes the PulseAudio manager, loads available + * audio sinks, prompts the user to select a sink, and then switches to the chosen sink. + * + * Note: Ensure the PulseAudio server is running and in a good state before executing. + */ +#include "../easypulse_core.h" +#include +#include + +int main() { + // Initialize the PulseAudio Manager + pulseaudio_manager *manager = new_manager(); + pulseaudio_manager *self = manager; + + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudioManager.\n"); + manager->destroy(self); + return 1; + } + + // Display available devices to the user + printf("Available Sinks:\n"); + for (uint32_t i = 0; i < manager->device_count; i++) { + printf("%d. %s - %s\n", i + 1, manager->devices[i].code, manager->devices[i].description); + } + + // Prompt the user to select a device + printf("Enter the number of the sink you want to switch to: "); + uint32_t choice; + scanf("%d", &choice); + + + // Validate the user's choice + if (choice < 1 || choice > manager->device_count) { + fprintf(stderr, "Invalid choice.\n"); + manager->destroy(self); + return 1; + } + + + // Switch to the selected device + if (manager->switch_device(manager, choice - 1)) { + printf("Successfully switched to the selected device.\n"); + + // Debug code to print the default device after the switch + fprintf(stderr, "[DEBUG]: Default device after switch: %s\n", manager->active_device->code); + } + else { + fprintf(stderr, "Failed to switch to the selected device.\n"); + return 1; + } + + // Cleanup + manager->destroy(self); + + return 0; +} diff --git a/v-0.04/examples/volume-change b/v-0.04/examples/volume-change new file mode 100755 index 0000000000000000000000000000000000000000..c61dfbc89bfa2cf6d4112716f4d9fda32a094170 GIT binary patch literal 70192 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 literal 0 HcmV?d00001 diff --git a/v-0.04/examples/volume-change-pulseaudio b/v-0.04/examples/volume-change-pulseaudio new file mode 100755 index 0000000000000000000000000000000000000000..6404d4dde4868b229033891f5fc05022c0e4eb5f GIT binary patch literal 72856 zcmeFad3;sX)i-|jIrrQlxyikm69{mb!yE>g1Pwy)f~ax8f)ir`Q6vZnf)z-KSYk>G ztph4rsfhS>DgFPO%8>?5i;qhA<~D#ZzI8x3a7XtH0IH3W6TM zKacO&@+BKY{Jb)(LCZnOcEzlmpe)sB%PT$YEZMHBUt^)Bc%>EBFx$DTCV0UwAy>b2 zhilj?)7y!@D#L$FxyQ)&%Jg>h&7LcCyFKeVm&K+Nd%VsVIdm7>wVHOVrkz(>#-Cp4 z`IBP!Z@ls6v1J8l{8h-+vW{)H#EF5nSjz8PL9-X}T_(!+1{h+lUK5_RK&(8n+ z+57+g%0CAUy5h0eBJ!{wY(pOYh~q!+NAoA+A9)xzQVCdnh&u)UF5htLH51-z@um?u zI{kJ-SZ*hb1};HyBK)6V@QLt0g#jnRAM8TTgI(|^y0GUO;QMIPI$iIE15Tv(`Yz;O z(S`lL=tA#ZUGRV0h2Fw0_}}UR|8f^{uJ6KcA9m5NZ+Bt;AG_e++l4(NyW;Oc{)b)Q zuj<17<}UR9t_wM#F7QLTkn_(j@GV`)dAtid@9u*CCtcw8cQKBuyTG5+1%7T9^8eBW z{`{``+lBn;UG#TA7yOl7;AeFaCtR-*_;>7YX;=JR$lu>Zf2VeVf4vL&cV;h_#CUmI`}n>@b2f< zym?Ems9Qd7RsDjM_4DRg^JbiX=Dfw#E322(uBxwIdH$JGm(?w=K7YZ&W!0K?LduE- z^A^=DudiNHKW|yxg2nT$s9W5C20+&@U0J>Xjmcq~p80s&>ip1e9TX|w-4REpc?uwOlE7+%bFmjb>HywfO6StKJNVjuw?JBr# zdG#Xg7}I{i>LuyoYM0j@@3;B|_0{n0vSkYwXluM7NS9~gMV!b6>8ja}PGRH;xT0=# zwH}w+(C(`@o`Qb*rj< zXz5k+RxDV#;EGjn^3~OKH76iY*`lQj5E#o=VOFm>0n38rYfpgf+^}{zmYzjx7R;-u z#r%LW>k0%+-6CMIm0n~PB(543Vt&yTE3BFoD{Gh6*H~9nU%?-x1TFf+NLkY{nj z3LtA&)h(JZVcx1m3zpM*(`HpY*0hyY%~dOFF}(9AebMFU#^v*B7St}Ypm9aRvQ^dG zua^^Au&SDI@bZ<5##mLeXPs9$uiQF)){N7p&Kos+ zoL?K`*G8vmDdec(Cvi2lv8(s~3;2+Sbqy_O$`Eofaz~I$*z(Uo>2aspYl%vD$>+fy z#=+JfSqA>)BPrp1nEA=tfmh*{=32uHE#IZFL2npz`%I|hphPqzIWSANK1m&Wd?5OR*RI#wi*EQ=jFxT z{cCGKjeo%8y&k^8;9HNm-+6HB2HlQ1kk^Ko{b_jSTi)+L8h(U_MEO!0eq0*bgW zI^NjB?l9l-e~r4voD~D$|H6&BN<6j*{x9CBtHfi=;{S>pb(MJB^8H_;QCEpKt`tOB z8eZ~2&1RLS;n~Lfjc?R7;=Ejyn2JVTEsOXJsp(6yQJ2JL>Z)9;8Z|(CR9EFXr%?mM zBXIoR{6<|RKHJAy*3vY5EDgUR4bRy2erp47gj@TCX7^uU)M_|gMkdf@-A2i}kM{3O}*Ryf(> zJ~hv>lABuV?V|^hO;3a$7ekJo^fb^%`#*zgtXBnUgqM=maquX9{U0N&2pP>=;e@~o2{SeAhzoonVWy-VmcZu{W-8io_zNKV z&m_zgwBw+_rx9lA*>OPNiG-PQcC-pSiZD~njy(boCY(=rr@(y(Gv(~qDsVT#Of@?i z1N|BWzH z#*Vna|4FzfVN2lW3HKs=_;dFEX~GG@2L*nNaBso~1l~)SsbEK|!1oYl3fQqn;2#ra z>esPT;5!L3UA^<{B6Qa@j6xrd_7^Nb{+Et-bk1!T}PF`R}*F`*HIzx zO2SOxI?4sUj4)HTj)cGq2{UEuhzoonVWw&wmcZu{<|Cqx!=K6c6K2ZRaZupX2s2gd zI3Vyu!c5URS_K|On5kLE9)SlFW=htvQ{X;?nTmC66}TH=reGb7fH^-$zCEM)xl5DH ze@iyKdbsNR%8{)jpGt0-d=Vzq(E{gU%le>Zc&yj8Xo3m6W%9e1uyEgGG2uvk0jBor z7wM@TIeIYGtC4(E2zANhDSIEU zN!7W&P+rFp@Xm&eUm5e;*p&xrcHmCLdSUjr_guWk} zyN~s5QonQ`n4Wq+cH#c_VsSScxc6dn_PrMy+SDI_oi!%jon|-FLwWabZiAUn}16eoCdQExn)H-x#dQZfS_xq zh%+9fN60#kthz11?eN0?u)`x^v)AE4Qt#a19>AqKybLC^Y~ocqd=F-`-{F>j(n@z4 zV#puOfif(WM;0fC=+Uot+aHHxo_buOrs=JCvU%N+WOKveWJ@K=w)ScabJLMP!$2Z* zKerUzBHcXcQmwB297rH+gQSG%1k!JU?3t?4@`zsdU`n_;NIyG!5C=($skWxa6 zo84PA|94RA6~}JLx|AN*qj5fkwzv(TiaEmKckl&GJsVU?yjlC8!hoBPNZXMH?9kM~ z1{|#0b~oTfw6nzx81Ngq?T2%<jr!WR0##Y`{nTDOYr0Y^z%Tnxw0K)d$Osu z6m@zRFiaFTfUT|lGZ@oc`D)X;R|EBVyskXG1z@||bVRN0b!Z}*9Bz{*;;0?*J3Jd! z9_p!y+&gq4jwexVO^rzcMzyy;C;gt?o@}0Dd;i{Q~>+q7+(i>wgcR0 z>dwPnbG#Q)&9k3LHlNuFds`Vw|y`EyY%91T^{3{&QeS3K`euQ1b;`s;cEZFb{bfRNBaBY>Z;%Xhb28|Ka6=f~6 zUrp}&n@c4vCIZTd>!f;1X)xLRyY|0`dgnwAx;2e)40t!fE|z3wwcMn~UoQcKD?AJR7*r`h;N2k8LMw5+rd zzyNSgw>LMSi?d$>Bj&Bl-yoMY~sd@rkhbg-LWav5EvZ5T;9;UT3;O{L37fN@Y+sh%6@&3T;6HJ7{w*eo* zhJV8nvNo57&tGVG1=-z&C?nn2i;c!bud2{7kP3!(()sGdJ%FjI90yo16Gn#R` z%$hFx+uAq1-&t?N3H5##9zUk5SSk-T&wd31cK}kkVxqgRSPgTMP3sO?_2*D=vZX36 z2Ed?wN$A~o&`v5AK}2B-X$M=%acw{5zWk5(I$QN$u#(cbMeFPlx07WOI2`b%b?p{6 zW_nHHGG~^{DzjX+R1_m9R}RCtKX#rTcW%wSaep2AdJe;Mh}R2Zk=JnctIbtnGv-vB zX{1@Ql5sPcq?4S;=p@EPud-A$*C^_lrs(@d(VyXWt>|Zr2r;}XiP+Sbj-?h`8vF9Q z;`gXTMcXR!XB_?e)(1eqz4t(id+NECWo}{H&7yw(;iE^}+&&=4 z!q`#?0)_x`lTD8WbetudpTiWK*&BV^a?(N;@K%eCxjl%TJyyfn7_T3lL(0CriL~*m zG~B}wkuC0{;Mmj}yLKmZ!7ZK*ak1eJ5c%uaDAd_|ghQ`Yk0S4HtGt`!L+f-)j`rPL zj626qb7gB=o&CJx!H&6SZ9?!`-ostKe76<)$M?W7lqi2-4`imWBhJBkgP* zX%E0x4_FOJ_-b91_7(GCZxT&O5ZBhO;Mo@UJK#Y0d{qk-Li;-$tJNUzcW6F>?*Soe zC*A4-$(1=_gr~2}(S#O$H%w`9$7XTTodG{uyqkQqkE z#55rVM#!_eOUD?|H%*9SPy;l(cEgOf{PnI3p#)XeODfxP>%GvBY)%#@o985eeTZPo ztxsrd8L;KRKBKXJ(Ae?7Rsj2o#&RzO2}xk9fPG72KhW4Yz|IHuGmQ<<%I4%!U{?Se z6{By>*Vr}5=IxEbcYUcQ^b^A7%_3|2RunDY9tvFZ*6pZ!+qi(YokAqBSD41H*oD#n>3%^STGYhKkosTxG}HejfZxO8f%lS<|DTWM zUwfEW=(Sd7v~BY0z7lNbRReMWqcZ`p-YBf5-%`o@S7r2tFWG{{^hO$Y%yd-y%{<&J z&kJJrn__>BRL@$nzOmCEBbW99T2y{?tK7|0{iR^J$i64}K@G`NXm-Eitov z8Qkh_p=*=gBa8dy0Mh%l{mfsn7Q9BS&70s2tXdCpJS;HvutfIslMPiGH()Ybj zjHsD!im0VplrGXmb%!XqzjIH3ClLAa{0UDWrl6s}iY2&;aWja;0sFqCCLU?)gRm8M z#~WKWSHhE(N1G0-Yg_Bn6S^O^vl|k?Y!IeJ*b}n;78<7-A?kdtd(a4Lxo<)IQBIxq z?$RABwz8iwF>*R%1S?}(MKO3xHQ`mU3AkSNzg0;x0sJ*`a_lrJ4ETM?G^#M;h5BPY zj%lu%W5Bm5yt!(=0T0REs)`>8saR;5xpeouUOHWoxVCa%&yB6lQ>%8zm%+o$j+{qs@d+&x2tI z64=1UU|lrXlFz-*VR)tN5H?3|2_!qAw^rVyo23%3J0Q+?Kte)36_9^@O~STa=DOZz zKbP8PzyG>N6|eStqZ9ZV+O}1G#>eP~Fdz(aiJN1j&Qq-@R8WY3@m$aJV}SXlIq!K zC+L17H{8thhWtBxaKZ`moEtUsiSKaA9X`plJq-Yp(pP zY29am`Y5h0_sE|G8<3N`k4(e-rZ35OWv5=Cv+j36rUS>Jew(SoneNS|-V5~>*3tSd zSZLJXIUYQ3;W-{f`|~f}{wRCY>?YZy#hs$1G%&~h5GxrMG~T?t1?``B=}5_IVV6ki z_yGsB#SI&khv~0oS7~vdP=r~(eqh9vripvfh#L%X5c0UNw6)*%H&1#}OTUMNEd}=q zyF8(4|EuWv9tkb(tt^b5Q$)zVy;vH3v%h8ZJSM~EUL-7S?W27?2f>_dDL74wJA=iR ztW#1e&&xUt`k00j(GY6$3^;_ww7B^IQ^}n_hLfQb&uqJc<8P-yFx)p04ceDOr@kpv zgY=>y{R5)C&={W<8f<=-;ra9+n)CIdZax5{&4v_5^Fw>K0<+p+ehcRGXA6AO(c&&8 z6=5_5^@|N>eM&X=iS9ImkLu2!WWdSnJe~^x za<$_hc^%eZkhd7O9LMB@rlVlB(~bxcS;=d#>)F=Tl*~RC|fG=bg}b3u>{`K zhMzFu+~T&1Df)r-9Z$RYE`wON7(~DAZ(v;q^DML)0Yax%TT1Om`B10**Z+lxXvTx^g3M!i_#EAz z!0S$h1b7v1$9%6YFqSKA`K@5_wVz4t`cYrOf3WQ_Hp|1&1Igwm9~c9P$>tX!{Qczj z!Dh6|%}DAkSt~@q?Dm%2=I8N_ZeLI z!%#eoDi=Sl*;81D@A`w}Mda)p;@ZUj62%=if!e+cn`#}~vvq9qouEccgQSlqYf0nN zB#kzbzRDh9eGp}B?a%xfV4FMAm?Y8;odgC4n7wGv#gqpt%qy=~USXBna=jIwb40{_ z2#scPwz%z7k0pic&?{m}Tl-?@Nj(Gom+Qz$rUzW7JYW0=HZb(XgY;#KdoEZW5d(p9 zfje}TtRq~8KANN*kluW+X@0eCo|oSINmwVZ*p9SVdXUo>o5a6ZX}ZA&omQHQd<0jT zT4T&fX?*kS@=I1dUez|dl-yF;p1Ma;=p+9rx5ra8QxHM% z(xDLE!hH~fNiA7*crM1QYm56f5qNme{5u`5--lZ1cgN%KO8Z!V$t_jk2hc%0UTara zuO4JwN8rcrCNFP|CkH)|Y({?F8pH9209LgC``7*nY|yFQVLu#Re;GLQqRC`JeHpl1 zsJHN4pX@^#!G)VUqy5(tX)s=oZOK|Frly`MihQ&8`x$iU;nL|lTyPsuc;kKSqTdhb z)ZL1y;{U|2HQKV{{JJBXW@Z)9TJh_RM5OukOwT~=*T2vY|4YB#$+l1epZR|M=1a%< z^*7LXj9?2_Hd-xF4ni~>s51ckdo&<9UqSjc}`%=y@KB@K|S4BecK) zpf=9oZFEb)S8=+~F#Y*OIuT2yJWQVpJ|vcH?bnHK-JfHDh5@@+VA}H;|0LFrxq()Q zytejMw!(Y|i*IifxZ~3m^dC(8wXfqlLwVw4wn2~h2re_vVE;pXqrvMfwEV+8T3H3z z4^YSu%)(A6Rz}2fD>Q11!EbzM#8XHc={B{sH4UKIWi! zIQ;~&NzRv9_5FaSIWn-Cq{sFnH00Rs)onG8H@s(x0TKgW{E>>xV@M;)V=GUwy{Ori ziYj+54*TJOWDPimsfJ8V4^sr5V*G;sZF-ozfW8l? z{YGkJxXQ7z*!_G?u1{9Perd&i+1j6fG>e&o*HBxuS;iiD63l0S^=C1e@J=aBqXrZ?Hfh&qRF{>jkt0ofo&TfU$tNAKW#ik zLcRUFK7xC)pJLm|UW`mLaDg#!Bn*@`9kX%k07FVyTU0J<2p}!B3C@UW}vb=oI#Dvv3?GdR_w6$0W2&pYJ?;kYwPh1i#dgs9lvfYxb;J6eZuBA#!r{f>mqh$yX`n zEpJ%1Oul+z=@07+BVrg?t(1NIVoHL91PKYv>2)KGPk&pbE6y3qSL16Oi%oNM5#PKK z&-jwHNWULm1Ksaci3KZHE?Ap@D>cGMs9m1m=Rb^dyw8WA!@itUNAPhE6HLPs=fVqh z%MmiGOiwibP{V*PcvSN{9t+C`VQ9}{=U3F>BO!<=8O;UWw_l&6}nCt3K7`~j3hS`|lMY8YbPENwGELc=ui*M?9BePIC%6Y}#+zKhI!xgFF zS%eQdanhLYIe|Y#!x;O7#FVNTAXXxbC5jVQHdJGl0h`vq2s7WQIZl?Dj)_H>K=oo7 zqsW`2__7nwWms!!{7KF45!K4~WD=rv0hfZ~hFMTx4ZXPSUEbEuLZ z!J>$IPB(mp$e%kWo^QwSL%p{M9ml_5*{TJ@#d z4aEXt`pH4@7T7NJ8-BASnifm1n%IBU(Eh9b)%+3vcugfH1%ru1aWz(}qkA8siwrwW44((7*eI5w`%DE`{4dw5lJc2R{+xub%yCsz4Q651#2j#bs z7py^*&!P zD32UGdh{Wbcj00ED=6pVrOjt3|AMmAwX6YnAvOu+8k85KyaMl?uR(bTZ_9*ks{7_e)YpFGH)jb*tZ-t+UFU7wH_8&bufIQPee2$1OS6dcR zAuI7~=z~A3?D+KT;+e6`tHO=esohQWV5RNFD6f3#=+Uw8yEP>{ew{rvE9i{0 zp+e}_0R450?-?k4x;>p_q3;0t9?*|=qJQGk9|C^cGe?i!*onT?r@sPx5b<&r`s2%Y zW++epXF!iZ9MyGdf0?vT0LKG$O`!8co!`E)$#J@g2(ht(Jcz-HPFF*ukSgD1eV5KpY;p-lDRLf?j0f&U)n?Z!?z*7-IB z5XTOlwXR6l;au+fpdaYxVZO`f-n}@sKl9s91APo0i~ppP{2%!A#h^b5`oo>%Kj6#1 z7W9j;eys1*ey!jBZqWCF-c<}e0s7xSKeto+GyV3jf}W3ciQhm@`RA~&KY(?Kf0W*p z{(hjJj&-cLll*Ia`O`q(1NwuV==Tae0o-EHXW&)v@6+{j44+Dk;b!n0!P=OU&f`RV z8+U=;fwi(vx{gakg~TDhdwU4dOL?cdP`5clQpOAmbMfiFGqr3b$Bz?UBQ(gR<5;7bpD>47gj@c)Ph zyzirX-$Q4b#~;7p&YuVK8}R8czv0dw4vy$wLKisNBfleO>axVZ-gnu%8yJtWuNg)hbC6%LDGN;L6{eZhzCmM{ zM)Fr?+I!Cd@kmg9MW&pCqMl zPaeB@cH!})z~>tJKaZj7R{!^}{{KJj7}aAF8Zq6J7nrifl&ej7ohffJ}x+yO(WsNCUoANqS-ek%jnDTy8K55DqO!>MgKQd*ouj#)j2bglK zDW{wA0#nwQaZY2tUhxs}Gts^-6Ul*hk&l4h7`rra^? z)@hLJT1tfXcoYjz4{~s!Igw?NaHty=twu%H?J`WAJ(BKs3oyU3%Qk-u2SFrvxggM>w8&S`e|M5m39OeU7_hWQF zkRAO72$uT=mZv~0XFKX)E9+$x=vM*z6?Vr$TEgMq!N)Ga^5@pD!F8JeD+e}MYF9Qc zY6s-mDoAzeHJ}6PMXFKj(Al6m1Gb0MC*TjOmqYA80}RekFGFIc`ZLr=)n2sCihm1Q zH&}reAk_UOUID=F7a%U`eiq+PflFw^=f%`-g`;@@ES0^F3d1+!?SSj3toul^GT6*@ zm9q`38G9kt4XfN|fsEY@;UT&_*uMwNP~Vk)Y=vZ{M#C0cb-+ePU5-^apm-ABRqx@+ zX3z@o&)0*)oWG%neFB5Em{qeVrWP!gDun>0`k~vl706)kuW<%}T>K(DR2=-!-U=W* z4PFg?WJe1i$O`|OQa{m9IQ#$`eW9VamBDtwfaA6O4AS%Vb!n5O-;)b~%Uk0?Sbyf!7Dh4+?&gWnbxKI%qn>Yilvsqse z`bszkRqk)W6`GqV)6cyFCWkK0|2B%SdxYb0Y4nEx;_iEFKR^0Q0LAX*P!n1heFi|n z-3#%d>cW2jD06$U&5~#UV^HqiOwqN`d;sI!3@8g-9vuXr!hM3$mKU84An88EHY=hR z1E_NUfoo`GbQy{{ZWcw?N52MOzWX?pUKQp48D^;!n-2GhvqKY3fn;^61k3ewh*}P( z+G>u3$s`C5TLHcm4V~(+$AL|Z`qN4;Ks}T7Kp}Nbi!TAfS%yon1s7W`TUo1tRGV6C z@sdMb&P>38M-T*|>GAKO?)(6k;IGJ)YAO5y{%`w2GkUgxmdSeHRW>^#{t}!0naw`- zn@NrDN{ucGbhtDGcCr6w#+rq8Q-alT}-9;k(}p>yN>U-LLK z*z8ijnbdTbC@ZiLm(cmbTELDo477rj2QEsPRtIvB(P4|1=pf6vnMg*7AT4J%VFrq3 zx>1<;ZnuC&GibC1>GCrv;m@%h!^rkMVmTiW$#4>+MI!e~A{l)tmsrkqfHOYEn1%~g=`H}7 z1Y%brtYp4MX60i^iBCc-ZcrmI9+ujVaa3vqyQ+H0g7%gyaof&=IT>m_lw_(|xJFequ373&ke01(M?I$Q$2G2g zhii^%$2C_eXvtIEaLrevaV=22abGM{C*xYAX5(6{>ToSl&A4_`cj4MyJ&bFqdJ)$i z>RnuWs!a5&mwE=*gnAv<-irS}oj$4?u6@i=E%3#AtwsI0c#cXs- z1}>xjgMif+Fx665fJLb)m|?4L$^h+z%77ZhVO9@e2!iVOz=YHfU|v{_rO5cz;KV)i zE9hg!Os59ovO6$l@r;G>w*j~=bY(2cqaNHl(UpvvToUkq_PUMY$(*s&`88012OuP~ zcaIE+%w*m9g4j3UhUl%``vaSmPZAM}utcKiuz+|5Rqpr=`7XL9AUEbBRzAZO(%k6>wW_>4z1o)SN z9>hQG-vFCs-Qa8lCX49oS-6yCcf<$Md*#@|WxtuT2MXXybSnFh0AaTf-OqkYHW6`` zr!}(Qj?l7vcL%L`N7#zP-$OsLUA@^zSQ!+a9aPTKDEsb$Q+KNDOclR@<087EN-GO@ zD+OnkZiw9%RcC8jJj}gTc1-2(hw$R?ZRlQhT;(%p`h{)ItQ_5LSGb9sxhl?{?G9al z-EN)|Gs{(|jn-<$F)EaaE)-}5<5lQ>1XiJn@&B}2p+eiBp-9t`Ds(2=6{`YnBC1sA z6BH#%B4dsU{RHj0>2~u~h%c?Xs~mcKsS2G74W+7pJA`E_vsN!wpc?Or@>$vEElv*m@oclltaC;d$(*I-B zGg*(s1LvR~9e{dv&tk-Q#5w#mNX5@NM9Q1M#qt^A5$A}Zo8){SF3C|p@)5ZgqZ)IS ztRk&GI`0EYdS0-v5i9eNVQ+JnY7=KUx1*Y03^zvix(Er)G#HlX>6jPC&_;J>v2B8M z*=fk!$(;k!V<)LxqQ;RXeeU-?TJw1kfqWj7$Q*n=i81yrcLSzo_FxqwbhWQfjM@vg z8l?}?^0xdQux%@uc(I%W+T=DsY4&I>pw$ zsW5qfnn?^DAR9Srz{U7A29bW}=Gz{jdLUHc4rPjb7!c;Xa_`3lRkKY-( zu+)xw!Cbh=n$}kabKBA)Zl!ZJf&VjPRINScPK3Wa@Py@cS zKFZ~&Toxl|+rjnGp94I}P+!4faamuivX%<-e=t2vvgpyUm|66(`Fbtz**a^^)>(75 zPNuVUYMrff=%C4=heJfR&Y_3v96D%nXc`{eQ38()EunSUI-d@je0nO$cNT%XUC6;| zjHP``cd`aeo-K8gXR|&c9C((Jbh;g9J$MH+INkHEVx3ucpg8Xw)|qt&y5(Qa`qM$w zyXRkzdY)w6ZaB>Ub-BZ=+s%&t3^SfhAx|25w6RZc7GkO9pOB25w6RZc7Gk zO9pOB2Hss~;6Y~Kp=WT9l>9I$ZzxsYjp*FoKu4BVCs+?EX7mJHmM4BXZkc#s)* zc$m`@%?h(HoFNf&$!3aK5BFL2S+Ggj-EfDrt>7al!Zl7c*(G5Y_Eo>i!`C>>;)*0;4}WNX3czK;9!A1`j&z#|dl(5jp|Hz@J&c5%P~6I7yD$=V?n>iq z+^-U5iJd*1i_lYB5_Ve>c3Tp5TM~9#5_Ve>c3Tp5TM~9#684eZvEW+D%4EVGM#7#2 zQT-%gXGAPc3Tp5TN3u}lCXEz3410J_AnB5{*OgC~phn9VYCN%cC~{sBoCDN0t}e10d-zVUMhc zwgISen6O7yMqflR$6>-AsgJ$|V7|kIJ#tl4;U2NnDwKqsqa2y=BS^NHL|ZoJqOv7n zwb;2IxP)AO6*yA9R^vG$Y`%uqeJ;;PTGA;f*5P=tQ$@mBtC6`ZGTTH3cqMk&} z3j7$l0`~z9GGUKQk4NFJKn^Y$18_-eDf~eu>5&;dM}d~ZdXNcwcxS~VLix%J#udR=WKQ_n?2<> zlbTjTSwSZ3k@JN$pB-lyXa#8=NV(xZLC#=wDDe^k*lkJJZAsW|N!V>k*lkJJZAsW|N!V>k*lkJJZAsW| zN!V>k*lkJJZAsW|N!V>k*lkJJZAsW|N!V>k*lkJJZAsW|N!V>k*lkJJZAsW|N!V>k z*lkJJZAsW|N!V>k*lkJJZAsW|N!V>k*lkJJZAsW|N!V>k*lkJJZAsYSEF|oqTq{rjP-}lf>eSpqn{vJpE zK7~BfamkpEi;g*|r3KyyP>L?V7Jh$xuX-1NTglw)SKgrQMAXF}(oooa8C$~m!``56 zBIhF-D%L~zs2;+EyNB&sHLctoi_Ly~pN7V}zeV~Ke@u^4g&yq3^O-A*!c7kuUoQ2TM>Q2_^PFA^hGAx$ZrR>EVEARkV0*Bcd+8(Y*`1fVot)CZ`Bai$malUGlQkq$Zu;1Yb00N@95w# zYvc{uQ&=P40_{dk!y3u|?cq%tTCBoHVdu>n!iveHce`D{)eC>Wlu1v-Z?T;}z%6mQ zBXc_^+zvbbIe>tjg9%)Ui=OOKOIy1RfhWl4jX6j94+B?@yyn)=9tY+w0Y>h1x%rv< zG4=JmF1J8{u-r~_3-!ddg3rT{+#+WJ+5}HVP~>*+y8-n));H&l3SSG)IDDL$JG%Q2 z;4FtvFmuP`@OB?|dcx}5lZwk3PR<_)j1|en&UfLA+;Mu+I`0!0FF?YXPc;(+=;th_ z{)r->%qgdUlSM$eQ-S%EJ2_ef?(t3@qA>TAD4SL|C1g8QC`reLn{z9oYeA`U5|lP2 zdIx|x&SeBnlQ#362vE6GqrX70)VY?Tr)53|V1+Y)lg9P2=DUT9zbH1P1B zIs+FxcCsC42&^LgBw#Y=KTQkFMpgLfIl-xS(FP|JJi^VL2#TPU9S97Aoq_cLGU!a* zvJt_6`!nEthUqgT$c2y<*b3VM50FX~bgt3$0;+ktL47H2WcW(-%$Ws-ywM?P=UfEq z^TtLP#9`+LSZ(vh2@rSsgEw!y0L9LCARupo00}1xi$&f<0m__r$#${;<<4jro;OK= z@y-*7p}ffgR5*X7fC>SU&LeCyMSv>jN>WY}V2*PW&6!qsJs9RYACWRWpP%bp>by?d zl4A7=r+@-x2vG0bLttj+P3XcJ=X16>GxsC_jm|)}IV(03z(!{P%{e=K1Gt-<2ay!! zofEqoz-H%u3YeR9C)l<+GbrGqqMre`-MNL%ySU^506U$%1TGPCb~&#hVDc`FaC@-F znMsGt%NUC}{DAWqeK22aYjw_{=!M~jQ9NM<_ds@jsN_uu8Z(kT9g>|h61c!7&;vv# zo`pbKCEINv*P)&>ojgBc?I!R9eu0`WKI<{&Spg1heD5I}CN@uT;N)zf_U)cOXmeMZKhm%_EMr5mw1Fdh-+e2P`ev5oK&GC!L#MxmaZfU{+x?gW*}c1D-1Rxt+CzJhH`#aakzL67pTd z%1nu#3wb%?l}mwpiIxRY9!kaWu7Y+PBw8{fQ8or^rxqDK42|)znky6ImBuCDJ{qSt zcvG;!jeQL_kk}8ic;nzdB^N%WQrwecev|1P_$79SFrDEsSy8@pD8fqz+PR2m+A_$B z{+0Me8sA9#^K|%ILX15CVsY;*vff0R%*a>-fswsWdc2!hUaY`2Fhze4Qv4m=p%+P$ zZqrjL)tBf@SQtN~xooIN>$Z4kL~6LsgOIE-g?unuOio^`0AIF5FNC4-J8g0CDZZ4$ zxGkCi`y&{#4+?#ePZtGgwme2#c4;Z!^tr_1W6bWu7gAY+ze^@r>!Op`+n?#SPj_xh zPo;NxJ=Ne;02?0iSyQ19+XiI8ud=z!De&r$jGhf_$xb_)F;Gl2XRy_WFaEOc9Yh2j zY!&leVGa)TO(IGnun*q_X8-Zb6c678=JZm*`94pSFaL7z@{iVD<)e%FqA@351+Vu} zF}@GXeqI=V?upcMhY!IOaaJG<2Nla3#vB!F^Bec!E5hu(fAibj2AlO574xlU4vzeN z=yS*T)-Zc_7CRQlvZWt~aoDUV-x}uNts$SC4kS&wTE@4AIiD91DCSGFoB=9$hDSC* z%h!V0ZTWmruz(~9+P>UUjCKAo5yJ74Kl(-0GTV(o2n2IrnEOn6DF z%RS&JsI?|KMGO=huikR=IT!I;rVElQJu+~8xf|)>Of%|!Vz|_fC>}~gxCZuch8lID z{#Z2zIdc2Aw=J_u0tkgq?Wq%VBV~+GJHCUqS&Kj#PLJ8!k`cb3`_w+2*`d9yBEl!| zpW5d!gq&>;YzR@$=eDf1ce)K_XW0*G@xoSrYJ16P%F5B~QR^1A)PT(Z5w^fC9 zVSeqlGq{)`!jt;`19iS>PMVP#v6pqs{{O?y~^)-E8O4 zK4;qjf}^b4Jou&cR>_MPv{UWyXqtrYfcTD?fLj^{=~TPS3{qAtfK&NA0z;I=cc`b@ z(>V?C5_N+N*{Sw9ddT){2(epJJeSVNl@Ei1H-Ufrg?fN~k)6%<_O|n}WbB6>-Rzc8 zLdNMz{Zl)(X*;@kcFc*m@M$-DglQ_8yV<8uGeSwmveZ+&)auDivun#T(A@}M;R}Br z!Xr!uTzeuneh4QS0M|ZUi(hQ@9RU1&>Z>Dkqn-Zfoz%+&!+mOm9=**QLhI43`}LC& zcqw!xls~BAlofG`O(2cUfkgF~%DBYH?CIMR+*TFrn+UE32EKnx4bi?|npL}a4Zv|a zs25A0A5*94KF_g2cjK1+lrp2dbHm_omurzX8Oc3iD`xhKN~VRg?S>7xw;7hTh9$&3 z%uA}2IS~SFL+-B(!(78qaGCY8l7++BwtYkH6NWt5YyV9&{7==J?vhD68-4$?%3_H|XHLvj}gJ(&!xRWeKdGEB>pFNUCs)q;LzIIUG>W~GraTI;#v z{Ln(ExjOi6y9X^rWWl1vYMK#ztCkPJB?|1A78^?pnVoLPH4r~p%{6?h zd_%hT7I#ec4AB#9vS-NoV#s7|h&Rzr@$JaH+6Xj@u@xGKVV;t%ctHu$M)md(t#O&J zc$HRMrpB6akQrX4CTkC9#bs(%`V1f9DaH(EULDoZ^L-;c=?lLX!XRkhl2vq74#&akT;4?$2b z&Z^aev|E;16Zz;uO_6E%vog(j7P`fs+VQE^V2a$UU_|MU!9SyrI~#`h5T4>mc*k6B z)a}r4Xz08%CdZj5Kj@*0;b^pi>ciaJU!wvK<1BLc;x1Ju*x63@W>6fz4>zFW(v9bUkaK3iz7FE(JWui(1@5-TPUU$QE#2_ z49#UA7kX!Co&(^Yq2ZY#%k|FC5K5h)A!PpOg=c7PLAy8`>oYV|+`}1(;QZg6p~>k^ zbCv$17oMT{J4MSG8V>OiXB9*jba95JK+ezV*Qp=k#Y512DFM*tKD%o&<2Oy)$uoS`WPP!=#}Xet4e2h16o z*#O1|GN24+Xf6X#5in70aOLd85*8rpA#@=XdVMFKVZ(#@TkL5D__pg z(Akj*8zA}LJVV1CduM2FMm;P23=Kam<@^+vF#q^M$>llL=y*jfO1$JW!if%#M0#gv z{)W2q1}@>x$dzg-{N5QFzKzUEKSNUjgwqq3@OWHwGpS7`sC7}G!)3xdLvt1zoySH? zJ2%q0%o&<`(6Z9c&}?F}>)GtPelw|QHI(I@p&@H8cAR0Ltx9=d2Ro?S>;XB<=uqM% zI>>TfB9c)eNXvPfFat$1y&z0HoYRXvWzc91(q;ZZj}gwZIbnv8@;zcXClSeT5~StK zB+Q7?OsAo_9e$>p(}FhfmA@7XcS*+L{kPLP&!Ct*gNX1ZJC@<>it z4%*20>XvOl${)S(49znX@j$YF+T2< z{?is7jN!AD5&B?E9DmyKt4s{L=)%z$QRW|wVZ+qX7}8QlW4MD!9gSgBq>je0UFv8I zJG(n#j>gc;auqR0W5_s0Ma0100RvR-sBo%+VN* z{2UcAM`PG-zKWQmG4%FQ6){I+xDQySBIalewXaYSb2Nrfy^8QXJN~qV&>9snM`P%t zMuk6{#%5j>w*uO%B5MHQPg^*~TUEpyjrlcbI2z-S$KfzKPqQ`wX2_qm@MsJl1jl~| zwESrckH)-1p7(JHXJMzR15RqS5N;NC{%=qUy^|s}VDnFk=t1*NiV#Yj6k$J7Cq)RQ zPKppJwlchvBDs)R=$#b#qptubMbZ@Dq)3_qoD@k@fRiF=3UE?H6!<4a*q2f(!#gRm zit4AaIw?X0sgoj%nAAy;zkoA! zQsho>rcR1bdxd{egff$sb30fZ4uQj@(4ns~yptk-W4FAMB6WDW>7Nu~W7A2T6w%%C zPKxMmc_&3kOPv%UEp<|ax>F}b2&GPnuv@8cQgd zMm@tjDe@qI_*$Sdu0Yxuzub;*C(rG;g!zXgI#Q)p3vDJ+uLH$92(cgaEFOf2>Vpu@ zB=G5%%ef=N^W#|BW&x8sIz$0hfG?MG$3~t-JsjZ6Wt>(Z5D)O>GEOTHC=T%DGEOTH zNCfzDId`G}WdXii&OKRx@&I2h=S~t}e1I>Pb0-T>5#Y<^+zJ7b0lr+$ogzS0fG?MG zPZMBHfG?MGrxmV+o$~{Hxtu#ae?5Su0lr+$O^Vek0(`lgJ41l_0ADWW&dj_Gwyg>9 z<#Mihxg6lj<=nGkXM?gaz?aLpXNQ|0ttr5l%em*oz5`%$fG?MG=Vtv7Y+D0-xtx1Z z(e0pY5Afx3?!_fP1h6x}m&>`Ah&j6ge7T%^Y2-I(vnRlp%enJ1PKMhb2=L`{?tHPW zHNcn4xeLR)A;7#`&I^^ij4>+b%jMi5*;#zK?9_wq5Z&7eVw*qn*>REib>}+R^ zFPEJ=Q4_|8JjOiB;n4OcVkBQK7u=N1dT={X6RM=W)q;gNTz5T%jq@lwY06 z$CF>jn*+=KEg$gMzXyY|f;L$4FL&C}CgTVQ`M0W)e&Efj1FutrTB10535o!Z#i*?A ztm6e3W~0h31=4{%y`P7fG~ zKTAl!2rHbkh)_Id0-;1s6^n|T2Us-PU!^Vfr{J*dm8b{o({RP#_VBDd-;!SdA8m&Q zJ;AvislUQLJ;5`}A*Eo0igL>CB^T$RVz?=?4zLE+z@nnF`##A)`2!rC89lOxgk6zasO3<9W+hnT^|p*b z5oV)!KclZi;KT#<&dgyoFKlkWX5B-9>)khSWchq#qYaUh)EFUr{;xK}! zW_s_v$*QnMDVe@K^n2=3B4iVOC3B{7K(GH=o~LV!#rjCX6GU)$tYYsa|BF74|3dyv zAC>7HTB&9Kv0!UyC5tc+_t-LNoHIef?|oe$u+HYf{xCxL9$T^zJhLvtyP;p$RE(#{ zAqVf-9wc5U7rj~FMI>aBIeM3<8B9O}HO}?hht_5@|cc6SJo6UCt ztL^DD&e^tmeJ&q=t+vl$)HvIAt`FT0BbxM?=hC$NB1Tf`XL%9JI?iioqHdkZFl2JMZISObnM(IY=XDVC3ivZAC;_xh0`gN z`H?Qwj+-f-mi|$7690ngB>qL^i~k{*Us5UYJeKtnmGKcI4y)8+J9Gi-Uji}2GpD0@!d zy1*L?>injPQ3hY3I5cn2CTLotE-{+=_?k*0aM=tM=iPYLRE^H@UGyXF(+Xhp3^j~m z&`Ra5XTon>r z`RXioh^GuBy7JXrJ+E-efV+fZuS;{RF+A|54vXVkE6@nP2Xz5mmq1q^8hyCGws}^J z3*)=8$v_Wc9EJD%LFju9_z#S$(CwRjF%JPf}DFEJXOnOGR~jc@lT+8KWos&UsjCi`F*AG0s|*&tdn{$+*b$r zRN{%ry6K1h=ny-$FR;?=wp6pIK3O~Nbug$US>#)3TA!uvlb`>Wn$*ZnG-Szx>;%9cr*wWsDUL4 zl#oz*XP@knlh1;~hF2rN8|i0dW}cGiU}|L;u|mVW7@PNO9$Sl!q5R%T>*KM&tN~(C zcAj#wGc&a%)E5f?aY|-p@4$>a!S>E3IxandCv%3YQ%fi-28((J2bN3{Gjk0(lXea) znUSZ_c|IB)O`-GC&?y-O?DLE~sw;FYC)~;2B49fApx8GZhQ!&bB;EGjK^iE=cT-A> z#le9Yc_VrwR7&9jt4EINpPiTK^y=O#N9Bg%xPA1*2*IVjj7#w-EKy)F*Xu0~;A0}V zKMc?K?(ZvhxEe(>`VF_lMKZd&)5xFvE~DY{?36DC_ypr3no?1GjktASXJR_3?8GE= z3*WwCOxa%W;ec)`))-s?KMcLN^E(sl9G4+4ZiInxqoc2P-1Hv~iFhO9^JI9zo7p)W zqrS;tO?d!sJ@jDv0>vU z!t{vYc@UQ>E`tbR?NtwyAB)kakEfJ0}?&BMbPWjWcZ@OHf)5Z2ncSi59KYjX- zlXx0n;#|gFPq=}3DzkSnBENUugx(Q)yX-`MS2vB~wK*Kc$DoK26!)U+({rcmK=^RvjeS%$;A z|8zBN^(~AO_qb6w=4OGZgwKy0b2I9ZrY$wOFloD54tk{)p##Fr}}7LW^Itaq&!T6Ys7{eVU!cg1cD!L#3CC9iMd?{+*A1*!ALLf4BjwUikY* zRLt)iC>1kZbr&x7y|_3n5a2w_+B3Yo$jhs|yv@r$d2z@R<)ws|A-DwG3-FoZTl#@a zj#6b0$aQfPA+pVN!<)mC-O=ISxFanauNr5%=diTL<+=+6G0Bav-0QmEb!Ub5xb9YW zcsSv@yWMg$#Ajbeg+Fx5$?~c@(`$Osu}#B2!=KqtcE>uI;W=*PBR8yNM&_~%hF@@1 z@LD&1%C$I(1H>G+e}fwfkHD%02rb;J!cT>N^Tum$yoR3}ea%&KZ5y7v7I$zudM~&)G9k@8s}qJS-xA%Ax3R`)YtTy>8R%4$p)H=z5o~cjs`9u-G+<06Bp-4yzIdx_#kl{li+?_+ykt+lQBBp@j|DUa!WpNGn(A) zzjCvF=DM%BS>a`FQMsG--Ef{;G*U|Es^K^jmYHyeIFU(i;X`h|_FHy?8?JZbbKRbI zx&`5pZk};qc9R?4=tkzc@z-4UPKyVtw!S#B11 zL|F7HINTlKM25TWLvMWe#v32H(btKZ=fsA)-SDM=@Fus%U2efvqp;r15JMt!?Y?<# z-o>t4?+zK^p0v^Jdxx7b$t|vT`-UgEy=mP>chqEe(nfbMC^JbJ3`&`%3`gN4-Cl%d zx}_}Y-H6k$8=a3O+>4z^4QkI=;oZ!FWDhSAr-DU+eZ=;zsOYc`iPj8W{@eDXveY>vp=m$xxQgut+yw!sZgS zHSXNi?qwU@gC-7}wz=+;JP-QuMe8`s>}%BizZm z-QMrHqpxyvcDuc5-HDLqIBW0FqdL<~Q2HJ2SQPdJZhu1l;D(*-t#036p%?GFSq*Lu z^~P)5oHN{hm0JxunNxShHMOKXy)yH~|f_J+U%O6N#t_h*li&Tgp@)~45pl51kyCMeDg z(iHI$YseG0Spe!PiFo_6xCh-qnok&pNWg7RDA_TSB&-Zp13Oz6_goSEeP7-%KV}x3Hel{A)Bc*+c~u@=BK(>2*aTv<)IM&NztG2 zK<9?couh^L242HSjlG5O-~QQXIH0?z%4a-Xf~@-y%iA@%^{Np>MNNWe@7G zu$fw&6a$lD%ayA%#RHcSF#)?Ej&#KxFNnQ#0{htctk^8w8tZ4~HeYO*6d%lNCkelw z#1^$Q_D6_AyP&;r7QVP^SloL>ya%?l{ZX-vdc7%fQ>4&GFc;Vt6rT0;{+ON$o2B+( zW*dCs7rvAI%D2Uq?}*#FV&^c3{<_$ceV;f4r}n5Am4x3#e824omd4C(rcoc{K z3Q;gI4rkNi@S6yLCi&U_uQ=Pl|9;W2I0(Z(rI1Szcryj$&6z&@qcFS~UUN&IuGnQp zHjs#ZR-GRhgq=VY2Hz6d??}sDV!rmlyrl2HFN46h_oHMioGx9Ee$W>su)XhsAYt_R z;><;HuP?TJPVA`(8F%*|74N<(d47R>Y$#A1d`Wh4)4k4F)!%Tc|4+KLNeZ zJ_ozKr80mUG6T3M&aCs$*TwE-F-*Due_y*L_FNQOR>kd^%QwY#c>K(kL79Pxdnml_ zg`I=y$5qqqh?CzIcf+(ls|baeZ}_ZmGCNNqr9-qNuM1jWh1om~vEP>$dtkUVF_P)e zy(0Q=iQQeX6?jAgTo3I|ivB5?4#H1M!1hTQ4|jeT{_5TV4t0-+N@fS#)eg!@J{OGi zq}W>%2Ym4^=rEjB7o*<(q}cC^JFbwyaUya}?0rPxz@KVYvFAz3hVHx~?nQo*ou)}W zc#*uR>}}|pc!0>cBDTWcToEU6?TWfKisV>c+cYht=fu!+6x;U` z!fRcz@1?L@w|?ShnEc%&(e1vt=c?FqU2G*T92^k)5%9a>ASvVCN$T@1h!5O-Ry;+~ zY)AH2$t`YKRw6hW9748C<2`Vn2wFd<6!xu$Ch!sDCCCv$$|GVZvn`7do&68(i#b)z z!YNJC+&B67kI(D&ZQO`la}&b8_$0$G5WMdg#qrE*o3aClrXxyYb7)J69wLMIuo~t8 zGt2-r_hka`3mXP`70>2i_Ho76gUnYjAKLxF%nsyri1w_{@RixC>_$Nb2V^J^5p`1x ze^eZJ1(S5DvRy~qN;MWHYI&yu)nI$L1ka8oz@yg2ZN7yG96-1^tCNv2x+yFN+tLrTh-vRD&aNfQM1y8la1eZDW8 zE!bn{3Z+tU%ATE>pD0hvlf6|I(Ick13Hd#T~n zI_9kIEj8`RqU~F&%|>^{wOekx;(ESQbL~ZUso8d|MW^H1@+$Q@F=H1WE0)UkL}_-R zY&ok=z2Pj@8+Cu(uC<%pRzgqClJB;ym8Mtsn{B((>|zWi!C7fFT)We9D@<@d1lr=GdF|5$3Q`Gj{5MI+pbe}tM-ah_Zm$sNF_04dZsi(*cCNRXSGJB zu2*SR>s}4>r;AO`ch`Ko<2$}9LCmtydDUHV+qSz37Fm8B{9047&Lq)ezaXTF;9oz2W z_n00AQIdj=>)TbgVNs>^Jy$HuX(b6OZE0a@iiRwf#%9JRN@wlD*fD#eICgyG#Ic8{(Ilif76^1L$P&LfKwGx3JT(GNj-2h`(-iu(Is5scWMPcGqjWONlcNG+cMB zg>WnnA+SV~WItal+h=CxrVHiy#D1mK%uSpXs8XD)+&o=Iuu%v9m*d@^#! zhnacMmbTwX9BzJMylCqg7+z1$7SHDGLSZbzajoxO)2}bB2TWIlz|5y7O3>(W%c=PF zRk$b&%bZw+@{)KA$%TdT%=~QOd?^eD@Z8MY#N&`Qf!QnS*(C{ge&O`_nVB>2E}jj8 zU2!nSm|`f)leEGNNDC9W+GtiTB{C?YJzB*1QJbYq0#<&ivS|6MHe5!`K}uI)ERa2T z(qsaCGO|}LFp(^&CL}m}=8U!<%uLIu2Flnaa@<&4w>@WtJzqq|fq04E(uqtLE?Clu z9Uqn6#WX3;Efmj<2aTi&vSSSmE#p=+hM3`dd`l!ss2J6dF^7U6d-PcBxu5ak*u-h1#*fWREx=aZkvoc=Y!%gJcTu?nnTASdPaT*X zcV?kXNiO*UW&6+$9zvO^3iry^!#odrv?Q9Q&M>W78tnU17{Y-RH0TVM{ZnAxCedI! zPYUi`B*rojF~<Nj zrDFN~%-m#1tR{A$GzE^(-9@|J zY~!v=CWUR>43N+;OZIOZE@hxK+FYEQo0&@#YbZSo1%3?K9aD%^g{i{% z-upnM1g_^K8J_eP(g>wzCUF^DeXFKe5>fgjLg7V5(xX~(Sfe)iLglo>(N<7{!t^93q6 zei2#8#8}uWdwqzuU!Bm9O+sr^7?n>IRX$Zz`BYKmQ$>|e6-Yi+Ao)~* zEdvRhVlbHv*(Tqm3q-aw{(9K|qOn~NBo%XPo9tUJZ69V$VHBR2jzTp|kk;B-k|Rzks+oUXvN%b?k<+rV6r=tsfG$#_LVGU+S zwK@o#l?=oy4da_*>SEohcfhG2OHs-MqJv&Sr8G^J(jArDR&bNzRuL&kWxzK`8mAG? zfo+W?OUCfLr9>UfgmoyQ49za$CsGfPCRG3h7??ygl4UZ->E2Lshi`CMYD&-K9iOMF zmpto=)2_-$6;+MAWj7nJhNUIS7D*U%L)L9cTd6dgm+E{gsyQI?(OCwqmr>f3x8f@ex^+gbXXYZ|WUMaa7OHEEL{A|LMH;K(3KS{k0z*6^5Z z6sWbMk(!Hf+e%2N5Hu^yrLc#gDR6B@cF4H4kJSN$nHmX?eH9mc;GwH1^!M^vdOa8k z42ewynDA81wzL8$Bq=n_MGaD6+gw5}>-kGo$FBmLXRi}Wpt3B3(hF0dRV+lSWv{Y* zXuH!Wa=AfH9TaP$3&oHmFQ%|mR~oM4K{4!! z`9||HVr^W~G|qf!+{TR+mMM^7PTOOJ+42I`ryLqgi4$5wLAc|=0xB!8D}6-j+%W1Th9Z4Yf!Wv>n+k{0xR2ko`#5gg(R;|~-Zq3oafOSW31)k)KT=SxpE7EhC z6m>~7nZ$ztOiaB>*L5Gummz_+v(mAd2$jLvaChW%*)2eZ+Fes-G+*)jHiv#lj2AlroL|&=Qh$$FJV!jn{OR~@O5U`rU zA(R9WPs$0g#mGsI7hpTyI^nmv9x7otSZp}nrG#Fi0(91pK6zCXl!(RT?^O!Prp{~+ zX?UEMQ-%4m;k#{Uq2aqNEFsD?o_nq|Tk9$%7?Q4eD2OJxiZ#64TycljhQ}UwVAyp! z>wIxog@j>ujT7&VHQepAhwEOY(XG0}i*+be4`i6!K@85lMNoP1vy)pU=M7glMC+6u zpSHUdpKCoR(GY+~#(_>PhL9`ZRI4=(l~hnn!HKK{;J}1n!jN$RN76;&0OPfrw1n*A zMCP0*rO35lK!~g+_PJcZ4miEG3tr`Naw?7b;&81}8Ak2JK0Z3ssth&iUUzM%=5>ch zj^*;X5zQ(+OEbwT!VG#hoR(eFusnUb6=EXDq0zxQmQPpg4|U!4IyIx%$k(f&0SBNm zf&zJl1w|@k!6gEdoi+A&wZNi>)o9!JC%0eQz46W6-`^btzbxJo8-FN%gmr9TM8ckMDWuJ9{;HEpDK9#E6cAc_*dVH18i$@XZ-{AM9(-) z5ZfQiokdU16FmN<@SgxqeAAy4->C3+s(Hmfqkgx7XOBrl{h9Zig2%tnKL&V`yygI> zarM_!qSv343fYZG6bA{P^3-f282?*Qh_G z;PJP&zo_8x7t!g3bmsH8r2C+v|Cn90gR3c4BuycmmU%gZ4Tc2z-ME6w)4PGg0H8*Uu1ZH z&zAs5j<;i8@t;a~Ii(-^sw?5YeoB%=Pr}mn)f9aCOfBJ$zfa=*h1^;H4fsxcn(f9j z3ZQoXo6^r_@L>@6ug35PGsID#5jnX@HAg1}|0=`#@uSlcQGYz+ z_fzmclLG%*3j9X|$M-USJgo>(yPu}u4w67?lA18y>%*;PIbhd0xTepHZhDl}@6QzVAr=|M?-=zY>G>g%tdMQ~m3g)s92& zY5RT({zg1`o;2>=1n=8M#u3>Lr{JFgob)PgcT*|&UJCsA6!@o8;IE~?|DNIfR{U2Z zzLA3e1HgA7e*L?$3!PU8@Spri+&|E}?>mA2)RhQ(tbHu6D2&cdrod+y-fzXfW%E=D zzOV4(zdG`pfD=7&{(mf`pUO6{0{CFBc&*cn-+O_+lAF~3Z>j#{-=_M56#P%8 z!08v#iO%@%7yV-j{+lWAefY3y5}jj!C(U;*1>Q*M=XX=!pH6{)F$MlkH=_C;Oy9G` z?~y84$qm=YbdgOi5mchpP1I1Rj1sGC1-FK{?NZAVLE+BaHwG8E_=bLxF45WG%j7%zNBXn3Lu9^oQeUh_+p-1K5tV%PjJ_1eG@KC|oKu09pI8Z9D;C7ti6*Z9L3opBtaEY_)`J z*=MI_P8X)|(7_pcgtc5ajR(M~UevohNedCDW*4UBi}ulQMTu9!%!Pzm5wfmBNAMyn z33rLLq6nf|_>g?CY?maEOr(6$#x$m4E!Rb;?2lzERnRmAo>&#oSvysjnlIQ#b0=~~ z+m%tO$*wsl4C66vl+;e0otij3X6I3mc#x|oVVcwG%7zvyY`$|e8T z4S=8qnm$kUu&(JhBmibeuoPraBI|Y0^?_g>fMa@CYpyKg@gzPC0I;7(G3f9>NYk0BFW}D8a5|1v(Hvt4!E@w3cw4Ilzl}f7lqUl$n9Z z?Bo(v1O&aN)p8axoC8*W64i*fjEbk34O|i)bBOdrD75lvs?%y=tOv<>F13IFAuQrm z5lKQwvQch_F0jaH$334bJa`+3pmg$EYC*x-z!Bda~Q!z z9*zic3yd%WgodZFLMxc&QHdm6<|R4XU;&rcqYbWY*YHrkR9$!h=2aS}lH6^xWx5KH zh)73IGMh_F{5VB~B_Zr6=V^V@G_-P^^%bluWAC@+epw%35x{M?ten^M-5k~ma^%6? zHXg|gK#SdaqdEkkNKoPQ#1LMtvlt!E+o0lKUH34A++#(TujnU&!Y4MawcUn84b)Mq z;afTOu{nBi&B}3H%C(!Epyb?TJXAodQOi}d)n~GW?X=qt2&ESK7#%w+bu5e2n&=Dv zay)?S4F1K+Av*tUF_D-jvfsFT%M95=woMbvF)zvGc2dL`WW2PhXjV?&3W6a z5%W8}H*P;Cgx=5JfIn4kvF<=!jyAog^^EXFxZ#b;JGjL*?H^X{_5M^C8OOM7jcmtp z7H+?$+Uxzj5p1e0N4JSs`;V*kdOsLN?`eM?*MIo-+f6?e+fivOA`q=+yKpu=P7QAerd?o>mJYdjC%fQID_N>-qno zYJXbcT~Hsw();_={Hgsu{Keb91Q_vE_iqj2gtkHc&p(|gkL3Tj{(KzZaQneQiKq8e z?+$NjdZ<~+?Niu=+v|F#-amGKxHZ+fqTBUYdtD#a`|VNm9{v4G)n4;o*ZuW=Lg|z4 zM)Oafe<9Xhug~Z`t%roSIRCyJYk%W$iLLkayJz7oK0d7z;)Aqo1BCZ^wGQ<86*>## zEzg2;-Oo30fmBwD=~dPK)t|Bbn`leAquc9ssMl3{t=MG0wCQoR9Nz+rSY+C(^{UtL zSzp@jlRNWYx7U06eptA@Uhn#@YENG%32(Zc-qSBahTH3U@2lh(uxUEwSwO!zM`P+s z)358uH&pwlHKN)N#?H5^@sGyfx;@30@J6)KruTbQdkGExe@l)3LIC0;-A;oKr?l_1 zCB|n;8dL7$?MG7DANU)IPj$-h7H|K7l=ip&R +#include +#include + +static pa_threaded_mainloop *mainloop; +static pa_context *context; + +/** + * @brief Callback function to set the volume of the default sink. + * + * This function fetches the current volume of the default sink, displays it, + * then prompts the user for a desired volume level, sets the volume, and finally + * displays the volume after the change. + * + * @param c The PulseAudio context. + * @param info Information about the current sink. + * @param eol End-of-list flag. + * @param userdata User data (unused). + */ +void set_volume_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + (void) userdata; + + if (eol > 0) { + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + // Prompt the user for the desired volume level first + int volume_percentage; + printf("Enter the desired volume (0-100): "); + scanf("%d", &volume_percentage); + + // Display the current volume percentage + int volume_percentage_before = (int)(100.0f * pa_cvolume_avg(&info->volume) / PA_VOLUME_NORM + 0.5); + printf("Volume before change: %d%%\n", volume_percentage_before); + + // Set the volume based on user input + pa_cvolume volume; + pa_cvolume_set(&volume, info->channel_map.channels, (volume_percentage * PA_VOLUME_NORM) / 100); + pa_context_set_sink_volume_by_index(c, info->index, &volume, NULL, NULL); + + // Display the volume after the change + int volume_percentage_after = (int)(100.0f * pa_cvolume_avg(&volume) / PA_VOLUME_NORM + 0.5); + printf("Volume after change: %d%%\n", volume_percentage_after); + + pa_threaded_mainloop_signal(mainloop, 0); +} + +/** + * @brief Callback function for context state changes. + * + * This function checks if the context is ready and then triggers the retrieval + * of the default sink's information. + * + * @param c The PulseAudio context. + * @param userdata User data (unused). + */ +void context_state_cb(pa_context *c, void *userdata) { + (void) c; + (void) userdata; + + if (pa_context_get_state(c) == PA_CONTEXT_READY) { + pa_operation_unref(pa_context_get_sink_info_by_name(c, "@DEFAULT_SINK@", set_volume_cb, NULL)); + } +} + +int main(void) { + // Initialize PulseAudio threaded mainloop and context + mainloop = pa_threaded_mainloop_new(); + pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "volume_changer_threaded"); + + // Set context state callback and connect the context + pa_context_set_state_callback(context, context_state_cb, NULL); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + + // Start the threaded mainloop + pa_threaded_mainloop_start(mainloop); + + // Lock the mainloop and wait for operations to complete + pa_threaded_mainloop_lock(mainloop); + pa_threaded_mainloop_wait(mainloop); + + // Cleanup and free resources + pa_context_disconnect(context); + pa_context_unref(context); + pa_threaded_mainloop_unlock(mainloop); + pa_threaded_mainloop_stop(mainloop); + pa_threaded_mainloop_free(mainloop); + return 0; +} diff --git a/v-0.04/examples/volume-change.c b/v-0.04/examples/volume-change.c new file mode 100644 index 0000000..e15f0eb --- /dev/null +++ b/v-0.04/examples/volume-change.c @@ -0,0 +1,82 @@ +/** + * @file volume_app.c + * @brief PulseAudio Volume Control Application + * + * This application provides a simple interface to interact with PulseAudio. + * It displays the current active device, its name, and the master volume. + * The user can then input a new volume value, which the application attempts + * to set. The result of the operation (success or failure) is displayed to the user. + * + * The application leverages the EasyPulse library to communicate with PulseAudio. + * + * + * @date 10-08-2023 (creation date) + */ + +#include +#include +#include "../easypulse_core.h" + +int main() { + // Initialize the pulseaudio manager + pulseaudio_manager *manager = new_manager(); + pulseaudio_manager *self = manager; + pulseaudio_device *active_device = self->active_device; + + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudioManager.\n"); + manager->destroy(self); + return 1; + } + +#if 0 + // Display the channels of the active profile + uint32_t total_channels = manager->get_active_profile_channels(active_device, active_device->index); + + printf("[DEBUG] The active device is: %s\n", active_device->code); + printf("[DEBUG] The following profiles were found:\n"); + + for (uint32_t i = 0; i < active_device->profile_count; i++) { + if (active_device->profiles[i].name) { + printf("[DEBUG] Profile name: %s\n", active_device->profiles[i].name); + } else { + printf("[DEBUG] Profile name is NULL or invalid.\n"); + } + printf("[DEBUG] This profile has %d channels.\n", active_device->profiles[i].channels); + } + + + printf("Current device: %s\n", manager->active_device->code); + + // Debug: Print the volume of individual channels of the active device + for (uint32_t channel = 0; channel < total_channels; channel++) { + printf("Channel %d volume before change: %f%%\n", + channel, + (100.0 * manager->active_device->volume.values[channel] / PA_VOLUME_NORM)); + } + + printf("Master Volume: %f%%\n", + (100.0 * pa_cvolume_avg(&manager->active_device->volume) / PA_VOLUME_NORM)); + + + // Ask the user for a new volume value + float new_volume; + printf("Enter a new volume value (0.0 - 100.0): "); + scanf("%f", &new_volume); + + // Set the new volume + manager->set_volume(manager, manager->active_device->index, new_volume); + + + // Debug: Print the volume of individual channels of the active device + for (uint32_t channel = 0; channel < total_channels; channel++) { + printf("Channel %d volume after change: %f%%\n", + channel, + (100.0 * manager->active_device->volume.values[channel] / PA_VOLUME_NORM)); + } +#endif + // Cleanup and exit + manager->destroy(self); + return 0; + +} diff --git a/v-0.04/libeasypulse_core.a b/v-0.04/libeasypulse_core.a new file mode 100644 index 0000000000000000000000000000000000000000..4f0fd2567f06ed9dd4e2f81b1585e10251aa3b35 GIT binary patch literal 39626 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 VUgrHRztaw$R2y$I@Jagr{{ae5C~yD( literal 0 HcmV?d00001 diff --git a/v-0.04/system_query.c b/v-0.04/system_query.c new file mode 100644 index 0000000..c3689e0 --- /dev/null +++ b/v-0.04/system_query.c @@ -0,0 +1,720 @@ +#include "system_query.h" +#include +#include +#include +#include +#include +#include +#include + +// Since pulseaudio uses callbacks, we need something that will allow us to share data +// between functions. +typedef struct { + pa_threaded_mainloop *mainloop; + pa_mainloop_api *mainloop_api; + pa_context *context; +} _shared_data_1; + +static _shared_data_1 shared_data_1; + +// Structure to share data between get_alsa_name and its callback. +typedef struct { + const char *alsa_name; + const char *alsa_id; +} _shared_data_2; + +static _shared_data_2 shared_data_2 = {.alsa_name = NULL}; + + +// Structure to share data between get_available_sinks its callback. +typedef struct { + pa_sink_info **sinks; // An array of pointers to pa_sink_info + uint32_t count; +} _shared_data_3; + +static _shared_data_3 shared_data_3; + + + +static void pulse_cleanup(void); +static bool is_pulse_initialized(void); +static void get_device_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata); +static void get_profile_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata); + +/** + * @brief Iterates through operations in the pulseaudio threaded loop. + * + * @param loop Pointer to the threaded loop instance. + * @param op Pointer to the pa_operation instance. + */ +static void iterate(pa_operation *op) { + //Leaves if operation is invalid. + if (!op) return; + + bool is_in_mainloop_thread = pa_threaded_mainloop_in_thread(shared_data_1.mainloop); + + // If we're not in the mainloop thread, lock it. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_lock(shared_data_1.mainloop); + } + + //Wait for the operation to complete. + //The signaling to continue is performed inside the callback operation (op). + pa_threaded_mainloop_wait(shared_data_1.mainloop); + + //Cleaning up. + pa_operation_unref(op); + + // If we locked the mainloop earlier, unlock it now. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + } + +} + +/** + * @brief Callback function to handle changes in PulseAudio context state. + * + * This function is triggered whenever the state of the PulseAudio context changes. + * It signals the mainloop to continue execution whenever the context is in a READY, FAILED, + * or TERMINATED state. + * + * @param c Pointer to the PulseAudio context. + * @param userdata Pointer to the data shared with the main function, which contains the mainloop. + */ +static void context_state_cb(pa_context *c, void *userdata) { + (void) userdata; + pa_context_state_t state = pa_context_get_state(c); + + // If the context is in a READY, FAILED, or TERMINATED state, signal the mainloop to continue. + if (state == PA_CONTEXT_READY || state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } +} + +/** + * @brief Utility function to check if PulseAudio is initialized and in a READY state. + * + * This function checks the state of the PulseAudio context and other key PulseAudio resources + * to determine if PulseAudio has been successfully initialized and is in a READY state. + * + * @return True if PulseAudio is initialized and in a READY state, false otherwise. + */ +static bool is_pulse_initialized(void) { + + + // Check if the main components of PulseAudio (mainloop, mainloop_api, and context) are initialized. + if (shared_data_1.mainloop && shared_data_1.mainloop_api && shared_data_1.context) { + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + + // If the context is in a READY state, PulseAudio is initialized. + if (state == PA_CONTEXT_READY) { + return true; + } + } + return false; +} + +bool initialize_pulse() { + shared_data_1.mainloop = pa_threaded_mainloop_new(); + if (!shared_data_1.mainloop) { + fprintf(stderr, "Failed to create mainloop.\n"); + return false; + } + + shared_data_1.mainloop_api = pa_threaded_mainloop_get_api(shared_data_1.mainloop); + if (!shared_data_1.mainloop_api) { + fprintf(stderr, "Failed to get mainloop API.\n"); + pa_threaded_mainloop_free(shared_data_1.mainloop); + return false; + } + + shared_data_1.context = pa_context_new(shared_data_1.mainloop_api, "Easypulse query API"); + if (!shared_data_1.context) { + fprintf(stderr, "Failed to create context.\n"); + pa_threaded_mainloop_free(shared_data_1.mainloop); + return false; + } + + + pa_context_set_state_callback(shared_data_1.context, context_state_cb, shared_data_1.mainloop); + + // Start the threaded mainloop + pa_threaded_mainloop_start(shared_data_1.mainloop); + + // Lock the mainloop and connect the context + pa_threaded_mainloop_lock(shared_data_1.mainloop); + if (pa_context_connect(shared_data_1.context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + pulse_cleanup(); + return false; + } + + // Wait for the context to be ready + while (true) { + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + if (state == PA_CONTEXT_READY) { + break; + } else if (state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + pulse_cleanup(); + return false; + } + pa_threaded_mainloop_wait(shared_data_1.mainloop); + } + + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + return true; +} + + +/** + * @brief Cleanup function to properly disconnect and free PulseAudio resources. + * + * This function ensures that all the PulseAudio resources are properly disconnected, + * dereferenced, and freed to avoid any resource leaks. It should be called whenever + * PulseAudio operations are done and the program wishes to terminate or release PulseAudio. + */ +static void pulse_cleanup(void) { + if (shared_data_1.context) { + // Check if the context is in a state where it can be disconnected + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + if (state == PA_CONTEXT_READY) { + pa_context_disconnect(shared_data_1.context); + } + pa_context_unref(shared_data_1.context); + shared_data_1.context = NULL; + } + if (shared_data_1.mainloop) { + pa_threaded_mainloop_free(shared_data_1.mainloop); + shared_data_1.mainloop = NULL; + } +} + +/** + * @brief Callback function used to retrieve the count of audio profiles for a specific card. + * + * This function is called by PulseAudio when querying for the list of profiles for a given card index. + * It sets the profile_count with the number of profiles available for the card. + * If there's an error or the list is exhausted, the function signals the mainloop to continue + * without further processing. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current card information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function, which contains the mainloop + * and the profile_count to be set. + */ +static void get_profile_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + uint32_t *profile_count = (uint32_t *) userdata; + + // Handle errors in retrieving profile count. + if (eol < 0) { + fprintf(stderr, "Failed to get profile count.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // If we've reached the end of the list of profiles, signal the mainloop to continue. + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Set the profile_count with the number of profiles available for the card. + *profile_count = i->n_profiles; +} + + +/** + * @brief Retrieve the count of audio profiles for a specific card. + * + * This function queries PulseAudio to get a count of all available audio profiles + * for a specified card index. If PulseAudio is not initialized, the function attempts + * to initialize it. If there's an error in fetching the profile count or initializing + * PulseAudio, it returns UINT32_MAX. + * + * @param card_index The index of the card for which to retrieve the profile count. + * @return Count of audio profiles or UINT32_MAX on error. + */ +uint32_t get_profile_count(uint32_t card_index) { + uint32_t profile_count = 0; // Initialize profile count to zero. + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "get_profiles_count(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails. + } + } + + // Query PulseAudio for the list of audio profiles for the specified card. + // The callback get_profile_count_cb will populate the profile_count variable. + count_op = pa_context_get_card_info_by_index(shared_data_1.context, card_index, get_profile_count_cb, &profile_count); + + // Wait for the PulseAudio operation to complete. + iterate(count_op); + + return profile_count; // Return the total count of profiles. +} + +/** + * @brief Callback function used to populate the list of available audio sinks. + * + * This function is called for each audio sink found by PulseAudio when querying + * for the list of sinks. The function populates the `shared_sink_data` structure + * with `pa_sink_info` for each sink. When the list is exhausted or there's an error, + * the function exits without further processing. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio sink information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function. + */ +static void get_available_sinks_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + (void) userdata; + + uint32_t *count = &shared_data_3.count; + + // Handle errors in retrieving sink information. + if (eol < 0) { + fprintf(stderr, "Failed to get sink info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // If we've reached the end of the list of sinks, mark the end and exit the callback. + if (eol > 0) { + shared_data_3.sinks[*count] = NULL; // Set the last element to NULL as sentinel + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Allocate memory for the pa_sink_info structure. + shared_data_3.sinks[*count] = malloc(sizeof(pa_sink_info)); + if (shared_data_3.sinks[*count] == NULL) { + fprintf(stderr, "Failed to allocate memory for sink info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Copy the pa_sink_info structure. + *(shared_data_3.sinks[*count]) = *i; + + // Duplicate the strings to ensure they remain valid. + if (i->name != NULL) { + shared_data_3.sinks[*count]->name = strdup(i->name); + } + if (i->description != NULL) { + shared_data_3.sinks[*count]->description = strdup(i->description); + } + + (*count)++; +} + +/** + * @brief Retrieve the list of available audio sinks for a specific card. + * + * This function queries PulseAudio to get a list of all available audio sinks + * for a specified card index. It dynamically allocates memory based on the count + * of sinks to store the list of sinks. + * If PulseAudio is not initialized, the function attempts to initialize it. + * + * @param card_index The index of the card for which to retrieve the sinks. + * @return Pointer to the first sink in the list or NULL on error. + */ +pa_sink_info **get_available_sinks(uint32_t card_index) { + pa_operation *op = NULL; + + // Using get_device_count() to obtain the number of sinks + uint32_t max_sinks = get_device_count(); + + // Allocate memory for pointers + shared_data_3.sinks = malloc((max_sinks + 1) * sizeof(pa_sink_info*)); + shared_data_3.count = 0; // Reset count + + // Check for successful memory allocation + if (!shared_data_3.sinks) { + fprintf(stderr, "Failed to allocate memory for sinks.\n"); + return NULL; + } + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_available_sinks(): failed to initialize pulseaudio.\n"); + free(shared_data_3.sinks); + shared_data_3.sinks = NULL; + return NULL; + } + } + + + // Query PulseAudio for the list of available sinks for the specified card + op = pa_context_get_sink_info_list(shared_data_1.context, get_available_sinks_cb, NULL); + + // Wait for the PulseAudio operation to complete + iterate(op); + + return shared_data_3.sinks; +} + + + +/** + * @brief Frees the dynamically allocated memory for the sink list. + * + * This function is used to free the memory allocated for the sink list + * after it's no longer needed. This ensures that there are no memory leaks. + * + * @param data Pointer to the sink list data structure. + */ +static void free_sink_list(void) { + if (shared_data_3.sinks) { + free(shared_data_3.sinks); + } +} + +/** + * @brief Callback function used to count the available audio devices (cards). + * + * This function is called for each audio device found by PulseAudio when querying + * for the list of devices. The function increments the device_count for each device. + * When the list is exhausted or there's an error, it signals the mainloop to continue. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio device information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function. + */ +static void get_device_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + (void) i; + + uint32_t *device_count = (uint32_t *) userdata; + + if (eol < 0) { + // Handle error + fprintf(stderr,"[DEBUG, get_device_count_cb()] Reached elo < 0. Signal triggered.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + if (eol > 0) { + // End of list + fprintf(stderr,"[DEBUG, get_device_count_cb()] Reached elo > 0. Signal triggered.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + ++(*device_count); +} + + + +/** + * @brief Retrieve the count of audio devices in the system. + * + * This function queries PulseAudio to get a count of all available audio devices (cards). + * If PulseAudio is not initialized, the function attempts to initialize it. If the initialization + * fails or there's an error in fetching the device count, it returns UINT32_MAX. + * + * @return Count of audio devices or UINT32_MAX on error. + */ +uint32_t get_device_count(void) { + uint32_t device_count = 0; // Initialize device count to zero. + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "get_device_count(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails. + } + } + + // Check if context is valid after initialization attempt. + if (!shared_data_1.context) { + fprintf(stderr, "Context is NULL in get_device_count.\n"); + return UINT32_MAX; + } + + //fprintf(stderr,"[get_device_count()] context is, %p\n",&shared_data_1.context); + //fprintf(stderr,"[get_device_count()] mainloop is, %p\n",&shared_data_1.mainloop); + + // Query PulseAudio for the list of audio devices (cards). + // The callback get_device_count_cb will increment the device_count for each device found. + count_op = pa_context_get_card_info_list(shared_data_1.context, get_device_count_cb, &device_count); + + // Wait for the PulseAudio operation to complete. + iterate(count_op); + + return device_count; // Return the total count of devices. +} + +/** + * @brief Retrieves the maximum number of channels for the given ALSA device name. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the maximum number of channels + * supported by the device. + * + * @param alsa_name Name of the ALSA device. + * @return Maximum number of channels supported by the device or -1 on error. + */ +int get_max_channels(const char *alsa_name) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int max_channels; + + // Open the PCM device in playback mode + if (!alsa_name || snd_pcm_open(&handle, alsa_name, SND_PCM_STREAM_PLAYBACK, 0) < 0) { + fprintf(stderr, "Unable to open PCM device: %s\n", alsa_name ? alsa_name : "NULL"); + return -1; + } + + + // Allocate a hardware parameters object + snd_pcm_hw_params_alloca(¶ms); + + // Fill it in with default values + snd_pcm_hw_params_any(handle, params); + + // Get the maximum number of channels + if (snd_pcm_hw_params_get_channels_max(params, &max_channels) < 0) { + fprintf(stderr, "Error getting max channels for device: %s\n", alsa_name); + snd_pcm_close(handle); + return -1; + } + + + + // Close the PCM device + snd_pcm_close(handle); + + return max_channels; +} + +/** + * @brief Retrieves the minimum number of channels for the given ALSA device id. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the minimum number of channels + * supported by the device. + * + * @param alsa_name Name of the ALSA device. + * @return Minimum number of channels supported by the device or -1 on error. + */ +int get_min_channels(const char *alsa_id) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int min_channels; + + // Open the PCM device in playback mode + if (!alsa_id || snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, 0) < 0) { + fprintf(stderr, "Unable to open PCM device: %s\n", alsa_id ? alsa_id : "NULL"); + return -1; + } + + + // Allocate a hardware parameters object + snd_pcm_hw_params_alloca(¶ms); + + // Fill it in with default values + snd_pcm_hw_params_any(handle, params); + + // Get the minimum number of channels + if (snd_pcm_hw_params_get_channels_min(params, &min_channels) < 0) { + fprintf(stderr, "Error getting min channels for device: %s\n", alsa_id); + snd_pcm_close(handle); + return -1; + } + + // Close the PCM device + snd_pcm_close(handle); + + return min_channels; +} + +static void free_alsa_name(void) { + if (shared_data_2.alsa_name) { + free((char*)shared_data_2.alsa_name); + shared_data_2.alsa_name = NULL; + } +} + + +/** + * @brief Callback function to retrieve the ALSA name from the card info. + * + * This callback checks for the "alsa.card_name" property in the card's + * proplist. If the property is found, it assigns the property's value + * to the shared data structure for further use. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the card info structure. + * @param eol Flag indicating end of list. + * @param userdata User-defined data pointer (unused in this callback). + */ +static void get_alsa_name_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + + if (eol) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + const char *target_sink_name = userdata; + if (target_sink_name && strcmp(target_sink_name, i->name) != 0) { + return; // Skip this sink, as it does not match the specified name + } + + const char *alsa_name = pa_proplist_gets(i->proplist, "alsa.card_name"); + if (alsa_name) { + shared_data_2.alsa_name = strdup(alsa_name); + if (!shared_data_2.alsa_name) { + fprintf(stderr, "Failed to allocate memory for ALSA name.\n"); + } + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } +} + + + +/** + * @brief Retrieves the ALSA name of the first audio device encountered. + * + * This function initializes PulseAudio (if not already initialized), then + * queries PulseAudio for the list of audio devices. It waits for the + * retrieval operation to complete and then returns the ALSA name + * of the first device it finds with the "alsa.card_name" property. + * + * @return ALSA name of the device or NULL if not found or on error. + */ +const char* get_alsa_name(const char *sink_name) { + pa_operation *name_op; + + shared_data_2.alsa_name = NULL; // Ensure alsa_name is initialized to NULL + + + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "get_alsa_name(): PulseAudio initialization failed.\n"); + return NULL; + } + + name_op = pa_context_get_sink_info_list(shared_data_1.context, get_alsa_name_cb, (void*)sink_name); + iterate(name_op); + + return shared_data_2.alsa_name; +} + +/** + * @brief Callback function to retrieve the ALSA device string based on the PulseAudio sink information. + * + * This function is called for each available PulseAudio sink. It checks if the sink's name matches the + * target sink name provided in the userdata. If a match is found, it retrieves the "alsa.card" and + * "alsa.device" properties from the sink's proplist, constructs the ALSA device string in the format + * "hw:,", and stores it in shared data for later retrieval. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the sink information structure. + * @param eol End of list flag. If non-zero, indicates the end of the sink list. + * @param userdata User-defined data pointer. In this case, it points to the target sink name string. + */ +#include // Include this for the isdigit() function + +static void get_alsa_id_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; // Unused parameter + + // Check for end of list + if (eol) { + // Signal the main loop to unblock the iterate function + fprintf(stderr,"[DEBUG, get_alsa_id_cb()] End of function reached.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + free(userdata); + return; + } + + // Retrieve the target sink name from userdata + const char *target_sink_name = userdata; + + // If a target sink name is provided, check if it matches the current sink's name + if (target_sink_name && strcmp(target_sink_name, i->name) != 0) { + return; // Skip this sink, as it does not match the specified name + } + + // Attempt to retrieve the "alsa.card" and "alsa.device" properties + const char *alsa_card = pa_proplist_gets(i->proplist, "alsa.card"); + const char *alsa_device = pa_proplist_gets(i->proplist, "alsa.device"); + + fprintf(stderr, "[DEBUG, get_alsa_id_cb()], alsa.card is %s\n", alsa_card); + fprintf(stderr, "[DEBUG, get_alsa_id_cb()], alsa.device is %s\n", alsa_device); + + // Check if both properties are available and alsa.device is a digit + if (alsa_card && alsa_device && isdigit((unsigned char)alsa_device[0])) { + // Construct the ALSA device string + char alsa_device_string[128]; + snprintf(alsa_device_string, sizeof(alsa_device_string), "hw:%s,%s", alsa_card, alsa_device); + + // Store the ALSA device string in shared data + shared_data_2.alsa_id = strdup(alsa_device_string); + if (!shared_data_2.alsa_id) { + fprintf(stderr, "Failed to allocate memory for ALSA device id.\n"); + } + } else { + fprintf(stderr, "ALSA properties not found or invalid for sink.\n"); + } + + fprintf(stderr, "[DEBUG, get_alsa_id_cb()] alsa ID is %s\n", shared_data_2.alsa_id); + + // Signal the main loop to unblock the iterate function + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + + +/** + * @brief Retrieves the ALSA device string for a given PulseAudio sink name. + * + * This function initializes PulseAudio (if not already initialized), then queries PulseAudio for the + * information of a specific sink by its name. It waits for the retrieval operation to complete and then + * returns the constructed ALSA device string based on the "alsa.card" and "alsa.device" properties of + * the sink. + * + * @param sink_name The name of the PulseAudio sink. + * @return ALSA device string in the format "hw:," or NULL if not found or on error. + */ +const char* get_alsa_id(const char *sink_name) { + pa_operation *op; + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_alsa_id(): PulseAudio initialization failed.\n"); + return NULL; + } + } + + // Make a copy of the sink name to ensure it remains valid + char *sink_name_copy = strdup(sink_name); + if (!sink_name_copy) { + fprintf(stderr, "get_alsa_id(): Failed to allocate memory for sink name.\n"); + return NULL; + } + + // Query PulseAudio for the information of the specified sink + fprintf(stderr,"[DEBUG, get_alsa_id()] sink name is: %s\n", sink_name_copy); + op = pa_context_get_sink_info_by_name(shared_data_1.context, sink_name_copy, get_alsa_id_cb, sink_name_copy); + + // Wait for the PulseAudio operation to complete + iterate(op); + + // Return the ALSA device string retrieved by the callback function + return shared_data_2.alsa_id; +} + + diff --git a/v-0.04/system_query.h b/v-0.04/system_query.h new file mode 100644 index 0000000..1094c37 --- /dev/null +++ b/v-0.04/system_query.h @@ -0,0 +1,20 @@ +//Header definition files to query about sound card properties (number of sinks, profiles...) +#ifndef SYSTEM_QUERY_H +#define SYSTEM_QUERY_H + +#include +#include +#include +#include + + + +uint32_t get_device_count(void); //Gets the number of devices in the system. +uint32_t get_profile_count(uint32_t card_index); //Gets the number of profiles for a given soundcard. +pa_sink_info **get_available_sinks(uint32_t card_index); //Gets the total available sinks for this system. +const char* get_alsa_name(const char *sink_name); //Gets the corresponding alsa name of a pulseaudio card. +int get_max_channels(const char *alsa_id); //Gets the maximum channels an ALSA card supports. +int get_min_channels(const char *alsa_id); //Gets the maximum channels an ALSA card supports. +const char* get_alsa_id(const char *sink_name); //Gets the alsa id based on the pulseaudio channel name. + +#endif From 0fd9f6e115fe7565a4a30192784be753ccf418cc Mon Sep 17 00:00:00 2001 From: NMagic Date: Tue, 31 Oct 2023 21:09:30 -0300 Subject: [PATCH 06/20] New version . --- v-0.04/examples/alsa-mapper_pulseaudio-api | Bin 73864 -> 74032 bytes v-0.04/examples/change-speaker-mode | Bin 70144 -> 70312 bytes .../examples/get-card-profiles-pulseaudio_api | Bin 71216 -> 71384 bytes v-0.04/examples/switch-sink | Bin 70656 -> 70816 bytes v-0.04/examples/switch-sink-pulseaudio | Bin 72880 -> 73048 bytes v-0.04/examples/volume-change | Bin 70192 -> 70344 bytes v-0.04/examples/volume-change-pulseaudio | Bin 72856 -> 73016 bytes v-0.04/system_query.c | 56 ++++++++++-------- 8 files changed, 31 insertions(+), 25 deletions(-) diff --git a/v-0.04/examples/alsa-mapper_pulseaudio-api b/v-0.04/examples/alsa-mapper_pulseaudio-api index 303795927e1b86bc04ad6abba490730263529324..c4324a415ff16b6f4ea3f5aa8116a6731866a03a 100755 GIT binary patch delta 11255 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 diff --git a/v-0.04/examples/change-speaker-mode b/v-0.04/examples/change-speaker-mode index 1417c3b0af36b17c43348cc91d1e8ec68586c297..f6608eea47c6655878e85b45be75ff2ba201cdf4 100755 GIT binary patch delta 13556 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 delta 13171 zcmb_@d0laZzQ-OqK$bu*Tq;?yrVaTUEBY=8N8;FLqa%7rTono)vmCQe|&O ziV|)&FHpHUjWV&4XM|`>;{sPr7>^Z=d~ekGDXQWfDmEz(`!wqoh+E1tG0QqDuXt1X z%)0U~Q+v$KXBRy5MCA-oYsiQnh{hcM0?7zf0$37ZgTyz6WKk9pC;|gE@yjA7z-BBC zU@S@0E777cz`@rE9$*uR#$9}-tlcy^_)}El4U#Vl%;ukomjZi>R%0BWLfGb@I9@JQ zR*0OSnLJI_Yo&T)P$SxQ0u5wlG!+m_?A{D0z^vM`=GImTSh*5Rqvss7t(%~&S zJWq$W>hQigyip5?`ZGv}vobL7&oI6iwmT)51So_nvZg-FI^3Yc<8(Mi-d_@RxHgzl zmZ8I)ay@HJvULJ-?ko8^9CPC@1v)&`k22=a;bA&_ybcdnaq2%~Q*;8X7Jn(#;Sqk6 zvAH@tQiqr6aI+3yp~EdYd|jF9Uk-JYPOwqeAXu@bYN$FM{9;?&ep~G!De3uU= z|8Y7&olgKPUWf11;hl7NqYm$^!;k6kE;_tfhj#_8^`Eg8oghKipjC(4b+}uHC+hGv z9o|ic-_+qrcX0UEwg)XZ?I@7qU>&Y)ZHb$8cF`7yp02|)Bo6=NI727M z)-}k~;rTjTJCLNbK!^9x={t0IPaQs9hiCc69|}`+g5J6Yr8+!YhtJjFIXb*dhxgIp zD|C3ShTlhYolekC*I=U#@2|tFb$GrG->Sn0G?bUF4&9s>?i`1Nu%U5@;%#=UKN@^Q z>U;a10PIcu2+v4+0cyn0C7Gwyi;{Ync*=^NX36g-p0c5*QSy6;r!45Hll&XRQ}*-h zko?QUQ`U2OswJ?E0Lpfrb&}sqJk7nQO!AwEr-Q*$D)~PVPub2hUh=Dmr!40wko;oe zDZ6>HCI1NVl+`?ml7E1BBr_-Tm?bck0Lo$>Ci#iPM-t!m-vCleh&L18D*55WTZnI# z{6OLFwYLjClPO@9qy@?KqmqyJ9*YgK8kqCN}e*whZ0Z8 z$WtnLg?LIrp7D~ubvJlQKAr-}w-ZlE$CEAjpNOYq<4KhKIpVw03ip^L@FfA1Ts%zj zr-`={-}W1gzzO0LiEowsVd5!?c$y`@pLj|ho<_;Jyu*w?yOuGEkaVd_Sg-OEzOf^rj0on7*Hf;Czk<m-9>FQ05js zS=`%wzBS}7RhO2KPxpdo>3)xO$0$`otJx>nDGGax<^`gv#|(vE6PJ6`bY51(*oMZX z@rZw`)~kP9^?I9(_Z5j3dL|VWW3^(mXAwb<&t1a+R20=Y)~~5!OUGfZ+D58=5_Nt? zYT6H7_j)Uh*GF#dWer{~t)3Yvy7sy_s5p5M;a0TcuxyXl$O5+J=UeD1YqPH-@gh7s+ghzj=oQQ- zi4haBvm#Q_YjjjD9CuwqRrXBIYsKZ99Lqwak~xtX$J!%joM?|U8|R4LeGW!=k%0XA z!^MC4EahWFdG4D$QFP7grbJv41$ntVzF|q;Xl^wPRs*6w`rH5>T zZb_Xcw}QUyg&y-bRP!DZR9PFOzRU&VE=Wf$B&al=B7$v0jy6amhxXIC<8$dhbQ~3*(C{a!E$`D>zC`XTjU^hp`MhLD zgB6yv=!_-M-q5(RGgRVzEui9F2rts%#n})=^xHf*$@wK-{m8=uq(GTnRY-%v2byR( zyj`rT2C`d2`a*dx#)cg~G6}iWvHp@7(!Y=t6JChA&@@k?ZAH=T^=obiER6)dTEqXK zuAlk+H2yj25z-7;D$pEG5?Jemx=(8;b+pNt+*f=)I4AWe-eze|>Ak==)b3cqkTz8N zr}9LvA)S<8RgQ`x_xd#- zv6VEtYb9`KKix8XE^k>?m+cf>rLht!2O*YW+zre_*Fv(ewjZXrmMq}RsALt5jzg^m z2XA&XkvjExoW5<;dGY?xP-RZ8I5sp%8J;UH4egS86o)DGS$|TMY60Y{0i5b1dJVHF z?mlAFuwlw;eMIB1IPsTZc4Z+|AMRs>i6*0gPG!~WFF1N=`O>!ANOjoPpCI>$`wIFx zhia01H1c)553X-C+I!B)uCJCVP449Hu7e4p05UTt2YZ*HRIa9?z@l2wgIp8T|MthEk%hGL+F>l>CO zB4@ZY|3i{sSi8g3Dosm2tjjc4Kcn~R%FBjkb#JkD_$*~ff`}LqTax;%+{wdmz_zd@ zf$-gOF$kBFt5L9BY5IE>IX?{G5&;z-Ix0SuqwT(phSI3#2m*6geJcu!1~~!BQ>&=W zKPF?pp>dkjMr%^L=sfZrK}Btjs!8WH=*O>R95jdF83lh{U>68+b>U09xmv)-m zMqdDO#9+F~-EM=g%A)gVee)qlkC;@txh^rfD@D!7R9}xjRz3Z%9&fkE9?$6I>+y30 z=z6>p#&tdJ`weL>KtF*J$uer&V+y_0m!Dx^j6~-TM_@jH@ z5y3)DMtwciJLH#P(q5DM2DQQpg~~zsA%+6|1Hg;C+J6uvIx5zPq#&ByPrVM>DqJe>?}zs5&A*_T_sDf%{1a6CgIgrA4fKjk5sdm$Jn!hQjQvu4 z>genoBOA(ro&5zVY$zqY$_)jQ_{P8Y9krpV+FU6&?m*UdRBn-ts!W}v+MT6zj&yNC zs!Fm+l_^!HL>~j(2fh%CitWnn7ExVX&`2X-XkqdI!i0ah+x(pWgL-N&6nnNQ%$M#i?-jB&kw* ztTH{?p<5>rJ2ZCsG%A<2IVw(J|82cZ4x8LRot2LL$Jz%!%LbKbaQq0n8kumbVdv;+ z0S&EIGv71*x-sDHNn^%{PLq>)sCaU6kAP4_Ck{;RDSnw8BNp7#ts(8+;fix`lh<2| zjsElrulEVi4JWrIQQNH{SNda&~zNHmq1s7h8r1M_;0ia zy#zW2bSbVk^NrIO%feOdX#gD8+&a)GT;H2P^FZ4`&w-k;Sx$Pq-fYn1i(c<|(AAf` z-ZIc#pw*zyTt<7)B+N@Q=-xJQcxqZ#cHHYt!_c#lK}dXzrQjbfj%@2cVMZA5Pv-kX z=KXelP88p7SMEI_9=Sh(Zx9uLJ`=A){F(R|^%LSUp6$Xk&8`gnSY%C0;5B0GG&}c* z1%Mv>L_7oNu-FZ#QG5)j;I#M|P_-~kx8s+&UelBDi`xX$+eP_wd$)VA-pVk+tT4j- zq%y)3X!s)!4+>`VN^>3)w^P(ZcY`5;f8^e zSR?;0c`%lSL7bUs=Vozjrd>JvgNQ9n;3cAOsabZ^WO{40((?7zUNS(R|G2fp|;aPJ6|9MF3jQ^#XQveii(BV=0&O;Gbc-{ zIKI#xRVSC6`jMaDmPm1H;ZUA01}w7kgW|qL)v#2r#O^8E!6`q;va4L|DbES<|Bea; zTPIu@@M~Ns<`Dl!*^?p(6EW0Y6R*ITs)~ySsNxa}iN%A9JMno9YZu2F_^yU6OCRKX zbHlI8CK&iUF?!WtzNca1ssW*VmpJ^yyvSX6*ENT8%a0*2VcaYRZn(_PHe@{cI)}pP zr%Lh6-MA3Xmp7h`+>94`^E4&m3b`}x5>HheQ?aM~Si_7>ZmVK@?%Fycs$A`Uzscd4;KMxhdJj>% zbqenxu5C?9%EPUb%1V{6ppkgzY~fw9afLV3)H$Q>5d&UG;M2vF7bf%N;_VlvAfn)H z(|L%Pvn`#^7SC)e#lHTpZRtvThKSofjz^2R+tc}zqI&x@d{Vr;eK5}u-D}750I|Au zD&Hi|)+UE{!?^Ngrjc;6MHpYq##hIFFXr<-V$qB9mG;i!n-}9k?@U{R_r>j;TgCRj ze1Sh8Sh}Mao%~?O)ZQr;Tv?6t5c$J~N3j#FH^T6dUwH&5Q;K1mE6)H?tiJ(SYi)46 zG(zEa@$_G3;ra7lr{Otzr{LCx?{+@GVR`tgo8jfmt1t6ZvEsD{Fs)y`_DBC3aA|8` z(k`q4G2-<%B4cB*6B5mxl{pw$O!)2BCq~9*;>{t^oTi*nvFUG=M#d)MHFmtYzp~XN z^*(yzSl3uPVk$M?uPnmZYxFIh>og0nRR8AR`GtnLZ{;b@)c3J(aw6c|`g{b{17Ag2 zj44R|H|ploc$j8l%3^k7NP`N|JZ5$nOeU}FAgaHCCV8P&J( z_!Q`xeuS>UhFW4=_;iqfdTd>8>WsSR{C2W)F+6g!Aq%3&M^TTmJ%DP6p{<B)!Dn+_Fx^x*2;!Kv@l6sK3LcwalS4! z?;&`J30353rftD9X#~P<6P#|4a4Esb^vJ-2g?%Q5)Y}!?OJYX7o!i9P`n1?I7Ip)j zi{YxFE2MlSS~Sgy~*<@AQtV@=2HP$EcY1;I27ENlP*HZN4&{8=pDV|TvobHlox#IQu1 zY4iiOw_rNrwCvplAF7T`6|F$RnBiMg!;EleF>mL$#li!B@7#LykcFS6GvK6cbHKZ83$z*j1Gkjg)JDH|q1wW@mP$Y($R$R$CorXBf z##m=kb+UN+q&`_4i^Zd;EgF!2D!g_KH04-KR?@Yx2*RD1-K#`vqrnm`VgKeTPZz0e zeozV8Hli)MpR07I?qd|u`&^}vdau-smz~d59MpNGW{m86uJQ+3hl;bNKz4nQ+BFPv z5T(fiA3K+2{u#VonW;JL<#!r?1e*ze&P8T}Myjy90;0-m^Rb4bD9JJ2UcSr zxZlL%w6=fqw;dvs_eMB}V6w1=nSq*T{swLZzh0m!CHZyZABWLmZl)vU!Y~!KP_9DZ zwXdU9R22d*=DoBiXoHl$-dt=gfto3rxJLjrJO`w+fr4hVqIHGKB9;~*n@SAxb zX1YAcnzOV;*=3&Cx;KvF4<7f%r1?fCxihr(Ow=07HyIe zYy>oYplV&d5lOvlk-0B1c?M+sVH2r@X(|)_ajXK`t-qMR&z_n5T`Xghjto#`+7^bl z51@ijC;9eIl6Yrd3NI30>`Ud@4c>iE1@_8dhKMf6jj_?(5D^wOFl>-qP=`2JkY6$vhg2CC# z5FR{bzcKhHqm3y6e2FoJNN}|=WHeO*m*A<)!6RUa(Ht0j)oA>y#HSFh%okd@7 zWP|C_38QEY4iH~o>6=}yE(97%D*fpfIBL6cqp<#@$) zYmwtRAj>U0DTWmKV2H9tB`idX{3Vfd)rR-9;;Y$?4xKK63YqlXb#eceg>pIJzALN` zpQD*95{ItZ;ydo8g_<->T!FOXzOK=v&7#{cHYcSiD!wd5A5N$f9kb*|8s0I}wrY6C zv+2JyyyHO$^SIfW@U{Fe27YWNZiKU+Sdc0G(~i~HjZBq z<=1R@>8-fdo8Kq)UF)6s4Xq`VH&w#ELwhqWQ+3+tYcTsk915_7p1^iYgmg!_=yQDr zwrb7wXBB*1NV+j9#DDgQ@*DRm)g|J@jgiq2Y^b)Ld`T=%T)APJH5T7m=uf*l9%wT( zyfR01JQLwinWy0!>8Du~`Rxj{T*L25l`y*-LrUc_@)G|E!X+=hKgmy1h3plQ@?-MZ zDmDK@b`;!05;YZ#a8dZHExrrvSdi5^4oU_|@qvh*^W}4m)PGL%yS%$<27i<;%gZD! zewVCa!8U3`9IW{|2Aqa|M~9(5Bk_2ay;xJ!$d}TiS9+u*Og-&*!AZun+j9DA(wLrV z(;eEVjsb2)Bpv%Tg<9bc_UZYIe7-85pUdYZ`80_M|FOkqA$aopPL^u9OpC2VO6O@( z|20yRE+;8}QR*DhbUGfHr-kLVjsGk)<3!3;*!hbd5`;J&$;u>z^qm=K1U7HB^Ws37tT!&4(U&wgM z`zYgGJc8%*1+IY+d>F_omFy?7$aM?E_r=kdJNCMYBheGzdfef9Jd)=JYpb))btn=o z>s;Ina?(`@5^}$`L>Ia$%)EcdaqX^l!*!h4#=~kPCtM*Gu$xY)>?T(+SRUhg+yYCT fT!%nH99L8!#y$$V?%OK+fU6iRFL6B{#nb->D-==g diff --git a/v-0.04/examples/get-card-profiles-pulseaudio_api b/v-0.04/examples/get-card-profiles-pulseaudio_api index e14e739fde1f0c3f1e23456b8c959f3f4838e978..ff233444835c91520408a01d456b08be08c4c308 100755 GIT binary patch delta 11676 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 F{||>AIzs>e delta 11114 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 I3}W&B2L(F6cmMzZ diff --git a/v-0.04/examples/switch-sink-pulseaudio b/v-0.04/examples/switch-sink-pulseaudio index d95827b79255b35480b4344a4c8c6986c0c2772b..0d290fe7a8ec9efcef0cdb1a37b984cea66fc63b 100755 GIT binary patch delta 11666 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 RcG6aYq1+m5`%5HC`X6n*JM#bl delta 11128 zcmb_id0dp$`hU+myuh%|0K)(x!@j9(?ji~(HLj`Ul8SCFrjyILX=dXq*9I@z?K zVwo+Ln$u0h7HknUP29IzX=#F5x!k;()%?ECd)^tz`}_U(JAQbdbDsTq&U2Rcbxt&S zY}xKn8x~X>C#fx00I4LnE_H)GIaCaj>rSTo6m}DX!frf>rRf(M#Bd=W!qW8y4>4-s zmFz!8zX!$04SBWf3|VcRHtg{CzkFq0P!cdVA$e5%>5}feUY8u+AKVOoo+L#b4=I*# zIs6-49BkN}p;-RD9L$?NtZXS~9%de`yv3%fy_<@aJxx8fR~?sl zX0Y|@_y|e!R?jegMhRmRIP*$pr7C5i%30)PWr^z8p+4(X>=mzOwn`lv)bSbbTJ||F z)u+eIfgeFqfRvUTS zsf#uao;^De3|>-C4e>$Ui^#X9G*BBah?uRHBv~5Diw)+?rSYUxk{Zhe^cFzMaN#Te zif`m^8wRm-{u5+-X}ko^REPmhZEw+4pUs*)j7vF=p2prDEQ3F4dXDwsf0*uf{9bfI zzcsp6#~b2eh6YcTq<_y$3$!d#MXfbCw+bc6TBBSe(D!DU$!b$>OhSKobD7?GCeX5! z7(dq_`1h#%JwM~V@saFHo*W;QS_71{p!-;BRn8L-m8{k0%lxgjoSDEoO|yV%o9=Wv zcPTS?Nqk}Cyr2*}kS|FGC^q1%)yJT_A2XS89K(E6k{ zye_D7wBZYUQPKrJzhrlqMm{Gwj+OJ;Xk!}-hI9ti#JenE-q zK=F;^y0oFJf{#p_!gBe0Y0pO-9V1E0n-_$``xb><)5E`Tnd7 z(}9tK(ys&MNgmWaEnuaEDB9}(#WAw`R3_^zd~=Ts<55h`%)sQ`*8->Py%uOt_VX(} zJ_(rFxr0C@|ET8zX5(4CHsYB2wpR=r@qF(dY=Wa_?_rD$=aqee*;{;7pJD7WKZ|}X z|FusmjRvzg5y_e+(1t`w;H+Pu&6?|PYy%GcWX#t-Vk`IJxTpWySdhGge>P5*56 z0N>L;DxoJKk;dN0L#Ed6f_^uxkMt@r+%G3<`nQ9@X;Y39KsnJ)_9XR@t4u{e#aRhJE*{+SQwFn@XIU!y)!AAwX= z7yMpT{=3J5K;Tbl_^qNEzUrxsf1nt!4PZzOoa=}JZ4v0N(zwbgv=-$lZXcKxuTzmb zn^3>*jqAP;Vb(6xXYii}c48r1pZm8i59SeRXA>Rmu6^#yV8Q+q&i@s8acmubH?MQN4s`M#r=r{cmLS4m8>76~ z6oi`>#_r{w`MI)ZF0afF<3;%vwx2J}pOrOZpd_^@)9|DQ?)%Yot)7+vLU{s6uH@|C z5rcYGlxvhe9Vjmwg<0bn)$A#irKN4&x9aSWE^4CEdcxAnz%&sGJ6o=Le^3wXr@jHd z>%2!46L7kL+Xil}u560`5>k#bpyHXwPY>$FcJR@IgS(nFAMX236>7`rkiCs?yk@ z%+@!W)Cjj!1~`A=0}7_eWl{V4-8$*yRCHucOXxblgbTV!zMDN4rJD^z6K z)oBl8F}z}}8H-Dxx;G_)3x3ed3?rMiu_rJwy93EQO^h(A>R0u&v^@Y@A{CehQjNVS z4>%hxmbS4sXIQ(0B;Xn&l__m|Pw~YC@mk13{e-Fi3Rxy&HviQ)zeLEl1E_Z=dyR}itB|r5cy~P0PVr}k zBv&ki$nxgE>)NBZ!CLksdgz-~_QbW|^C>aCP?oRwg4CwDz1%(grOTRla$>Np=ithZc$ zoYxNPRN?R=W$F@He~cKG7ZIOrd9Dgv`G4^aTe)DHrP7t}dQk+cRG}LGN|o(SZDmp* zHl;~0sUkK0D?2dJduN;9ah@^UB4;1tqlXt%&s_1#ty)ddSM^ovvO~K7v)XM-7(ONfxu5sNp zk1{)W)S|iF0z;}y`>UX$*wu|_v^oda;Ht{6Nb2_dOAirxA1Y#3SUWT&RW2o$Cc@m8 z#7Y}xjsGc?;m&+Tz;|%y$RTx0U2w%(eGu#KC3=%Y@uVCfsJ*UY{3%`HZOTQc-1GVM zz^LD>j)z9R${Z!32DWunl&8nYvBQV+{Bd#2hi@9!#lr{Q@$=)l8hoVUIrEFtrWenf zF?DY7qYv@A2NE13$LGrxAuUelyIA$h_Bx#}0G5B{bRGdbz0c{q2^hQI=?s%4>EW-P z&i;VE15O4U+Uj&J2HXx<5BSYNr?VOGI^Y?=>_bi`KF~;S0!9Ny9CkW$0iOpf0_=*= zmg=wxY(x?ofY<}r3^*I>=M3OUKzsp`#$k;`1Lk7K9Spb@NBRuF7@UI30PDVUI@bd} zf5z$j0x$;`m2-f<;lAXdNYX;w)8YY}0S5yH;X*zG&R2zF@jKsMAq+r&@Vr%9oE#=54% zzSLI!Gf?Zff1yRz9pY()Q8Gv)3!_*if3(oT4)PjM(vI>?g|Y14{9vIaraO}U6nU8! zVEBhT$lp^g_w&M6uSlT$FgdHZaf*eV=b3o!;-jZnVn*W<@G zn_`iNe+w@olzl*y@q-ZFz^~%@BsWgAu#-GsW&2uTX`W5%7tgxmJ zqgKvVjT>P60)?y`=DSzIxZ}f`w;33Uo-4w0=W}!M%&0vUco?tbhRJfkRdPpZ=cc;d z0{65V=eS&VA4DDf`Eb6t_nRrV>6pP|NHjKlU;GA_6;L(fg3h_1n-|Ld_eLnKFB2;SmYe~$(-*{~lJHl_E ze=m=EeX{IK<%?g>Mt&M!ABC4Z{rZV)7@x5|&TkrKl|Al17)Hi%zCMF_^Dox-Ve|PP z>*vH@Ln0N4dEbluD|HcWIh~KAn8V@Vonmp+yzweSK2qL1$wImAtsyL)k9cchdb}Pp zuFMAS!@Buc;HDoTS|JxuHOpl zLZ83=VO)g+bY{?{ffV=w`a$Mt=<0O_t=OUsrZ-6J99at$nevDxA+tL0mOL|Q6sD^p z6I^qo5Ec*{5qAFt^jDil`5kP4uCak(f zd}A?fVGVKs@hl`XGK8A*eF8BW<_Z_qaHYx8f3wSu)R|$u1{`g6Bh0T5;*c8oc^6jX ztwx5<^Sr1jbST3rVpOtHX9t#jKvN_k)X+*PKH=sK2n4+APw3u6--lyT_!>47ju~a< zIg~dyh58n|)g|$>O(AoZyT)ubOi1Rbg5bB!HEvzvwG{M~uJMT_F@GCImOC6mYfzal$N}UD?4MbJ z&EXK}zSuN7S<$JG!f(U-aUvJpwGdt)9cZk6I2hGjjFXeJTzEYUqvPdZEgMo)H`wSd zk05nuKMDZZX2>G^?s6)HFIUt}K=j?^Jc?ef8>I%{UA9v2a@}w>_U`ii6uVrPtA?H} zLPL_hX#2}`4QELy-(hT#qcx-5+(yGa;2r+wnY8Y{N1)XkB7LD?^?k5>f@t@Y|8eHlUj%(8*d6`#P_dEu+<@w*2Mhh}0zm%>5WO1kc$Wnbhg>(=s~*w3 z$F%7{HO`0mXV}R>LTHm)mgVr;PX<-w;9Nx!OFEKI835*mY@5a$>t+uB3|faU1DzEc z@&($6;-tpv--eE$ui^L*)=hJRR>)9wDbfnr2el(yF3ymm3cwq}4(H;0Aq|J!nhbo} zrv;i%6Qmxow0N(m!AF3Z+I9h8wGc{U$?BB^VRU$4BKWVmG7(6bxaLkooDcY0>jnz> zYPXt?fR3ClwWg_6SvMhaHcxC0%Z{bB*E(J+KUMR=Kv%NjCPQdzu%-*ENNueC7SJ(C zd{J|B)G-)mk9%gozo;BR|J5C42H(~k9lsVd_OL&(?CURB#t4Auo&YxHW`BOWIVvTt z7<>QNWg3rGq z-)yCCjDew;&HU;Yp*(HRT)t^fL?4TZC4~S86_x#=nK5199g1(f*8+L^llY2-yZ(@R>VB&I&-n)lbwaI<5+RBt&^kt*Y6cxbUPZaSe3WUS*}+sZ*9`M z05aUiU2j=9!PM4E!?#uPy|>fCuT%;&rJPz3{$%_-XFfOnZVn%pLO4l!OaQ4Akf>ks zJW$(H1v*rt(#}rQdwD6S4)OqPz5vobK%yq{b)c^4D$uWJ)SDW08$SrD>t)F0bUbF0 zWY2T&AIz_UdiSDl)u@Mg%%A4)yLY=A8ucU}{iiwW?jt1}$2r-(`+Q5)@GV35 zD}SajKfdSBf$U*>u?JpYqMd!h@7^_QVTFEFwUL)P(^&*xhvyo8&}nAPyxp0k_s4pR zmcpbhtHRk-mbPjUdyX~Q^^B#n3--PMdiQZ-FJ){zK0Mg>GB!9kKyqr6?Aj=%*sn5X zF8({NKV2gv*l1;2l0QrL+BPAC6*1Oo-)>^*#zq*T=7Qtww+J1eUPN#~)!<@#-%zZvT5VWs zFAZhA^|{*Klxu$$ovCXfG^f~`%q-1k)Cl1L7VI@M zyNBuReZyeN{R2{aX&CG6vtpv)S}}3k)-Z6f-S%7IU~?7b7JFs{JaUyxv%NHe4P?#s z_X(V~Uj^`aWS-D*d8EBxC)P_pey13pu`lWb+1_-yL94TGr{V5XV)&K)7KSpvY0rve w1N8O333M7~`e6IYNEWYe)lfzD?U4}7@Dh`?%YF+(pBvi6@Ns5;B7{Z#4=Q0f-~a#s diff --git a/v-0.04/examples/volume-change b/v-0.04/examples/volume-change index c61dfbc89bfa2cf6d4112716f4d9fda32a094170..88eed1d2c6f81d4b8c6b74c54a4daaee483f95c1 100755 GIT binary patch delta 13443 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 I$N(1hzvp@n Date: Tue, 31 Oct 2023 21:26:21 -0300 Subject: [PATCH 07/20] . --- v-0.04/examples/alsa-mapper_pulseaudio-api | Bin 74032 -> 74008 bytes v-0.04/examples/change-speaker-mode | Bin 70312 -> 70296 bytes .../examples/get-card-profiles-pulseaudio_api | Bin 71384 -> 71368 bytes v-0.04/examples/switch-sink | Bin 70816 -> 70792 bytes v-0.04/examples/switch-sink-pulseaudio | Bin 73048 -> 73024 bytes v-0.04/examples/volume-change | Bin 70344 -> 70328 bytes v-0.04/examples/volume-change-pulseaudio | Bin 73016 -> 73000 bytes v-0.04/system_query.c | 14 +++++++------- 8 files changed, 7 insertions(+), 7 deletions(-) diff --git a/v-0.04/examples/alsa-mapper_pulseaudio-api b/v-0.04/examples/alsa-mapper_pulseaudio-api index c4324a415ff16b6f4ea3f5aa8116a6731866a03a..4c41ccc3d3003378dc6ae7bfe6da188887be558c 100755 GIT binary patch delta 1870 zcmY+_3rv$&6bJC{er>hI2jGy9Qfpy6oq);)&ewb)1yqcg3Wz)wv!I*X9N?7bz+e|@ zHG(Hv;>gAxA&Z-tvzz!pg5rkN4S9BoAi`i&ajug{m{afmUkfNC!TZ4b8c7U ztevrN^6BD;2i{99WwKMt7_%hC+879mdrKA+qBkjOUK50BDU04%XCJU}t~VKGae!`4 zE9ZBMsBvXv=(lJZYTOM843Q?oVkyE@kRyNEm8z1mOoLg(x>5aYm!uvYCagW{p@Ndow9c*7s&V1MABON0HGm!O*NY@T$zfgSA zaB%~QoDuRd)4xk^im^*4HpTg^F%Es<9*2-CWyl!LF!zNF^5G22of)JAa}l{iiZrcr z=uNo}y|EEjk@!?PxjOrIO_DJ~s4^t=cRoPhq}YT7R?k|jA8^+`#wRKDg_o7J)aBEB zYK=xoZzg#wvp$*^m_0Kvo7C$9XfSChWhLk2Ghf;K0-U#Wq!a5n{}Jt(*ElbOfxmLz z4!8ft`4iYx&$&hvgqZ7`FMz!;73MW?z8hX?#5x#_JyyYuIO98TI}~Jsa2D!dAfC=* zSlWUs%Rs{eA722E!*UqDc>o-Q%i*Hld?Y}lxEBeap$`e5%#H-`0PKM=cadP6Ao%oi z9s)z}IBG~;G=ik7ycuH4b@jsl~;RUE1F9=^f#CjM#fc0=bdqn#;2C0jz zoCo0sgyrL%{}KeCiAOA~`I)Y64Dw%cmGhOj0Aa~wk59y9lg7zn*~IZmL4%>)_}zAm z&ZVjI%h0@lJKGFLL&bC{(ivKXVTQXbA2a{y=zKfI_hSCYnEB$-`6n13#Qf?pTZtRl zO0b~8L;xPe`(qMpbtceZYysx8uTxX1znI-XgQ;3^O9Q2(t7+CIxmeObQJb`4M+2<~ zvl?j!C~BmmKy0GZAhVflAibFeL1!y@r)k9q8%2QwHd>$NFRr~odFYk2(J?U4hJ(?H z%i5_81a#12@O=lV)3xHtPMQafcVY)xv8j{tfcy>}12?D_(q~{!A60|9cDfD9@6j`G;vQ);wPJQZEy~nJ_TdT1@kcRw zK{7safPx)Q?HZm?{h0H!S`KCUO(ciU5S`qX#B>(bdtc(XJn09~+fw^sWhB~`-4%SQ zDsi>6P!Q^AUsW8FQ+-t)+iQut@U{=Du$*kYu3$ukx58vfWf7gfl^}ZRXhQo!_gxC* zfI^k4@DN{qN#VB3lG+~aci2sCDSH|qWAY;xS+MAp{L?+QLdJBJv*m1q;(4XY5*6c~ zV#f^gVP6)m(j~ffpfg*2S*+-(GEdR4aJT3GkD22&EXu7k#T8bXQn_El#>vG0+|7rl jvnZBqwoYenFh8?O2j-gNB(ls#i6XOABGs(&W5NFeP8zsO delta 2402 zcmaKu3s96*6vw~&?S8OrF0b^^d#8{m% z$$rCa-3KFbkhE`CiKCt?aavc2?Z{$tYW)UQT|u~o_bA)el5neTO}16Yd<`+qj<&zW zgy&+6?~1X@5u;5HEQjlrY<)6oVls@H6IB9uwo-@1y zg>>-!;d{1+DTBl5qg0Lws+j5HHXbzy@nPXpW2Xnn^HVYsk`|^XC8Qb>lII2l&X&W| z4D#Z6^1RHn7-)nw;YBSnzp>Ha$q2PAA394SaEFJd+$5=J2BD;|9@PaVd09tVd2)QTzt!scE0e zX-SKC_z*`$WU%7RT>LiiK^t&_u{~IiJ;T^$aKu^0E`wR;7<&q~{>qq-CktY!OP%e@I(`122gv2F(dc`xE*}y8e_*mujU-aTCh0U%$QOV zgxnj9`GK8a7#Pul0AML-1PgB=0NCp`0)WL}3m9#Izl$KqcNhx*N3~&qzz@I$Ai2xf zI`9s-13Y}6u~T5_P%C2=ERKV2u7a@hAp(G*e<1+a_&434_xCP3#h5>zk1$sc4nKV3 zBSVNgM(g$dV&rN1Sg#Q?&rt7pjd=Vl4FOc=s2<2aN0$Sg=jhi!Pz^l*tf--v;(f&x zwX_qvrL|NuOCxTorIUc0wR8?Jp^mNsit6aMfciYG0#fVg6<~fn?F4Q&P|a+OIKGii z0*V{yoY}rp_4xQsKu?7!eLU8R(|Wro^rE|~o8W^ZC3>|9y;+TQw_VKUW}Dp)_9qu{ z3GbXREThmq{MmR;`m|eWfIa9kV>_Kfm37;Vuvfx<=y`v|KH?~4JM14~99B8`XF2>` zg<}v@T*1S5=d@sX3EKCaw9yW&pu_~ZUuEo(Q!Z)`+C4|8qiV4hjif?qp zA0`+e*a5+QC&3<@K*pI7_9@q?Z-TFAy+I=qG-7iLod?`#p=*JqH)$CVa*Lh-9^R(6 zfE}&WB~c^pZKeLeiaRtSQ8VrV2Drqjd+WQqXThMS;FGc4sfzok!n`d}<4(&L#gPWH zD(yR^sOv{}i-XKZmsO6z+Pt!i4OBJ1%l!nQof;2Dk`h{Ta5=eejyyEai|jX-H`YqZ z4dSc)X>QYqUXq(p)b^L$MD0LY-V`PEk@@Ob)7t~Sm)zPVRi@+tsU&?NsYT!Z=E%$A zhtg_MGUq-EP>_<1KaydhyMAvyiBOP+%9oYoW2q;5WtNICPqBEoY58ChtZIm{SJhzJ zJ(x@vRcg~?9IJc&w=s?OA>-6V@pf5JeC0A9;-V1yc$k(CA>+tG)9xW8l#De!)QjV>r-5eRFhcX%VFWt;n9RL6T diff --git a/v-0.04/examples/change-speaker-mode b/v-0.04/examples/change-speaker-mode index f6608eea47c6655878e85b45be75ff2ba201cdf4..4ec86bbeb338508fe175209987e18721ece342d7 100755 GIT binary patch delta 5976 zcmZ`-c~n%_8Gm9ArnNFVG)sCK?PBE2V8Wk6FV*qN|cN-Ni{VF72`ZL32uq?SYLnNoi}*RIemZJ-~Ii*@80jO z-+MDV-}c?|wr^_^t7;qeO~CDBMLf5Yc_>Q@s1Nec`XFAxqWu?nSo}# zI4w2Emh^5(&yjSeJ|H8sv68OTdPqM2lXO2xHzg19w_P6q|^LqGy^0SkmhyJw(#iN_wcIH%Yp6pk!#33}KSKMbg71eVe2|Ch0pR-6ZMllK!|y_w4^Z z$q*qma7y}MNk1y-k&^C`^dXXdTGFE=y}MRFf3yYBlEE!Ch>`SONspEEJCbgebVa`% z)PJ0$`+0SWuU~Cp4)z+r5~KzuNl%pY7)c*0=}D5FBB=~VC*FHcoB`r= z+tqHti->0ucL|=R8Ucw3;<1*G6 zSsp)_{VdCK#O6%&VWat?F|onOWz^X_-)b6Gp>j0eIwk?8BV$U~DDIydm4GBj32YRs zhxGbz)DP%&jL5iW6rYrvHHZ|OvBqOqo{DwzgXRGEd0LC z;pcPB5%_{6zZ;h{Z6D1^wIBt;d?tqv$ukWiv(0#rpwYRU+AYuF<#}e7!x!e6{5!fbYA~RuP03I#Rw`QU;PbQ-Ot`MHZBdHyELe2 zWT&(0u_wa5TQ{vhkgM&jP~OPqQ^yXml8z-Sgwmk@g|gI z;|owa$D8<@<6}gvCJJ}E!+4W!I35h62UXfzIy?25ysV&{W%AYnvzc^^Dekk4D$4~j8@wxlMgP;VHtc{p?L@rOy49Yp~I_F8djfG){KE) zY6fpBG{bLi;qxq=M->eV#Fo>Dl3|^n&YvtA27OJ@JeJ14Ey`q!n~IZBFD~A}Qu&qQ z87NCi>QR1FLe?Kjl35CmDBZz^^Mj=`P!2Ae8Ht?f-O>$I$IPDmx0u<=;k>OZ8Ezkz ztsI0@i>N0FFoHPLmnZY`31*he7fy&r**0M)$`2+CLwRvR3LD0QErp3maI__2l`|G;gI$E`-=OUk1S3r_Ra@=|L!><8A;{x)}r4Rae1)v~d%Rv*s`M4OH4@#ewE zR})~m6{tT>_2z^7)6n_=21Pmhi$Kyk+;5=O)dV=*!W)d7=x%zQx^<`eGg_E-mC@C_ z54XM*ImutD2)DNUOVj$UP7GZg_l+Mkt)Z8#cP`8GjCDk>SD+J6ug9YE=Z*EU9_t<^ z?>Uew>5|YGo5gyR_F5WN_bTEDjnX?9jSi-Jd$8#}{JpP-(TFvfTy4{PEw<&omgbY# zkSFlcq;CKGC1L3ugtcXJM7pxakek-4%@e zcwjrQ1o-)rj7YZ&fd_yafNgj~wF9@iHO&P)0_+9W zshSpyujg4;G%W*|bxqSMf&N(eT3`;a6&Q)*(++G0x`2E6!I?uNT90X3BGy?c=|>;9 z;+GwLrInq@Z3J;A%cW}e{R1J<43 z1D=X9be-U7fY>fR1+cP1D=jDtUkrlo;F*H zztFU2u{%oPfZ*R7iUS|J4TqpOrz6JYj*l#}+s<$uH5!gF%(EeYj9@vv`0Gl7`f4#T= zp^7g~U>h7hc*tR|aEO5x4|{SqzwwOOaOOM@e>Td{d4cBuj$h!v1kAk1e+!7~;hO

06V@cr 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 X`i}7U +#include +#include +#include + +static pa_threaded_mainloop *mainloop; +static pa_context *context; +static int sink_count = 0; +static char **sink_names = NULL; + +void sink_list_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + (void) userdata; + if (eol > 0) { + int chosen; + printf("Enter the number of the sink to set as default: "); + scanf("%d", &chosen); + + if (chosen >= 0 && chosen < sink_count) { + pa_context_set_default_sink(c, sink_names[chosen], NULL, NULL); + } + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + sink_names = realloc(sink_names, sizeof(char*) * (sink_count + 1)); + sink_names[sink_count] = strdup(info->name); + printf("%d: %s (%s)\n", sink_count++, info->name, info->description); +} + +void context_state_cb(pa_context *c, void *userdata) { + (void) userdata; + + if (pa_context_get_state(c) == PA_CONTEXT_READY) { + pa_operation_unref(pa_context_get_sink_info_list(c, sink_list_cb, NULL)); + } +} + +int main(void) { + mainloop = pa_threaded_mainloop_new(); + pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "sink_switcher_threaded"); + + pa_context_set_state_callback(context, context_state_cb, NULL); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + pa_threaded_mainloop_start(mainloop); + + pa_threaded_mainloop_lock(mainloop); + pa_threaded_mainloop_wait(mainloop); // Wait until sink_list_cb signals completion + + for (int i = 0; i < sink_count; i++) { + free(sink_names[i]); + } + free(sink_names); + + pa_context_disconnect(context); + pa_context_unref(context); + pa_threaded_mainloop_unlock(mainloop); + pa_threaded_mainloop_stop(mainloop); + pa_threaded_mainloop_free(mainloop); + return 0; +} diff --git a/v-0.05/examples/switch-sink.c b/v-0.05/examples/switch-sink.c new file mode 100644 index 0000000..45a8739 --- /dev/null +++ b/v-0.05/examples/switch-sink.c @@ -0,0 +1,61 @@ +/** + * Demo Code: PulseAudio Sink Switcher + * + * This demonstration code showcases the functionality of switching audio sinks + * using the PulseAudio API. It initializes the PulseAudio manager, loads available + * audio sinks, prompts the user to select a sink, and then switches to the chosen sink. + * + * Note: Ensure the PulseAudio server is running and in a good state before executing. + */ +#include "../easypulse_core.h" +#include +#include + +int main() { + // Initialize the PulseAudio Manager + pulseaudio_manager *manager = new_manager(); + pulseaudio_manager *self = manager; + + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudioManager.\n"); + manager->destroy(self); + return 1; + } + + // Display available devices to the user + printf("Available Sinks:\n"); + for (uint32_t i = 0; i < manager->device_count; i++) { + printf("%d. %s - %s\n", i + 1, manager->devices[i].code, manager->devices[i].description); + } + + // Prompt the user to select a device + printf("Enter the number of the sink you want to switch to: "); + uint32_t choice; + scanf("%d", &choice); + + + // Validate the user's choice + if (choice < 1 || choice > manager->device_count) { + fprintf(stderr, "Invalid choice.\n"); + manager->destroy(self); + return 1; + } + + + // Switch to the selected device + if (manager->switch_device(manager, choice - 1)) { + printf("Successfully switched to the selected device.\n"); + + // Debug code to print the default device after the switch + fprintf(stderr, "[DEBUG]: Default device after switch: %s\n", manager->active_device->code); + } + else { + fprintf(stderr, "Failed to switch to the selected device.\n"); + return 1; + } + + // Cleanup + manager->destroy(self); + + return 0; +} diff --git a/v-0.05/examples/volume-change b/v-0.05/examples/volume-change new file mode 100755 index 0000000000000000000000000000000000000000..9270d9e42c95cd90f064a6ec44dcba222ce9b72a GIT binary patch literal 70808 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 Z +#include +#include + +static pa_threaded_mainloop *mainloop; +static pa_context *context; + +/** + * @brief Callback function to set the volume of the default sink. + * + * This function fetches the current volume of the default sink, displays it, + * then prompts the user for a desired volume level, sets the volume, and finally + * displays the volume after the change. + * + * @param c The PulseAudio context. + * @param info Information about the current sink. + * @param eol End-of-list flag. + * @param userdata User data (unused). + */ +void set_volume_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + (void) userdata; + + if (eol > 0) { + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + // Prompt the user for the desired volume level first + int volume_percentage; + printf("Enter the desired volume (0-100): "); + scanf("%d", &volume_percentage); + + // Display the current volume percentage + int volume_percentage_before = (int)(100.0f * pa_cvolume_avg(&info->volume) / PA_VOLUME_NORM + 0.5); + printf("Volume before change: %d%%\n", volume_percentage_before); + + // Set the volume based on user input + pa_cvolume volume; + pa_cvolume_set(&volume, info->channel_map.channels, (volume_percentage * PA_VOLUME_NORM) / 100); + pa_context_set_sink_volume_by_index(c, info->index, &volume, NULL, NULL); + + // Display the volume after the change + int volume_percentage_after = (int)(100.0f * pa_cvolume_avg(&volume) / PA_VOLUME_NORM + 0.5); + printf("Volume after change: %d%%\n", volume_percentage_after); + + pa_threaded_mainloop_signal(mainloop, 0); +} + +/** + * @brief Callback function for context state changes. + * + * This function checks if the context is ready and then triggers the retrieval + * of the default sink's information. + * + * @param c The PulseAudio context. + * @param userdata User data (unused). + */ +void context_state_cb(pa_context *c, void *userdata) { + (void) c; + (void) userdata; + + if (pa_context_get_state(c) == PA_CONTEXT_READY) { + pa_operation_unref(pa_context_get_sink_info_by_name(c, "@DEFAULT_SINK@", set_volume_cb, NULL)); + } +} + +int main(void) { + // Initialize PulseAudio threaded mainloop and context + mainloop = pa_threaded_mainloop_new(); + pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "volume_changer_threaded"); + + // Set context state callback and connect the context + pa_context_set_state_callback(context, context_state_cb, NULL); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + + // Start the threaded mainloop + pa_threaded_mainloop_start(mainloop); + + // Lock the mainloop and wait for operations to complete + pa_threaded_mainloop_lock(mainloop); + pa_threaded_mainloop_wait(mainloop); + + // Cleanup and free resources + pa_context_disconnect(context); + pa_context_unref(context); + pa_threaded_mainloop_unlock(mainloop); + pa_threaded_mainloop_stop(mainloop); + pa_threaded_mainloop_free(mainloop); + return 0; +} diff --git a/v-0.05/examples/volume-change.c b/v-0.05/examples/volume-change.c new file mode 100644 index 0000000..e15f0eb --- /dev/null +++ b/v-0.05/examples/volume-change.c @@ -0,0 +1,82 @@ +/** + * @file volume_app.c + * @brief PulseAudio Volume Control Application + * + * This application provides a simple interface to interact with PulseAudio. + * It displays the current active device, its name, and the master volume. + * The user can then input a new volume value, which the application attempts + * to set. The result of the operation (success or failure) is displayed to the user. + * + * The application leverages the EasyPulse library to communicate with PulseAudio. + * + * + * @date 10-08-2023 (creation date) + */ + +#include +#include +#include "../easypulse_core.h" + +int main() { + // Initialize the pulseaudio manager + pulseaudio_manager *manager = new_manager(); + pulseaudio_manager *self = manager; + pulseaudio_device *active_device = self->active_device; + + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudioManager.\n"); + manager->destroy(self); + return 1; + } + +#if 0 + // Display the channels of the active profile + uint32_t total_channels = manager->get_active_profile_channels(active_device, active_device->index); + + printf("[DEBUG] The active device is: %s\n", active_device->code); + printf("[DEBUG] The following profiles were found:\n"); + + for (uint32_t i = 0; i < active_device->profile_count; i++) { + if (active_device->profiles[i].name) { + printf("[DEBUG] Profile name: %s\n", active_device->profiles[i].name); + } else { + printf("[DEBUG] Profile name is NULL or invalid.\n"); + } + printf("[DEBUG] This profile has %d channels.\n", active_device->profiles[i].channels); + } + + + printf("Current device: %s\n", manager->active_device->code); + + // Debug: Print the volume of individual channels of the active device + for (uint32_t channel = 0; channel < total_channels; channel++) { + printf("Channel %d volume before change: %f%%\n", + channel, + (100.0 * manager->active_device->volume.values[channel] / PA_VOLUME_NORM)); + } + + printf("Master Volume: %f%%\n", + (100.0 * pa_cvolume_avg(&manager->active_device->volume) / PA_VOLUME_NORM)); + + + // Ask the user for a new volume value + float new_volume; + printf("Enter a new volume value (0.0 - 100.0): "); + scanf("%f", &new_volume); + + // Set the new volume + manager->set_volume(manager, manager->active_device->index, new_volume); + + + // Debug: Print the volume of individual channels of the active device + for (uint32_t channel = 0; channel < total_channels; channel++) { + printf("Channel %d volume after change: %f%%\n", + channel, + (100.0 * manager->active_device->volume.values[channel] / PA_VOLUME_NORM)); + } +#endif + // Cleanup and exit + manager->destroy(self); + return 0; + +} diff --git a/v-0.05/libeasypulse_core.a b/v-0.05/libeasypulse_core.a new file mode 100644 index 0000000000000000000000000000000000000000..7b62bfe0b3b459223e8840b790a7143e924907d4 GIT binary patch literal 39626 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 U=KU?d(-xjoD{nLKN&5f)0k@GQ-2eap literal 0 HcmV?d00001 diff --git a/v-0.05/system_query.c b/v-0.05/system_query.c new file mode 100644 index 0000000..88184a4 --- /dev/null +++ b/v-0.05/system_query.c @@ -0,0 +1,767 @@ +#include "system_query.h" +#include +#include +#include +#include +#include +#include +#include + +// Since pulseaudio uses callbacks, we need something that will allow us to share data +// between functions. +typedef struct { + pa_threaded_mainloop *mainloop; + pa_mainloop_api *mainloop_api; + pa_context *context; +} _shared_data_1; + +static _shared_data_1 shared_data_1; + +// Structure to share data between get_alsa_name and its callback. +typedef struct { + const char *alsa_name; + const char *alsa_id; +} _shared_data_2; + +static _shared_data_2 shared_data_2 = {.alsa_name = NULL}; + + +// Structure to share data between get_available_sinks its callback. +typedef struct { + pa_sink_info **sinks; // An array of pointers to pa_sink_info + uint32_t count; +} _shared_data_3; + +static _shared_data_3 shared_data_3; + + + +static void pulse_cleanup(void); +static bool is_pulse_initialized(void); +static void get_device_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata); +static void get_profile_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata); + +/** + * @brief Iterates through operations in the pulseaudio threaded loop. + * + * @param loop Pointer to the threaded loop instance. + * @param op Pointer to the pa_operation instance. + */ +static void iterate(pa_operation *op) { + //Leaves if operation is invalid. + if (!op) return; + + bool is_in_mainloop_thread = pa_threaded_mainloop_in_thread(shared_data_1.mainloop); + + // If we're not in the mainloop thread, lock it. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_lock(shared_data_1.mainloop); + } + + //Wait for the operation to complete. + //The signaling to continue is performed inside the callback operation (op). + pa_threaded_mainloop_wait(shared_data_1.mainloop); + + //Cleaning up. + pa_operation_unref(op); + + // If we locked the mainloop earlier, unlock it now. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + } + +} + +/** + * @brief Callback function to handle changes in PulseAudio context state. + * + * This function is triggered whenever the state of the PulseAudio context changes. + * It signals the mainloop to continue execution whenever the context is in a READY, FAILED, + * or TERMINATED state. + * + * @param c Pointer to the PulseAudio context. + * @param userdata Pointer to the data shared with the main function, which contains the mainloop. + */ +static void context_state_cb(pa_context *c, void *userdata) { + (void) userdata; + pa_context_state_t state = pa_context_get_state(c); + + // If the context is in a READY, FAILED, or TERMINATED state, signal the mainloop to continue. + if (state == PA_CONTEXT_READY || state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } +} + +/** + * @brief Utility function to check if PulseAudio is initialized and in a READY state. + * + * This function checks the state of the PulseAudio context and other key PulseAudio resources + * to determine if PulseAudio has been successfully initialized and is in a READY state. + * + * @return True if PulseAudio is initialized and in a READY state, false otherwise. + */ +static bool is_pulse_initialized(void) { + + + // Check if the main components of PulseAudio (mainloop, mainloop_api, and context) are initialized. + if (shared_data_1.mainloop && shared_data_1.mainloop_api && shared_data_1.context) { + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + + // If the context is in a READY state, PulseAudio is initialized. + if (state == PA_CONTEXT_READY) { + return true; + } + } + return false; +} + +bool initialize_pulse() { + shared_data_1.mainloop = pa_threaded_mainloop_new(); + if (!shared_data_1.mainloop) { + fprintf(stderr, "Failed to create mainloop.\n"); + return false; + } + + shared_data_1.mainloop_api = pa_threaded_mainloop_get_api(shared_data_1.mainloop); + if (!shared_data_1.mainloop_api) { + fprintf(stderr, "Failed to get mainloop API.\n"); + pa_threaded_mainloop_free(shared_data_1.mainloop); + return false; + } + + shared_data_1.context = pa_context_new(shared_data_1.mainloop_api, "Easypulse query API"); + if (!shared_data_1.context) { + fprintf(stderr, "Failed to create context.\n"); + pa_threaded_mainloop_free(shared_data_1.mainloop); + return false; + } + + + pa_context_set_state_callback(shared_data_1.context, context_state_cb, shared_data_1.mainloop); + + // Start the threaded mainloop + pa_threaded_mainloop_start(shared_data_1.mainloop); + + // Lock the mainloop and connect the context + pa_threaded_mainloop_lock(shared_data_1.mainloop); + if (pa_context_connect(shared_data_1.context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + pulse_cleanup(); + return false; + } + + // Wait for the context to be ready + while (true) { + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + if (state == PA_CONTEXT_READY) { + break; + } else if (state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + pulse_cleanup(); + return false; + } + pa_threaded_mainloop_wait(shared_data_1.mainloop); + } + + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + return true; +} + + +/** + * @brief Cleanup function to properly disconnect and free PulseAudio resources. + * + * This function ensures that all the PulseAudio resources are properly disconnected, + * dereferenced, and freed to avoid any resource leaks. It should be called whenever + * PulseAudio operations are done and the program wishes to terminate or release PulseAudio. + */ +static void pulse_cleanup(void) { + if (shared_data_1.context) { + // Check if the context is in a state where it can be disconnected + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + if (state == PA_CONTEXT_READY) { + pa_context_disconnect(shared_data_1.context); + } + pa_context_unref(shared_data_1.context); + shared_data_1.context = NULL; + } + if (shared_data_1.mainloop) { + pa_threaded_mainloop_free(shared_data_1.mainloop); + shared_data_1.mainloop = NULL; + } +} + +/** + * @brief Callback function used to retrieve the count of audio profiles for a specific card. + * + * This function is called by PulseAudio when querying for the list of profiles for a given card index. + * It sets the profile_count with the number of profiles available for the card. + * If there's an error or the list is exhausted, the function signals the mainloop to continue + * without further processing. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current card information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function, which contains the mainloop + * and the profile_count to be set. + */ +static void get_profile_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + + uint32_t *profile_count = (uint32_t *) userdata; + + // Handle errors in retrieving profile count. + if (eol < 0) { + fprintf(stderr, "Failed to get profile count.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // If we've reached the end of the list of profiles, signal the mainloop to continue. + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Set the profile_count with the number of profiles available for the card. + *profile_count = i->n_profiles; +} + + +/** + * @brief Retrieve the count of audio profiles for a specific card. + * + * This function queries PulseAudio to get a count of all available audio profiles + * for a specified card index. If PulseAudio is not initialized, the function attempts + * to initialize it. If there's an error in fetching the profile count or initializing + * PulseAudio, it returns UINT32_MAX. + * + * @param card_index The index of the card for which to retrieve the profile count. + * @return Count of audio profiles or UINT32_MAX on error. + */ +uint32_t get_profile_count(uint32_t card_index) { + uint32_t profile_count = 0; // Initialize profile count to zero. + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "get_profiles_count(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails. + } + } + + // Query PulseAudio for the list of audio profiles for the specified card. + // The callback get_profile_count_cb will populate the profile_count variable. + count_op = pa_context_get_card_info_by_index(shared_data_1.context, card_index, get_profile_count_cb, &profile_count); + + // Wait for the PulseAudio operation to complete. + iterate(count_op); + + return profile_count; // Return the total count of profiles. +} + +/** + * @brief Callback function used to populate the list of available audio sinks. + * + * This function is called for each audio sink found by PulseAudio when querying + * for the list of sinks. The function populates the `shared_sink_data` structure + * with `pa_sink_info` for each sink. When the list is exhausted or there's an error, + * the function exits without further processing. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio sink information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function. + */ +static void get_available_sinks_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + (void) userdata; + + uint32_t *count = &shared_data_3.count; + + // Handle errors in retrieving sink information. + if (eol < 0) { + fprintf(stderr, "Failed to get sink info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // If we've reached the end of the list of sinks, mark the end and exit the callback. + if (eol > 0) { + shared_data_3.sinks[*count] = NULL; // Set the last element to NULL as sentinel + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Allocate memory for the pa_sink_info structure. + shared_data_3.sinks[*count] = malloc(sizeof(pa_sink_info)); + if (shared_data_3.sinks[*count] == NULL) { + fprintf(stderr, "Failed to allocate memory for sink info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Copy the pa_sink_info structure. + *(shared_data_3.sinks[*count]) = *i; + + // Duplicate the strings to ensure they remain valid. + if (i->name != NULL) { + shared_data_3.sinks[*count]->name = strdup(i->name); + } + if (i->description != NULL) { + shared_data_3.sinks[*count]->description = strdup(i->description); + } + + (*count)++; +} + +/** + * @brief Retrieve the list of available audio sinks for a specific card. + * + * This function queries PulseAudio to get a list of all available audio sinks + * for a specified card index. It dynamically allocates memory based on the count + * of sinks to store the list of sinks. + * If PulseAudio is not initialized, the function attempts to initialize it. + * + * @param card_index The index of the card for which to retrieve the sinks. + * @return Pointer to the first sink in the list or NULL on error. + */ +pa_sink_info **get_available_sinks() { + pa_operation *op = NULL; + + // Using get_device_count() to obtain the number of sinks + uint32_t max_sinks = get_device_count(); + + // Allocate memory for pointers + shared_data_3.sinks = malloc((max_sinks + 1) * sizeof(pa_sink_info*)); + shared_data_3.count = 0; // Reset count + + // Check for successful memory allocation + if (!shared_data_3.sinks) { + fprintf(stderr, "Failed to allocate memory for sinks.\n"); + return NULL; + } + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_available_sinks(): failed to initialize pulseaudio.\n"); + free(shared_data_3.sinks); + shared_data_3.sinks = NULL; + return NULL; + } + } + + + // Query PulseAudio for the list of available sinks for the specified card + op = pa_context_get_sink_info_list(shared_data_1.context, get_available_sinks_cb, NULL); + + // Wait for the PulseAudio operation to complete + iterate(op); + + return shared_data_3.sinks; +} + +void delete_devices(pa_sink_info **sinks) { + if (sinks == NULL) { + return; + } + + for (int i = 0; sinks[i] != NULL; ++i) { + if (sinks[i]->name) { + free((char*)sinks[i]->name); + } + if (sinks[i]->description) { + free((char*)sinks[i]->description); + } + free(sinks[i]); + } + + free(sinks); +} + + +/** + * @brief Callback function used to count the available audio devices (cards). + * + * This function is called for each audio device found by PulseAudio when querying + * for the list of devices. The function increments the device_count for each device. + * When the list is exhausted or there's an error, it signals the mainloop to continue. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio device information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function. + */ +static void get_device_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + (void) i; + + uint32_t *device_count = (uint32_t *) userdata; + + if (eol < 0) { + // Handle error + //fprintf(stderr,"[DEBUG, get_device_count_cb()] Reached elo < 0. Signal triggered.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + if (eol > 0) { + // End of list + //fprintf(stderr,"[DEBUG, get_device_count_cb()] Reached elo > 0. Signal triggered.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + ++(*device_count); +} + + + +/** + * @brief Retrieve the count of audio devices in the system. + * + * This function queries PulseAudio to get a count of all available audio devices (cards). + * If PulseAudio is not initialized, the function attempts to initialize it. If the initialization + * fails or there's an error in fetching the device count, it returns UINT32_MAX. + * + * @return Count of audio devices or UINT32_MAX on error. + */ +uint32_t get_device_count(void) { + uint32_t device_count = 0; // Initialize device count to zero. + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "get_device_count(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails. + } + } + + // Check if context is valid after initialization attempt. + if (!shared_data_1.context) { + fprintf(stderr, "Context is NULL in get_device_count.\n"); + return UINT32_MAX; + } + + //fprintf(stderr,"[get_device_count()] context is, %p\n",&shared_data_1.context); + //fprintf(stderr,"[get_device_count()] mainloop is, %p\n",&shared_data_1.mainloop); + + // Query PulseAudio for the list of audio devices (cards). + // The callback get_device_count_cb will increment the device_count for each device found. + count_op = pa_context_get_card_info_list(shared_data_1.context, get_device_count_cb, &device_count); + + // Wait for the PulseAudio operation to complete. + iterate(count_op); + + return device_count; // Return the total count of devices. +} + +/** + * @brief Retrieves the maximum number of channels for the given ALSA device name. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the maximum number of channels + * supported by the device. + * + * @param alsa_name Name of the ALSA device. + * @return Maximum number of channels supported by the device or -1 on error. + */ +int get_max_channels(const char *alsa_id, const pa_sink_info *sink_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int max_channels = 0; + int err; + + if (!alsa_id || !sink_info) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { + //fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return sink_info->sample_spec.channels; // Return channels from PulseAudio if ALSA fails + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + //fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_hw_params_get_channels_max(params, &max_channels)) < 0) { + //fprintf(stderr, "Error getting max channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + //fprintf(stderr, "[DEBUG, get_max_channels()] sink_info->sample_spec.channels is %i\n", sink_info->sample_spec.channels); + return sink_info->sample_spec.channels; + } + + snd_pcm_close(handle); + return max_channels; +} + +/** + * @brief Retrieves the minimum number of channels for the given ALSA device id. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the minimum number of channels + * supported by the device. + * + * @param alsa_name Name of the ALSA device. + * @return Minimum number of channels supported by the device or -1 on error. + */ +int get_min_channels(const char *alsa_id, const pa_sink_info *sink_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int min_channels = 0; + int err; + + //fprintf(stderr, "[DEBUG, get_min_channels()] sink_info->sample_spec.channels is %i\n", sink_info->sample_spec.channels); + + if (!alsa_id || !sink_info) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { + //fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return sink_info->sample_spec.channels; + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + //fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_hw_params_get_channels_min(params, &min_channels)) < 0) { + //fprintf(stderr, "Error getting min channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.channels; + } + + snd_pcm_close(handle); + return min_channels; +} + + +/** + * @brief Callback function to retrieve the ALSA name from the card info. + * + * This callback checks for the "alsa.card_name" property in the card's + * proplist. If the property is found, it assigns the property's value + * to the shared data structure for further use. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the card info structure. + * @param eol Flag indicating end of list. + * @param userdata User-defined data pointer (unused in this callback). + */ +static void get_alsa_name_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + + if (eol) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + const char *target_sink_name = userdata; + if (target_sink_name && strcmp(target_sink_name, i->name) != 0) { + return; // Skip this sink, as it does not match the specified name + } + + const char *alsa_name = pa_proplist_gets(i->proplist, "alsa.card_name"); + if (alsa_name) { + shared_data_2.alsa_name = strdup(alsa_name); + if (!shared_data_2.alsa_name) { + fprintf(stderr, "Failed to allocate memory for ALSA name.\n"); + } + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } +} + + + +/** + * @brief Retrieves the ALSA name of the first audio device encountered. + * + * This function initializes PulseAudio (if not already initialized), then + * queries PulseAudio for the list of audio devices. It waits for the + * retrieval operation to complete and then returns the ALSA name + * of the first device it finds with the "alsa.card_name" property. + * + * @return ALSA name of the device or NULL if not found or on error. + */ +const char* get_alsa_name(const char *sink_name) { + pa_operation *name_op; + + shared_data_2.alsa_name = NULL; // Ensure alsa_name is initialized to NULL + + + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "get_alsa_name(): PulseAudio initialization failed.\n"); + return NULL; + } + + name_op = pa_context_get_sink_info_list(shared_data_1.context, get_alsa_name_cb, (void*)sink_name); + iterate(name_op); + + return shared_data_2.alsa_name; +} + +/** + * @brief Callback function to retrieve the ALSA device string based on the PulseAudio sink information. + * + * This function is called for each available PulseAudio sink. It checks if the sink's name matches the + * target sink name provided in the userdata. If a match is found, it retrieves the "alsa.card" and + * "alsa.device" properties from the sink's proplist, constructs the ALSA device string in the format + * "hw:,", and stores it in shared data for later retrieval. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the sink information structure. + * @param eol End of list flag. If non-zero, indicates the end of the sink list. + * @param userdata User-defined data pointer. In this case, it points to the target sink name string. + */ +#include // Include this for the isdigit() function + +static void get_alsa_id_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; // Unused parameter + + // Check for end of list + if (eol) { + // Signal the main loop to unblock the iterate function + //fprintf(stderr,"[DEBUG, get_alsa_id_cb()] End of function reached.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + free(userdata); + return; + } + + // Retrieve the target sink name from userdata + const char *target_sink_name = userdata; + + // If a target sink name is provided, check if it matches the current sink's name + if (target_sink_name && strcmp(target_sink_name, i->name) != 0) { + return; // Skip this sink, as it does not match the specified name + } + + // Attempt to retrieve the "alsa.card" and "alsa.device" properties + const char *alsa_card = pa_proplist_gets(i->proplist, "alsa.card"); + const char *alsa_device = pa_proplist_gets(i->proplist, "alsa.device"); + + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()], alsa.card is %s\n", alsa_card); + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()], alsa.device is %s\n", alsa_device); + + // Check if both properties are available and alsa.device is a digit + if (alsa_card && alsa_device && isdigit((unsigned char)alsa_device[0])) { + // Construct the ALSA device string + char alsa_device_string[128]; + snprintf(alsa_device_string, sizeof(alsa_device_string), "hw:%s,%s", alsa_card, alsa_device); + + // Store the ALSA device string in shared data + shared_data_2.alsa_id = strdup(alsa_device_string); + if (!shared_data_2.alsa_id) { + fprintf(stderr, "Failed to allocate memory for ALSA device id.\n"); + } + } else { + fprintf(stderr, " - ALSA properties not found or invalid for sink.\n"); + } + + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()] alsa ID is %s\n", shared_data_2.alsa_id); + + // Signal the main loop to unblock the iterate function + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + + +/** + * @brief Retrieves the ALSA device string for a given PulseAudio sink name. + * + * This function initializes PulseAudio (if not already initialized), then queries PulseAudio for the + * information of a specific sink by its name. It waits for the retrieval operation to complete and then + * returns the constructed ALSA device string based on the "alsa.card" and "alsa.device" properties of + * the sink. + * + * @param sink_name The name of the PulseAudio sink. + * @return ALSA device string in the format "hw:," or NULL if not found or on error. + */ +const char* get_alsa_id(const char *sink_name) { + pa_operation *op; + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_alsa_id(): PulseAudio initialization failed.\n"); + return NULL; + } + } + + // Make a copy of the sink name to ensure it remains valid + char *sink_name_copy = strdup(sink_name); + if (!sink_name_copy) { + fprintf(stderr, "get_alsa_id(): Failed to allocate memory for sink name.\n"); + return NULL; + } + + // Query PulseAudio for the information of the specified sink + //fprintf(stderr,"[DEBUG, get_alsa_id()] sink name is: %s\n", sink_name_copy); + op = pa_context_get_sink_info_by_name(shared_data_1.context, sink_name_copy, get_alsa_id_cb, sink_name_copy); + + // Wait for the PulseAudio operation to complete + iterate(op); + + // Return the ALSA device string retrieved by the callback function + return shared_data_2.alsa_id; +} + +/** + * @brief Retrieves the sample rate of the given ALSA device. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the sample rate. + * + * @param alsa_id Name of the ALSA device. + * @param sink_info Pointer to a PulseAudio sink_info structure. + * @return Sample rate of the device or -1 on error. + */ +int get_sample_rate(const char *alsa_id, const pa_sink_info *sink_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int sample_rate; + int err; + + if (!alsa_id || !sink_info) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { + fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return sink_info->sample_spec.rate; // Return sample rate from PulseAudio if ALSA fails + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.rate; + } + + if ((err = snd_pcm_hw_params_get_rate(params, &sample_rate, 0)) < 0) { + //fprintf(stderr, "Error getting sample rate for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.rate; + } + + snd_pcm_close(handle); + return sample_rate; +} + + + diff --git a/v-0.05/system_query.h b/v-0.05/system_query.h new file mode 100644 index 0000000..274e5e1 --- /dev/null +++ b/v-0.05/system_query.h @@ -0,0 +1,20 @@ +//Header definition files to query about sound card properties (number of sinks, profiles...) +#ifndef SYSTEM_QUERY_H +#define SYSTEM_QUERY_H + +#include +#include +#include +#include + +uint32_t get_device_count(void); //Gets the number of devices in the system. +uint32_t get_profile_count(uint32_t card_index); //Gets the number of profiles for a given soundcard. +pa_sink_info **get_available_sinks(); //Gets the total available sinks for this system. +const char* get_alsa_name(const char *sink_name); //Gets the corresponding alsa name of a pulseaudio card. +int get_max_channels(const char *alsa_id, const pa_sink_info *sink_info); //Gets the maximum channels an ALSA card supports. +int get_min_channels(const char *alsa_id, const pa_sink_info *sink_info); //Gets the maximum channels an ALSA card supports. +const char* get_alsa_id(const char *sink_name); //Gets the alsa id based on the pulseaudio channel name. +int get_sample_rate(const char *alsa_id, const pa_sink_info *sink_info); //Gets the sample rate of a pulseaudio sink. +void delete_devices(pa_sink_info **sinks); //Releases memory for allocated devices. + +#endif From 1943d67007099e78b3bb7e12d88f1e56f1e64ded Mon Sep 17 00:00:00 2001 From: NMagic Date: Sat, 4 Nov 2023 12:49:45 -0300 Subject: [PATCH 09/20] Added input device detection support ... --- v-0.06/Makefile | 20 + .../pa_context -- interface overview.docx | Bin 0 -> 33970 bytes .../pavucontrol sink update flow.txt | 41 + .../pulseaudio/introspect.c summary | 79 ++ .../pulseaudio/mainloop code flow.txt | 17 + v-0.06/easypulse_core.c | 843 +++++++++++ v-0.06/easypulse_core.h | 90 ++ v-0.06/examples/Makefile | 19 + v-0.06/examples/alsa-mapper_pulseaudio-api | Bin 0 -> 83944 bytes v-0.06/examples/alsa-mapper_pulseaudio-api.c | 91 ++ v-0.06/examples/change-speaker-mode | Bin 0 -> 80232 bytes v-0.06/examples/change-speaker-mode.c | 88 ++ v-0.06/examples/error.txt | 103 ++ .../examples/get-card-profiles-pulseaudio_api | Bin 0 -> 81440 bytes .../get-card-profiles-pulseaudio_api.c | 63 + v-0.06/examples/get-input-sources | Bin 0 -> 81392 bytes v-0.06/examples/get-input-sources.c | 62 + v-0.06/examples/print_volume_output_devices | Bin 0 -> 80608 bytes v-0.06/examples/print_volume_output_devices.c | 66 + v-0.06/examples/switch-sink | Bin 0 -> 80736 bytes v-0.06/examples/switch-sink-pulseaudio | Bin 0 -> 82904 bytes v-0.06/examples/switch-sink-pulseaudio.c | 62 + v-0.06/examples/switch-sink.c | 61 + v-0.06/examples/volume-change | Bin 0 -> 80264 bytes v-0.06/examples/volume-change-pulseaudio | Bin 0 -> 82936 bytes v-0.06/examples/volume-change-pulseaudio.c | 101 ++ v-0.06/examples/volume-change.c | 82 ++ v-0.06/libeasypulse_core.a | Bin 0 -> 39626 bytes v-0.06/system_query.c | 1227 +++++++++++++++++ v-0.06/system_query.h | 51 + 30 files changed, 3166 insertions(+) create mode 100644 v-0.06/Makefile create mode 100644 v-0.06/documentation/pa_context -- interface overview.docx create mode 100644 v-0.06/documentation/pavucontrol/pavucontrol sink update flow.txt create mode 100644 v-0.06/documentation/pulseaudio/introspect.c summary create mode 100644 v-0.06/documentation/pulseaudio/mainloop code flow.txt create mode 100644 v-0.06/easypulse_core.c create mode 100644 v-0.06/easypulse_core.h create mode 100644 v-0.06/examples/Makefile create mode 100755 v-0.06/examples/alsa-mapper_pulseaudio-api create mode 100644 v-0.06/examples/alsa-mapper_pulseaudio-api.c create mode 100755 v-0.06/examples/change-speaker-mode create mode 100644 v-0.06/examples/change-speaker-mode.c create mode 100644 v-0.06/examples/error.txt create mode 100755 v-0.06/examples/get-card-profiles-pulseaudio_api create mode 100644 v-0.06/examples/get-card-profiles-pulseaudio_api.c create mode 100755 v-0.06/examples/get-input-sources create mode 100644 v-0.06/examples/get-input-sources.c create mode 100755 v-0.06/examples/print_volume_output_devices create mode 100644 v-0.06/examples/print_volume_output_devices.c create mode 100755 v-0.06/examples/switch-sink create mode 100755 v-0.06/examples/switch-sink-pulseaudio create mode 100644 v-0.06/examples/switch-sink-pulseaudio.c create mode 100644 v-0.06/examples/switch-sink.c create mode 100755 v-0.06/examples/volume-change create mode 100755 v-0.06/examples/volume-change-pulseaudio create mode 100644 v-0.06/examples/volume-change-pulseaudio.c create mode 100644 v-0.06/examples/volume-change.c create mode 100644 v-0.06/libeasypulse_core.a create mode 100644 v-0.06/system_query.c create mode 100644 v-0.06/system_query.h diff --git a/v-0.06/Makefile b/v-0.06/Makefile new file mode 100644 index 0000000..b1c5107 --- /dev/null +++ b/v-0.06/Makefile @@ -0,0 +1,20 @@ +CC = gcc +CFLAGS = -Wall -g -Wextra + +LIB_NAME = easypulse_core +LIB_SRC = easypulse_core.c +LIB_OBJ = easypulse_core.o +LIB_OUT = lib$(LIB_NAME).a + +all: $(LIB_OUT) + +$(LIB_OUT): $(LIB_OBJ) + ar rcs $(LIB_OUT) $(LIB_OBJ) + +$(LIB_OBJ): $(LIB_SRC) + $(CC) $(CFLAGS) -c $(LIB_SRC) -o $(LIB_OBJ) + +clean: + rm -f $(LIB_OBJ) $(LIB_OUT) + +.PHONY: all clean diff --git a/v-0.06/documentation/pa_context -- interface overview.docx b/v-0.06/documentation/pa_context -- interface overview.docx new file mode 100644 index 0000000000000000000000000000000000000000..6cbe2d09c38dfcab843409c88d5b9d8666c90192 GIT binary patch literal 33970 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 literal 0 HcmV?d00001 diff --git a/v-0.06/documentation/pavucontrol/pavucontrol sink update flow.txt b/v-0.06/documentation/pavucontrol/pavucontrol sink update flow.txt new file mode 100644 index 0000000..9428de8 --- /dev/null +++ b/v-0.06/documentation/pavucontrol/pavucontrol sink update flow.txt @@ -0,0 +1,41 @@ ++----------------+ +| pavucontrol | +| (initial file)| ++----------------+ + | + | Callback function triggered when there's info/change related to a sink + V ++----------------+ +| sink_cb | +| (pavucontrol.cc)| ++----------------+ + | + | - If error, show error and return + | - If end-of-list (eol) is reached, decrease outstanding tasks count and return + | - Update GUI representation of a sink using w->updateSink() + V ++---------------------------+ +| MainWindow::updateSink | +| (mainwindow.cc & .h) | ++---------------------------+ + | + | - Retrieve or create SinkWidget for the sink + | - Update SinkWidget properties (e.g., volume, mute state, active port, etc.) + | - Prepare context menu for the sink + | - Ensure the sink is displayed correctly via updateDeviceVisibility + V ++-------------------------------------+ +| MainWindow::updateDeviceVisibility | +| (mainwindow.cc & .h) | ++-------------------------------------+ + | + | - If idle source/callback is already queued, return + | - Schedule the idle_cb function to be called when the app is idle + V ++----------------+ +| idle_cb | +| (mainwindow.cc)| ++----------------+ + | + V + ... (Specific steps and logic for updating device visibility) diff --git a/v-0.06/documentation/pulseaudio/introspect.c summary b/v-0.06/documentation/pulseaudio/introspect.c summary new file mode 100644 index 0000000..d9616f2 --- /dev/null +++ b/v-0.06/documentation/pulseaudio/introspect.c summary @@ -0,0 +1,79 @@ +* !pa_tagstruct_eof (context_string_callback): this function seems to be a callback function for processing string responses from the server. It examines the incoming command and checks for errors. If there's an error or if the command isn't a reply, it sets the success flag to 0 and prepares an empty response string. If the command is a reply, it extracts the response string from the tag structure. If there's any issue with extracting the string or if there's unexpected data in the tag structure, it flags a protocol error. + +* pa_context_stat: this function sends a simple command to request statistics. It leverages another function pa_context_send_simple_command and provides the context_stat_callback as the callback function to handle the response. It's used to retrieve statistical information. + +* pa_context_get_server_info: similar to the previous function, this function sends a command to get server information. It again uses pa_context_send_simple_command, but this time with a different callback, context_get_server_info_callback, to process the server information response. + +* context_get_sink_info_callback: this function is a callback that processes information about a sink. It first ensures that the operation and context are valid. If the received command is not a reply, it handles the error. If it is a reply, it starts parsing the sink information from the tag structure, extracting details like the sink's name, description, sample specification, channel map, owner module, volume, mute status, monitor source, latency, and more. The function seems to account for different versions of the context and extracts varying levels of information based on that. + +* pa_tagstruct_getu32: this function seems to be a snippet or part of another function and is possibly not a standalone function. It attempts to retrieve a 32-bit unsigned integer from a tag structure. If unsuccessful, it returns an error indicating a protocol issue. + +* pa_context_get_sink_info_list: this function sends a command to retrieve a list of sink information. It utilizes the pa_context_send_simple_command function and provides the context_get_sink_info_callback as the callback to process the list of sinks. + +* pa_context_get_sink_info_by_index: this function requests information about a specific sink identified by its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SINK_INFO) with the specified sink index and sends it to the server. The response from the server is expected to be handled by the context_get_sink_info_callback. + +* pa_context_get_sink_info_by_name: similar to the previous function, this one requests information about a sink, but it identifies the sink by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SINK_INFO) with the specified sink name to the server. The server's response will be processed by the context_get_sink_info_callback. + +* pa_context_set_sink_port_by_index: this function is designed to set the port for a specific sink identified by its index. After some validity checks, it builds a command (PA_COMMAND_SET_SINK_PORT) with the given sink index and port information, then sends this command to the server. The acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_sink_port_by_name: this function sets the port of a sink based on its name. It first performs some validation checks, then constructs a command with the sink's name and desired port. This command is sent to the PulseAudio server, and the response will be handled by a generic acknowledgment callback. + +* context_get_source_info_callback: this callback function processes information about a source. It starts by performing some initializations and checks. If the received command is a reply, it begins parsing the source information from the tag structure. This includes extracting details like the source's name, description, sample specification, volume, mute status, latency, and more. It appears to accommodate different versions of the context, extracting varying levels of information based on that. + +* pa_context_get_source_info_list: this function sends a command to retrieve a list of source information. It employs the pa_context_send_simple_command function, providing the context_get_source_info_callback as the callback to process the list of sources. + +* pa_context_get_source_info_by_index: this function retrieves information about a specific audio source based on its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source index and sends it to the server. The response from the server is expected to be handled by the context_get_source_info_callback. + +* pa_context_get_source_info_by_name: similar to the previous function, this one retrieves information about a source but identifies the source by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source name to the server. The server's response is again expected to be processed by the context_get_source_info_callback. + +* pa_context_set_source_port_by_index: this function sets the port of a specific source based on its index. After performing some validity checks and ensuring that the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source index. This command is sent to the server, and the acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_source_port_by_name: this function is designed to set the port of a specific audio source based on its name. It constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source name and sends this command to the PulseAudio server. The server's response will be handled by a generic acknowledgment callback. + +* context_get_client_info_callback: This callback function processes client-related information. It first performs checks to ensure the received command is a reply. If it is, the function begins parsing the client information, extracting details like client index, name, owner module, and driver. The function appears to be prepared to handle multiple client records in the same response and will loop through them until the end of the tag structure. + +* pa_context_get_client_info: this function requests information about a specific client based on its index. It constructs and sends a command (PA_COMMAND_GET_CLIENT_INFO) with the specified client index to the server. The server's response is expected to be processed by the context_get_client_info_callback. + +* pa_context_get_client_info_list: this function requests a list of client information from the PulseAudio server. It utilizes the pa_context_send_simple_command function and specifies the PA_COMMAND_GET_CLIENT_INFO_LIST command. The response from the server is expected to be handled by the context_get_client_info_callback. + + +* card_info_free: this is a utility function designed to free the memory associated with a pa_card_info structure. It releases memory for various properties and profiles associated with the card, such as its property list (proplist), profiles (profiles), and extended profile information (profiles2). + +* fill_card_port_info: this function populates the port information for a given card. It starts by extracting the number of ports (n_ports) for the card from a tag structure. If the card has ports, it then proceeds to fill in details about each port. If there's a protocol error while fetching the details, it returns an error. + +* fill_card_profile_info: this function is responsible for populating the profile information of a given card. It begins by allocating memory for the profiles and then proceeds to iterate through each profile, extracting details like name, description, number of sinks, number of sources, and priority. It also accounts for different versions of the context, fetching additional details if the version is >= 29. + + +* context_get_card_info_callback: this callback function processes card-related information. It starts by performing initialization checks and then examines the received command. If the command is a reply, the function starts parsing card details like index, name, owner module, driver, and the number of profiles. It then calls the fill_card_profile_info function to populate the profiles for the card. If there are any protocol errors during this process, the function handles them accordingly. + + +* pa_tagstruct_get_proplist: This function seems to be a snippet or a partial representation of a larger function. Its purpose appears to be to extract a property list (proplist) from a tag structure. If there's any issue during this extraction, it flags an error. + + +* pa_context_get_card_info_by_index: this function requests information about a specific card based on its index. After performing several validity checks, it constructs a command (PA_COMMAND_GET_CARD_INFO) with the specified card index and sends it to the server. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_by_name: similar to the previous function, this one requests information about a card, but it identifies the card by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_CARD_INFO) with the specified card name to the server. Again, the server's response is expected to be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_list: this function requests a list of all card information from the PulseAudio server. It employs the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_CARD_INFO_LIST command. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_set_card_profile_by_index: this function sets the profile of a specific card based on its index. After checking the validity of the context and ensuring the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the specified card index and desired profile. This command is sent to the server, and the response is handled by a generic acknowledgment callback. + +* pa_context_set_card_profile_by_name: this function sets the profile of a card identified by its name. Like the previous function, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the card name and desired profile, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_module_info_callback: this callback function processes module-related information. It checks if the received command is a reply and, if so, starts parsing the module details. This includes extracting details like the module's index, name, argument, and usage count. If there's an error or unexpected end of file in the tag structure, it flags a protocol error. + +* pa_context_get_module_info: this function retrieves information about a specific module based on its index. After conducting various validity checks, it constructs a command (PA_COMMAND_GET_MODULE_INFO) with the specified module index and sends it to the server. The response from the server will be processed by the context_get_module_info_callback. + +* pa_context_get_module_info_list: this function requests a list of all module information from the PulseAudio server. It uses the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_MODULE_INFO_LIST command. The server's response will be processed by the context_get_module_info_callback. + +* context_get_sink_input_info_callback: this callback function processes information related to sink inputs. It checks if the received command is a reply and, if so, starts parsing the sink input details. This includes extracting details like the sink input's index, name, owner module, client, sink, sample specification, channel map, volume, buffer usec, sink usec, resample method, driver, and more. It also accounts for different versions of the context, extracting varying levels of information based on that. + +* pa_context_set_source_output_volume: this function sets the volume of a specific source output based on its index. It starts by performing various checks, including verifying the validity of the provided volume. It then constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_VOLUME) with the specified source output index and volume and sends it to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_set_source_output_mute: this function mutes or unmutes a specific source output based on its index. It constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_MUTE) with the desired mute status and the source output index, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_sample_info_callback: this callback function processes sample-related information. It checks if the received command is a reply and, if so, begins parsing the sample details, extracting attributes like the sample's index, name, volume, mute status, proplist, and more. The function also handles possible protocol errors and is prepared to process multiple sample records in the same response. + +* pa_context_suspend_source_by_index: this function suspends or resumes a specific source based on its index. It verifies the server version, constructs a command (PA_COMMAND_SUSPEND_SOURCE) with the desired suspend status and source index, and then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_send_message_to_object: this function sends a message to a specific object within the PulseAudio server. After checking the server version and other conditions, it constructs a command (PA_COMMAND_SEND_OBJECT_MESSAGE) with the object's path, the message, and any additional parameters. The server's response will be processed by a callback function. diff --git a/v-0.06/documentation/pulseaudio/mainloop code flow.txt b/v-0.06/documentation/pulseaudio/mainloop code flow.txt new file mode 100644 index 0000000..f4c8b96 --- /dev/null +++ b/v-0.06/documentation/pulseaudio/mainloop code flow.txt @@ -0,0 +1,17 @@ ++---------------------------------------------+ +| Mainloop | +| | +| +--------------+ +-------------------+ | +| | I/O Events | | Timers | | +| +--------------+ +-------------------+ | +| | +| +--------------+ +-------------------+ | +| | Signals | | Deferred Callbacks| | +| +--------------+ +-------------------+ | +| | +| +---------------------+ | +| | Other Asynchronous | | +| | Tasks | | +| +---------------------+ | +| | ++---------------------------------------------+ diff --git a/v-0.06/easypulse_core.c b/v-0.06/easypulse_core.c new file mode 100644 index 0000000..15ec1ba --- /dev/null +++ b/v-0.06/easypulse_core.c @@ -0,0 +1,843 @@ +/** + * @file easypulse_core.c + * @brief Implementation of the easypulse core functions. + * + * This file provides the core functionality to interact with PulseAudio, + * allowing operations like setting the default device and adjusting volume. + */ + +#include "easypulse_core.h" +#include +#include +#include +#include +#include +#include +#include + +//Variables shared for count_profile function and its callback. +typedef struct { + pulseaudio_manager *manager; + pulseaudio_device *device; + uint32_t profile_count; +} _shared_vars_1; + +static _shared_vars_1 shared_vars_1; + +/** + * @brief Callback function to check the state of the PulseAudio context. + * @param c The PulseAudio context. + * @param userdata User-provided data (expected to be a pointer to an int indicating readiness). + */ +static void context_state_cb(pa_context *c, void *userdata) { + pa_context_state_t state; + pulseaudio_manager *manager = (pulseaudio_manager *) userdata; + int *pa_ready = &(manager->pa_ready); + pa_threaded_mainloop *m = manager->mainloop; + + state = pa_context_get_state(c); + switch (state) { + // There are other states you can handle, but these are the important ones + case PA_CONTEXT_CONNECTING: + case PA_CONTEXT_AUTHORIZING: + case PA_CONTEXT_SETTING_NAME: + default: + break; + case PA_CONTEXT_READY: + *pa_ready = 1; + pa_threaded_mainloop_signal(m, 0); + break; + case PA_CONTEXT_FAILED: + case PA_CONTEXT_TERMINATED: + *pa_ready = 2; + pa_threaded_mainloop_signal(m, 0); + break; + } +} + + +/** + * @brief Initializes the pulseaudio_manager. + * + * @param self Pointer to the pulseaudio_manager instance. + * @return Boolean indicating success or failure. + */ +bool initialize(pulseaudio_manager *self) { + // 1. Create the threaded mainloop + self->mainloop = pa_threaded_mainloop_new(); + if (!self->mainloop) { + return false; + } + + // Get the mainloop API + pa_mainloop_api *mlapi = pa_threaded_mainloop_get_api(self->mainloop); + + // Create the context + self->context = pa_context_new(mlapi, "PulseAudio Manager"); + if (!self->context) { + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // Set the state callback + pa_context_set_state_callback(self->context, context_state_cb, self); + + // Lock the mainloop and connect the context + pa_threaded_mainloop_lock(self->mainloop); + + if (pa_context_connect(self->context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) { + pa_threaded_mainloop_unlock(self->mainloop); + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // 2. Start the threaded mainloop + pa_threaded_mainloop_start(self->mainloop); + + // 4. Wait for the context to be ready + while (self->pa_ready == 0) { + pa_threaded_mainloop_wait(self->mainloop); + } + + pa_threaded_mainloop_unlock(self->mainloop); + + if (self->pa_ready == 2) { + return false; + } + + return true; +} + + +/** + * @brief Cleans up the pulseaudio_manager. + * + * @param self Pointer to the pulseaudio_manager instance. + * @return Boolean indicating success or failure. + */ +static bool cleanup(pulseaudio_manager *self) { + // Lock the mainloop before making changes to the context + pa_threaded_mainloop_lock(self->mainloop); + + // Disconnect the context + pa_context_disconnect(self->context); + + // Unlock the mainloop before stopping it + pa_threaded_mainloop_unlock(self->mainloop); + + // Stop the threaded mainloop + pa_threaded_mainloop_stop(self->mainloop); + + // Unreference the context + pa_context_unref(self->context); + + // Free the threaded mainloop + pa_threaded_mainloop_free(self->mainloop); + + return true; +} + + +/** + * @brief Nested callback to load sound card profiles for a device. + * + * This function is triggered after invoking pa_context_get_card_info_by_index() + * to fetch details about a specific card. It is responsible for allocating memory + * for the profiles associated with the card and populating them with the relevant details. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the pa_card_info structure containing details about the card. + * @param eol Indicates the end of the list. If eol > 0, the list has ended or no more data is available. + * @param userdata User-provided data, expected to be a pointer to the profiles field of a pulseaudio_device structure. + */ +static void load_devices_cb_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + + // Cast userdata to a double pointer to pulseaudio_profile + pulseaudio_profile **profiles_ptr = (pulseaudio_profile **) userdata; + + // If eol > 0, the list has ended or no more data is available + if (eol > 0) { + return; + } + + // Allocate memory for device profiles based on the number of profiles available for the card + *profiles_ptr = malloc(i->n_profiles * sizeof(pulseaudio_profile)); + if (!*profiles_ptr) { + fprintf(stderr, "[ERROR]: Failed to allocate memory for profiles.\n"); + return; + } + + // Populate the allocated memory with the profile details + for (uint32_t j = 0; j < i->n_profiles; j++) { + (*profiles_ptr)[j].name = strdup(i->profiles[j].name); + (*profiles_ptr)[j].description = strdup(i->profiles[j].description); + } +} + +/** + * @brief Callback function for retrieving device information. + * @param c The PulseAudio context. + * @param i The device information. + * @param eol End of list flag. + * @param userdata User-provided data (expected to be a pointer to pulseaudio_manager). + */ +static void load_devices_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + (void) userdata; +#if 0 + //Variable to check if devices need to be reloaded. + static bool reload_devices = false; + pulseaudio_manager *manager = (pulseaudio_manager *)userdata; + pulseaudio_device *devices = NULL; + pulseaudio_profile *profiles = NULL; + + if(manager->devices) { + devices = manager->devices; + if(manager->devices->profiles) profiles = manager->devices->profiles; + } + + if(reload_devices == true) { + for(uint32_t i = 0; i < manager->device_count; ++i) { + for(uint32_t j = 0 j > profiles-> + } + } + + manager->devices = (pulseaudio_device *)malloc(manager->device_count * sizeof(pulseaudio_device)); + + if (!manager->devices) { + free(manager); + return NULL; + } +#endif + +#if 0 + //TODO: rewrite this so that this is called every time load_devices has been called again. + //We need to detect that. + //size_t newSize = (manager->device_count) * sizeof(pulseaudio_device); + //pulseaudio_device *new_devices = realloc(manager->devices, newSize); + + /*if (!new_devices) { + fprintf(stderr, "[ERROR]: Failed to resize the devices array.\n"); + free(manager->devices); // Free old memory + manager->devices = NULL; + manager->device_count = 0; // Reset device_count to prevent out-of-bounds access + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + manager->devices = new_devices; */ + + if (eol < 0) { + if (pa_context_errno(c) != PA_ERR_NOENTITY) + fprintf(stderr, "Sink callback failure\\n"); + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + + if (eol > 0) { + manager->devices_loaded = 1; + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + + // Store the device's information + pulseaudio_device device; + device.index = i->index; + device.code = strdup(i->name); + device.description = strdup(i->description); + device.volume = i->volume; + device.channel_map = i->channel_map; + device.mute = i->mute; + + //Pulseaudio operation to fetch card profiles. + //pa_operation *profile_op = pa_context_get_card_info_by_index(manager->context,device.index,load_devices_cb_cb,&i->profiles); + //iterate(manager, profile_op); + + // Add the device to the manager's list + manager->devices[manager->device_count++] = device; + + pa_threaded_mainloop_signal(manager->mainloop, 0); + #endif +} + +/** + * @brief Load available sound cards (devices). + * @param self The pulseaudio_manager instance. + * @return true on success, false otherwise. + */ +bool load_devices(pulseaudio_manager *self) { + pa_operation *data_op; + + data_op = pa_context_get_sink_info_list(self->context, load_devices_cb, self); + iterate(self, data_op); + + #if 0 + pa_threaded_mainloop_lock(self->mainloop); + data_op = pa_context_get_sink_info_list(self->context, load_devices_cb, self); + pa_threaded_mainloop_wait(self->mainloop); + + // Once all devices are loaded, loads the active device. + // get_active_device(self); + + pa_threaded_mainloop_unlock(self->mainloop); + pa_operation_unref(data_op); + #endif + return true; +} + + +/** + * @brief Callback function handling the completion of the "unmute" operation. + * + * @param c The PulseAudio context. + * @param success A flag indicating the success or failure of the operation. + * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. + */ +static void operation_complete_unmute_cb(pa_context *c, int success, void *userdata) { + (void)c; // Suppress unused parameter warning + + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + manager->operations_pending--; + + if (!success) { + fprintf(stderr, "Failed to unmute the device input.\n"); + } + + // Signal the mainloop to resume any waiting threads. + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + +/** + * @brief Callback function handling the completion of the "move" operation. + * + * @param c The PulseAudio context. + * @param success A flag indicating the success or failure of the operation. + * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. + */ +static void operation_complete_move_cb(pa_context *c, int success, void *userdata) { + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + + if (success) { + pa_operation* unmute_op = pa_context_set_sink_input_mute(c, manager->current_device_index, 0, operation_complete_unmute_cb, manager); + pa_operation_unref(unmute_op); + } else { + // Handle error... + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + +/** + * @brief Callback function handling the completion of the "mute" operation. + * + * @param c The PulseAudio context. + * @param success A flag indicating the success or failure of the operation. + * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. + */ +static void operation_complete_mute_cb(pa_context *c, int success, void *userdata) { + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + uint32_t target_device_index = manager->current_device_index; + + if (success) { + pa_operation* move_op = pa_context_move_sink_input_by_index(c, manager->current_device_index, target_device_index, operation_complete_move_cb, manager); + pa_operation_unref(move_op); + } else { + // Handle error... + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + +/** + * @brief Callback function to handle each device input. + * @param c The PulseAudio context. + * @param i The device input information. + * @param eol End of list flag. + * @param userdata User-provided data (expected to be a pointer to the target device index). + */ +static void switch_device_cb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata) { + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + + if (!eol && i) { + // Move this device input to the desired device + pa_operation* move_op = pa_context_move_sink_input_by_index(c, i->index, manager->devices[manager->current_device_index].index, NULL, NULL); + pa_operation_unref(move_op); + } + + if (eol) { + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + +/** + * @brief Switches the device (audio source) for the pulseaudio_manager. + * + * @param self Pointer to the pulseaudio_manager instance. + * @param device_index Index of the device to switch to. + * @return Boolean indicating success or failure. + */ +bool switch_device(pulseaudio_manager *self, uint32_t device_index) { + // Ensure the context is valid + if (!self || !self->context) { + return false; + } + + // Check if device_index is out of bounds + if (device_index >= self->device_count) { + fprintf(stderr, "[ERROR]: device_index out of bounds.\n"); + return false; + } + + self->current_device_index = device_index; + + // Set the desired device as the default device + /*fprintf(stderr, "[DEBUG]: self->context = %p\n", self->context); + fprintf(stderr, "[DEBUG]: self->devices = %p\n", self->devices); + fprintf(stderr, "[DEBUG]: device_index = %d\n", device_index);*/ + + if (self->devices) { + // Check if the name attribute is NULL + if (!self->devices[device_index].code) { + fprintf(stderr, "[ERROR]: Sink's name is NULL.\n"); + return false; + } + //fprintf(stderr, "[DEBUG]: self->devices[device_index].code = %s\n", self->devices[device_index].code); + } + pa_operation* set_default_op = pa_context_set_default_sink(self->context, self->devices[device_index].code, NULL, NULL); + pa_operation_unref(set_default_op); + + // Use the introspect API to get a list of all device inputs + pa_operation *op = pa_context_get_sink_input_info_list(self->context, switch_device_cb, self); + + if (!op) { + return false; + } + + while (pa_operation_get_state(op) == PA_OPERATION_RUNNING) { + iterate(self, op); + } + + pa_operation_unref(op); + + return true; +} + + +/** + * @brief Process PulseAudio profiles using a null sink. + * + * This function initializes a null sink, iterates through all `pulseaudio_profile`s, + * retrieves the number of channels from the device's channel map, assigns it to the + * profile's `channels` attribute, and finally unloads the null sink. + * + * @param manager A pointer to the `pulseaudio_manager` structure. + * + * @note This function uses the `iterate` method from `pulseaudio_manager` to wait for PulseAudio operations to complete. + * + * @warning Ensure that the `pulseaudio_manager` is properly initialized before calling this function. + */ +void get_profile_channels(pulseaudio_manager *manager) { + uint32_t module_index = PA_INVALID_INDEX; + + // Static variable to track if the mainloop is locked + static int is_mainloop_locked = 0; + + // Check if the threaded mainloop is locked + if (!is_mainloop_locked) { + pa_threaded_mainloop_lock(manager->mainloop); + is_mainloop_locked = 1; + } + + // Callback to capture the module index when loading the null sink module + void load_module_callback(pa_context *c, uint32_t idx, void *userdata) { + (void) c; + (void) userdata; + module_index = idx; + } + + // 1. Initialize a Null Sink + pa_operation *load_op = pa_context_load_module(manager->context, "module-null-sink", "sink_name=easy_pulse_null_sink", load_module_callback, NULL); + if (!load_op) { + fprintf(stderr, "Failed to load null sink module\n"); + if (is_mainloop_locked) { + pa_threaded_mainloop_unlock(manager->mainloop); + is_mainloop_locked = 0; + } + return; + } + + // Wait for the operation to complete and for the callback to capture the module index + iterate(manager, load_op); + + // 2. Iterate through Profiles and Extract Channel Map + for (uint32_t i = 0; i < manager->device_count; i++) { + pulseaudio_device *device = &(manager->devices[i]); + for (uint32_t j = 0; j < device->profile_count; j++) { + pulseaudio_profile *profile = &(device->profiles[j]); + + // Extract the number of channels from the device's channel map + int num_channels = device->channel_map.channels; + + // Update the pulseaudio_profile with the number of channels + profile->channels = num_channels; + } + } + + // 3. Unload the Null Sink using the captured module index + if (module_index != PA_INVALID_INDEX) { + pa_operation *unload_op = pa_context_unload_module(manager->context, module_index, NULL, NULL); + if (!unload_op) { + fprintf(stderr, "Failed to unload null sink module\n"); + if (is_mainloop_locked) { + pa_threaded_mainloop_unlock(manager->mainloop); + is_mainloop_locked = 0; + } + return; + } + + // Wait for the operation to complete + iterate(manager, unload_op); + } else { + fprintf(stderr, "Invalid module index for null sink\n"); + } + + if (is_mainloop_locked) { + pa_threaded_mainloop_unlock(manager->mainloop); + is_mainloop_locked = 0; + } +} + + +/** + * @brief Retrieves the number of channels for a specified device. + * + * @param devices Pointer to an array of PulseSink structures. + * @param device_index Index of the device whose number of channels is to be retrieved. + * + * @return Number of channels for the specified device. Returns -1 on error. + */ +int get_active_profile_channels(const pulseaudio_device *devices, int device_index) { + if (!devices || device_index < 0) { + fprintf(stderr, "[ERROR]: Invalid devices array or device index in get_device_channels.\n"); + return -1; // Return -1 or another indicator of failure + } + return devices[device_index].channel_map.channels; +} + + + +/** + * @brief Callback function belonging to set_volume. Triggers when audio volume is set. + * + * + * @param c Pointer to the PulseAudio context. + * @param success Indicates the success (1) or failure (0) of the volume setting operation. + * @param userdata User data provided during the set_volume operation, expected to be of type `pulseaudio_manager`. + * + * @note On failure, an error message is printed to stderr with the reason for the failure. + * @note After the operations are processed, the function signals the main loop to continue. + */ +static void set_volume_cb1(pa_context *c, int success, void *userdata) { + (void) c; + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + + + if (!success) { + fprintf(stderr, "[ERROR]: Failed to set volume. Reason: %s\n", pa_strerror(pa_context_errno(c))); + } + + // Debug: Print cvolume values for each channel as percentages + //pa_cvolume cvolume = manager->devices[manager->active_device_index].volume; + + /*for (int i = 0; i < cvolume.channels; i++) { + float percentage = (cvolume.values[i] / (float)PA_VOLUME_NORM) * 100; + //printf("[DEBUG, volume_set_complete_cb()]: Channel %d cvolume value: %u (%.2f%%)\n", i, cvolume.values[i], percentage); + } + //printf("[DEBUG, volume_set_complete_cb invoked. Success: %d\n", success);*/ + + // Decrease the operations count and potentially signal the condition variable. + manager->operations_pending--; + + // Signal the main loop to continue + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + + +/** + * @brief Callback function belonging to set_volume. + * Triggers after audio volume levels are updated. + * + * @param c Pointer to the PulseAudio context. + * @param success Indicates the success (1) or failure (0) of the volume setting operation. + * @param userdata User data provided during the set_volume operation, expected to be of type `pulseaudio_manager`. + * + * @note On failure, an error message is printed to stderr with the reason for the failure. + * @note After the operations are processed, the function signals the main loop to continue. + */ +static void set_volume_cb2(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + pulseaudio_manager *self = (pulseaudio_manager *)userdata; + + if (eol > 0) { + //printf("[DEBUG, volume_check_cb()]: End-of-list reached.\n"); + self->operations_pending--; + return; + } + + if (!i) { + fprintf(stderr, "[ERROR, volume_check_cb()]: Null pointer for pa_sink_info.\n"); + self->operations_pending--; + return; + } + + if (!i->name) { + fprintf(stderr, "[ERROR, volume_check_cb()]: Null pointer for device name.\n"); + self->operations_pending--; + return; + } + + printf("[DEBUG, volume_check_cb()]: Processing device info for device: %s\n", i->name); + + // Update the volume values in the manager's devices structure + self->active_device->volume = i->volume; + + // Print the volume for each channel + for (int channel = 0; channel < i->volume.channels; channel++) { + //float volume_percentage = (float)i->volume.values[channel] / PA_VOLUME_NORM * 100.0; + //printf("Channel %d Volume: %.2f%%\n", channel, volume_percentage); + } + + //Signaling to continue. + pa_threaded_mainloop_signal(self->mainloop, 0); +} + + +/** + * @brief Set the volume for a specified device. + * + * This function allows setting the volume for a specific device based on the given percentage. + * The function performs various checks to ensure valid inputs and that the PulseAudio system is ready. + * It will adjust the volume for all channels of the device to the desired level. + * + * @param self Pointer to the pulseaudio_manager instance. + * @param device_index Index of the device to set the volume for. + * @param percentage Desired volume level as a percentage. + * @return Boolean indicating success or failure. + */ +bool set_volume(pulseaudio_manager *self, uint32_t device_index, float percentage) { + if (!self || percentage < 0.0f || percentage > 100.0f || device_index >= self->device_count) { + return false; + } + + // Convert percentage to volume + pa_volume_t volume = (percentage / 100.0) * PA_VOLUME_NORM; + if (volume >= PA_VOLUME_NORM) { + volume = PA_VOLUME_NORM - 1; + } + + // Debug: show index and desired volume. + //printf("[DEBUG, set_volume()] Index is: %i\n", device_index); + //printf("[DEBUG, set_volume()] Desired volume: %f%% (value: %u)\n", percentage, volume); + + // Ensure PulseAudio is ready and devices are loaded + if (self->pa_ready != 1 || self->devices_loaded != 1) { + return false; + } + + // Debug: Show channel volumes before the change. + /*for (int channel = 0; channel < self->devices[device_index].channel_map.channels; channel++) { + printf("[DEBUG, set_volume()]: Channel %d Before volume: %f%%\n", + channel, + 100.0 * self->devices[device_index].volume.values[channel] / PA_VOLUME_NORM); + }*/ + + // Create a pa_cvolume structure and set the volume for all channels + pa_cvolume cvolume; + pa_cvolume_init(&cvolume); + cvolume.channels = self->devices[device_index].channel_map.channels; // Manually set channels + pa_cvolume_set(&cvolume, cvolume.channels, volume); + + printf("[DEBUG, set_volume()] channels: %d\n", cvolume.channels); + + // Apply the volume change to the specific device by index and wait for the operation to complete + const char *device_name_to_change = self->devices[device_index].code; + self->operations_pending++; + pa_operation *op = pa_context_set_sink_volume_by_name(self->context, device_name_to_change, &cvolume, set_volume_cb1, self); + iterate(self, op); + + // Fetch the updated volume for the device and wait for the operation to complete + pa_operation *op2 = pa_context_get_sink_info_by_name(self->context, device_name_to_change, set_volume_cb2, self); + iterate(self, op2); + + return true; +} + + +/** + * @brief Iterates through operations in the pulseaudio_manager. + * + * @param manager Pointer to the pulseaudio_manager instance. + * @param op Pointer to the pa_operation instance. + */ +void iterate(pulseaudio_manager *manager, pa_operation *op) { + //Leaves if operation is invalid. + if (!op) return; + + bool is_in_mainloop_thread = pa_threaded_mainloop_in_thread(manager->mainloop); + + // If we're not in the mainloop thread, lock it. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_lock(manager->mainloop); + } + + //Wait for the operation to complete. + //The signaling to continue is performed inside the callback operation (op). + pa_threaded_mainloop_wait(manager->mainloop); + + //Cleaning up. + pa_operation_unref(op); + + // If we locked the mainloop earlier, unlock it now. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_unlock(manager->mainloop); + } +} + +/** + * @brief Create a new pulseaudio_manager instance. + * @return Returns a pointer to a manager structure. + */ +pulseaudio_manager *new_manager(void) { + pulseaudio_manager *manager = (pulseaudio_manager *)malloc(sizeof(pulseaudio_manager)); + if (!manager) return NULL; + + + // Initialize pointers to 0 -- good practice. + manager->device_count = 0; + manager->devices_loaded = 0; // Initialize to 0 + manager->load_devices = load_devices; + manager->destroy = destroy; + manager->switch_device = switch_device; + manager->set_volume = set_volume; + manager->get_active_device = get_active_device; + manager->iterate = iterate; + manager->get_active_profile_channels = get_active_profile_channels; + //manager->get_profiles_for_device = get_profiles_for_device; + manager->get_profile_channels = get_profile_channels; + manager->get_profile_count = get_profile_count; + + if(!initialize(manager)) { + free(manager->devices); + free(manager); + return NULL; + } + + manager->device_count = get_output_device_count(); + manager->devices = malloc(manager->device_count * sizeof(pulseaudio_manager)); + + if(!manager->devices) { + fprintf(stderr, "[new_manager()] Could not allocate memory for the manager devices.\n"); + return NULL; + } + +#if 0 + if (!load_devices(manager)) { + fprintf(stderr, "No audio devices were detected. Aborting.\n"); + destroy(manager); + return NULL; + } +#endif + + return manager; +} + +/** + * @brief Callback function to process the PulseAudio server information. + * + * This callback is invoked once the server information is available. It retrieves the default device name + * from the server response and determines the active device by matching the name with the available devices + * in the manager's list. + * + * @param c Pointer to the PulseAudio context. + * @param info Pointer to the pa_server_info structure containing the server's information. + * @param userdata User-provided data (expected to be a pointer to pulseaudio_manager). + */ +static void get_active_device_cb(pa_context *c, const pa_server_info *info, void *userdata) { + (void) c; + pulseaudio_manager *manager = (pulseaudio_manager *)userdata; + + if (!info || !info->default_sink_name) { + fprintf(stderr, "[ERROR]: Null pointer in active_device_cb.\n"); + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + + // Get the default device name from the server information + const char *default_device_name = info->default_sink_name; + + // Iterate over the available devices to find the active one + for (uint32_t i = 0; i < manager->device_count; i++) { + if (strcmp(manager->devices[i].code, default_device_name) == 0) { + // Set the active device pointer when a match is found + manager->active_device = &manager->devices[i]; + break; + } + } + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + + +/** + * @brief Request the default device name from the PulseAudio server and determine the active device. + * + * This function initiates a request to retrieve the default device name (active device) from the PulseAudio server. + * Once the server provides this information, the active_device_cb callback is triggered to process the response. + * + * @param manager Pointer to the pulseaudio_manager instance. + */ +//TODO: REWORK THE WAITING LOGIC. +void get_active_device(pulseaudio_manager *manager) { + pa_threaded_mainloop_lock(manager->mainloop); + + // Request server information + pa_context_get_server_info(manager->context, get_active_device_cb, manager); + + // Wait until the iterate function signals that it's done + pa_threaded_mainloop_wait(manager->mainloop); + + pa_threaded_mainloop_unlock(manager->mainloop); + + // The original loop to wait for active_device_name to be set + int timeout = 50; // Number of iterations or timeout value + while (!manager->active_device->code && timeout-- > 0) { + manager->iterate(manager, NULL); + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + + +/** + * @brief Frees the memory of a pulseaudio_manager instance. + * + * @param manager Pointer to the pulseaudio_manager instance to be deleted. + */ +void destroy(pulseaudio_manager *self) { + cleanup(self); + + if (self) { + for (uint32_t i = 0; i < self->device_count; i++) { + if (self->devices[i].code) { + free(self->devices[i].code); + self->devices[i].code = NULL; + } + if (self->devices[i].description) { + free(self->devices[i].description); + self->devices[i].description = NULL; + } + } + // Now, free profiles for each device (if they exist) + for (uint32_t i = 0; i < self->device_count; i++) { + if (self->devices[i].profiles) free(self->devices[i].profiles); + } + if (self->devices) free(self->devices); + free(self); + } +} diff --git a/v-0.06/easypulse_core.h b/v-0.06/easypulse_core.h new file mode 100644 index 0000000..9129942 --- /dev/null +++ b/v-0.06/easypulse_core.h @@ -0,0 +1,90 @@ +/** + * @file core.h + * @brief EasyPulse Library Header. + * + * EasyPulse is a library designed to provide pseudo-object oriented programming + * functions to simplify access to PulseAudio. + */ + +#ifndef EASPYPULSE_CORE_H +#define EASPYPULSE_CORE_H +#define DEBUG_MODE 0 // Debug mode flag + +#include +#include "system_query.h" +#include +#include +#include + +typedef struct { + char *name; // Name of the profile + char *description; // Description of the profile + uint32_t channels; // Number of channels this profile has +} pulseaudio_profile; + + +// Forward declarations +typedef struct pulseaudio_manager pulseaudio_manager; +typedef struct pulseaudio_device pulseaudio_device; + +/** + * @brief Represents a PulseAudio devices. + */ +struct pulseaudio_device { + uint32_t index; // Index of the device. + char *code; // Name of the device. + char *description; // Description of the device. + pa_cvolume volume; // Volume of the device. + /* pulseaudio_profile *active_profile; // Active alsa profile of this device. */ + pa_channel_map channel_map; // Channel map of the devices. + int mute; // Mute status of the devices (1 for muted, 0 for unmuted). + int min_play_channels; // The minimum number of playback channels of the device. + int max_play_channels; // The maximum number of playback channels of the device. + pulseaudio_profile *profiles; // Array of available profiles for the device + uint32_t profile_count; // Number of available profiles +}; + +/** + * @brief Represents the main manager for PulseAudio operations. + */ +struct pulseaudio_manager { + pa_threaded_mainloop *mainloop; // Mainloop for PulseAudio operations. + pa_context *context; // PulseAudio context. + pulseaudio_device *devices; // Array of available devices. + uint32_t device_count; // Count of available devices. + int pa_ready; // Indicates if PulseAudio is ready (1 for ready, 2 for error). + int devices_loaded; // Indicates if devices are loaded (0 for not loaded, 1 for loaded successfully, 2 for error). + int operations_pending; // Counter for pending operations. + pulseaudio_device *active_device; // Pointer to active device. + uint32_t current_device_index; // The devices being processed right now by the program. It's not necessarily the same as the playback device. + + bool (*initialize)(pulseaudio_manager *self); // Initializes the manager. + void (*destroy)(pulseaudio_manager *manager); // Destroys the manager. + bool (*load_devices)(pulseaudio_manager *self); // Loads available devices. + bool (*switch_device)(pulseaudio_manager *self, uint32_t devices_index); // Switches to a specified device. + bool (*set_volume)(pulseaudio_manager *self, uint32_t devices_index, float percentage); // Sets the volume to a specified percentage. + void (*get_active_device)(pulseaudio_manager *manager); // Assures that a pulseaudio operation is not pending. + void (*iterate)(pulseaudio_manager *manager, pa_operation *op); // Goes through every step of a threaded loop. + int (*get_active_profile_channels) (const pulseaudio_device *device, int device_index); // Gets the number of channels of an active profile. + //void (*get_profiles_for_device)(pulseaudio_manager *manager, const char* device_code); // Updates the profiles of a particular device. + void (*get_profile_channels)(pulseaudio_manager *manager); // Extracts profile channels by copying them to null sink. + uint32_t (*get_profile_count)(uint32_t card_index); // Gets the number of pulseaudio profiles in the system. +}; + +/** + * @brief Create a new pulseaudio_manager instance. + * @return A pointer to the newly created pulseaudio_manager instance. + */ +pulseaudio_manager* new_manager(void); + +bool load_devices(pulseaudio_manager *self); +int get_active_profile_channels(const pulseaudio_device *devices, int device_index); +bool set_volume(pulseaudio_manager *self, uint32_t devices_index, float percentage); +void iterate(pulseaudio_manager *manager, pa_operation *op); +int get_device_channels(const pulseaudio_device *devices, int devices_index); +void destroy(pulseaudio_manager *manager); +//void get_profiles_for_device(pulseaudio_manager *manager, const char* device_code); +void get_active_device(pulseaudio_manager *manager); +void get_profile_channels(pulseaudio_manager *manager); + +#endif // CORE_H diff --git a/v-0.06/examples/Makefile b/v-0.06/examples/Makefile new file mode 100644 index 0000000..6f11288 --- /dev/null +++ b/v-0.06/examples/Makefile @@ -0,0 +1,19 @@ +CC = gcc +CFLAGS = -Wall -Wextra -g -O0 + +LIB_DIR = ../ +LIB_SRC = $(LIB_DIR)*.c + +EXAMPLES_DIR = . +EXAMPLES_SRC = $(wildcard $(EXAMPLES_DIR)/*.c) +EXAMPLES_OUT = $(patsubst $(EXAMPLES_DIR)/%.c,$(EXAMPLES_DIR)/%,$(EXAMPLES_SRC)) + +all: $(EXAMPLES_OUT) + +$(EXAMPLES_DIR)/%: $(EXAMPLES_DIR)/%.c + $(CC) $(CFLAGS) $< $(LIB_SRC) -o $@ -lpulse -lasound + +clean: + rm -f $(EXAMPLES_DIR)/*~ $(EXAMPLES_OUT) + +.PHONY: all clean diff --git a/v-0.06/examples/alsa-mapper_pulseaudio-api b/v-0.06/examples/alsa-mapper_pulseaudio-api new file mode 100755 index 0000000000000000000000000000000000000000..64fafb7b8d2e9d474863889c8768aeec86415b2e GIT binary patch literal 83944 zcmeFad3;sX)jxcudvi11lL^9n84U;+0TEC%2*Hb@1{KATKoTSZNel^sil9N|lI9Um z9BE5!t2k7tbwHegQ*dgLwu-H_)LNSeT3UzFip~4|uD#E>CrH$%zt8Xe<9)q+ID4;Q zuf6u#YwxqqI_uu7D49OhGEKw#*v1J4p_PLardSg;pOEA!HpUs5MzJy27-WP&cktii zJG9(wfryV+Migk+DA}%nmBW<1725DhuXmPg*VU(>r=obJ;VPKzLafGk!6znHzx>y6 z3iiriJL#`X^B+=Pn5*z!8Ei+}Y+0`8TbetUtMwpUQ3^DzC(XrnExKKcZs(PTwx?Hm z_M|xeAE)hkXju#zKgDu2j6>Tk)$I-~r)Yk!WFP#T^_TjJ|E9lE-R^}dCFjs`A14YQ zuk`wxfp#g1^sTPioW_~Dzpmz?RNK=lb@#?m3#;ai9dp#eiV+K|svDM$SUPU(h_Pcv zF0L6lO8Tc>MflI@JNfjPhPBdYA`lsSQdFVG%af|`PO~?NQEAF^z{6Ct!Wkiln zpF1&toK6@8T!i9q_(|yeaQOS7z~S(Fx{y=aMZb@CA!l|M{eI8|egWhUP($f-JsSo) zoSq+cfnVK)KEKAq9Zt?YU5qQW3q9#1hm&(!7xEW&fj_egIsLleU(?0BeA2~uujyi3 z4|ZX<%ev6#*Imeub-{mB7yJ))q0fh1;4klDynpM$KHuv?pJ83-b9EQ|S9GDz>s|0a z--Vu;UG)3=F67_T1^$jM@XvQ)hpevfUCjGkUC2-E0)KlKa;9{FAJK)JSG&MZ>_Y#( zUD)&aF67+Tg`79K&~s`R^Ekf?{!_Zphx>mF{}27l>w^EMUHH|=F8Y0{i}7~v0{?y& z{a)XNeZYQL{fBpfzZdw!?T6QQq5q$|(DQFy$oU`P&oXW=1Oq;snbm)T3laQclK$M7uHl)o;_#o!b(Lu zETwkN?DCrG`pTvCvlrIPshGW}rlJ82fUcikS2?Gm5~w*<)eCECYQa#xfRvir%DOrA zRp`5+x~_8G;hC$dwS>cy7uVO+9-eYZW&P|qwN)f~npIa`9t6ozKBul?c2)Jfn%N66 zTvB~CFKejkjF?wfDI@a4vHjx8x+Rr$BH{3AEUvnwdd|YGyPdlXjVmgb200c}a8>n! z*-L5`HY}=~4W8;bi=^+x^>vkXbv1Q|@2mj^R<^CJtEuIPW<$xvB3sLX?8CQ}`44I# z!>ehiE3fQqAaD2;Rf|!rt}GXUyDs1B;%&sk8#PwY*KzaSbQgqXFxbFRC@>)z(#2*UvNN)YnuQiz*j!=|V*PvRZ5j z+(pS)(NJq(gB3}Ot96UT_1M6%M>Nz!wK`+o<#koC)NJ-qzF>Cw`~|b;&8b>wpx@et zg^Mfs&{srg&f=Pe>I(G?NTpaCYfPGc)}+}*Bgc;{sw*GkLq_S$>1UP9E;3G@KJBE* zvqy~_ZE+IZee)>H6AuV@yy_@9s^|CB@z z=gCY;w(-ztqc8HSc6fT#?McI}SFWjez~p&^&%JqRkKu7VWDL-_Wk+0&TfJix$wMgl zP2&sPQ@!&`?Ug?QWEdRwh(9JRaIp&Dltjpas^H?PSx-u>uy0UY|PYfL(eKa zT3bdLV1B&#ig(|x9jx$Mb^OG`$27j^ko&v`x7?`OQEZy3%5_HoUl73W4B#gQ@Vf)} zk^p{B06#T=_s$(Kl03Kjq_wKX*ay#2-X{{kbAG&!8^Gg8=6?zTcpMS^Pb`3E-`=M% zfY&A#Qc(aOjK_=%;5}QjL2&@@#X^XW2k_}c=uc??pWz`<&I;h+DE_A`fY0)=hA}^Y zj|T9y0lXW)FAdM19(0Qd7sh%euRfaIV*r48NinX@J9vk^8@&z0KPVWKRSS48o-YV;8zCl zqXYQW0sNQ%er*8HJDT^oEr1{EAyIA$;ExU9HwWUS3S&H~?A;5!Taf7=3|MEm|b-ncIkZwkF!gJb!1 zE%jE%&UoVsk>_RL9ml)^bjRS=aE4#{`~Bn2!|guE6IL=A%TrA@G@mqlEYW2Z+I^ z5OxXg5%?s+*@SlrJb`cy;TC~M5#}R8`xb$R5$2;o`zC=05auI6`&xl}66T{o`$~ax z2=fu3y;k5f!h8g6FB8}z%twLtQi1qIFpuW#wF0jp%p-YwnZVZ)=25)8RNyNJ^9bHv zEN~rR9=+R(1iq9okKFAsf#(wDQM=t0_{ZdTwoZV&Knu+w+cd}4h20XuHK6o2DC^?4BR z+e?*zNXMRe(SFd*Yft@FPV9rWM#Jct@y3a3z-h!2f2q%mH%u|YLv zG~Qeq*~cw&7DuMuG;5mG8g%oqt!>|f2vKP77%hg3pZ|+(THC5Q zpu~0agOXa?X0h8Qjh%U*B7S6^7^*(hHUeXO`FXKr4EqM;=*^Qm~^v@MOx zpE9n_jyIJ6+1h47c6%{yR6w-En^w+ZwK+c(OGm4_iQ`C=?CH$#1=gBoSfLo&Iy1bV zWVl!{?2k7tZ!_w%z}LpEZ-AD2Lt8Pbjzq~jjmzKZsLyCBd4~gsQlKbHmK;F4Jw|?EzfpgQ>J4f)?2k8{hR$d1nFc3Lyo5#2Abo3hC_4cC8W@I11B&B@Ajb*h z5K?Q~DCqiZ8hUP9joRL!s_y}QZ!`BO0ds=_zWisv-Y)EoUZ@s(Yi)ZLf*KDv^-)~v zCN#E%8V{J4kJ{UZbmd{qnY>A92i*g0_G0yw?Dt*iBRIldbM0DxPGfC7l}%}MF=iUa zkSJlN`!RoEQBT}$6O`lPfrZF@Al{sLrZ}T4hvz5<*e7Ug(Z=ufWXuo6`-ricmxH>G zzNz~j3H(;J_w_4+4R*r@JHfIOohvmPTY7610mFN!Qwi8w+crX4qU8O?YrNQcjAf2E`F;b7 zf1RB06FpPXCarBPpJ~g2`7pEcb8ut#7#!&6UB870SmE`%_sjs(y}<5`1`vhx3s|73 zxHs+*9|S1>qve6pc))5%kwIWR!Z^t(R&GwiD78~nBY+qqhH+gJOVrSfJ!6uGf z+NLhcIa|Pszq;N?Ft=ADl&-n?hw+)qWqT-97g?cKeG zGv7~?iq4Si@~o=2thlQelMIpz8H2>UsP5U(?Q>N}eFGi6jy24VzK?OJjvfS6Dc+UD z+K4x>4}+pno2%RSjkmg3wOQkki&7jxx^K>ZH5aqwm9+T znLFpT8q=PHi{2wH8n@=P7N-h89tsvmuyR#`&GsiIWE$lYEsgLAT>PokuywPdp}P68utBCCrauW9Dy&KoyeErBfn9MQ*CZUleyv6e*115Gm@ z0B%R3)NL%;%~?TBg`Nio+~-OqR0z92;#}Pg0zZ4p z;Cx$!tc=7I*S*}C%e3&|&OAm7uMpw$l<@(wpH|I}DE486a1u^JlR&Uiz6ccdEH2Urv0j(ZE??eTK#gPkTY!8`Z?Y<9^> z>2%^e^zI}#BP>GR)LPq??t`DVwq1il&H|xxsY-L^X6c=WVOh0pTQCgv)9Jn@9S3&G zJK>air~IbF$<=t!D{1qkwc#$=zL`$kxO}J4FdjDf5fNOB;p0} z#H<*wPbusR3R?(l5wNc*>~9oy9I(Z}zN4@_OF=>$*ivBkDeR{TI}6w{U=J#+LoE~W z`M}l!n;}Zyk*BargdFWQ$C_F}e(Y)y2TB1h@&*cL@ ziMmpY9u<0VgkfBsg9muZ;+}CG#ntHtkvE|-TYeHfUmE-)>gL~y7W1NoJN^;9_!YpR z8v*|#dfxVb#G}Jo64#xL=GQ#UYe$D+EJ4C{U;IL@05cm~jY#sJpq4l8Ll6;|P5 z>BUu|_~K32OgB)uLzbhtL$AZt5{-#Iri&d-8>oerrlKydLY~jiBHmUwoD-`T-IHzK zra!s)BvdTL8w3uY*mh+^SXsW#JnA;nwDIN*5(#R0bQU0WUfaPZTa5BE_Nt;d$w-Yf zQhO$z3_RmW*G(IQs6?sz-oLe|HSHp5K6`B1pbAk+pQn34l-%EWCJ4rAu0cb87mLYR zJ<)(T({hA7=4*eXu5Y*Tz!2TgvbqG8Ea_<6Z?0;o4?fV{@K^RN4$KB|YJ@W(>%&n` zHiFmrTz8=n_HthX_gOBTwo_#|*lguIqkZIL`UrN$*5U&2=xWTX;vBw4PC=z{G68%M z&*V616l?IOIQ{{|iWlmA5;iNHrNNIVJW*Pv!M$>}Dy0P|>TW(GCrYsc2*^ikfJ-$v zhX<>~+Lc-eRa2}X358l zi=mfqfS9;^(jm9MFEiAp7M#RN-bkLaM}Oc^#i|vZ!QY~7Yso>rX4s1fp_7XT`5~;1 zT?(7jWtYEbiVLMnj5D*T$a90pjq2L zz(w^z%ff(%vn)<-)4!1kef;z<-e|iJ)>;hD|HcmG!Rnhjl;ttzn>%D&+-NL0z!`3n z89orbHVxYz3{TSDbCV-Gc$nd@CM_)f1!Z17Ke4 zc@OHBpnmA&al#r9I}4qEwpvR)p|ZD@rVb&lwe4bf)n4o^p-N$DZMz8HJpJn48w1B= z&5`~dnqV^yjnar$&_oo2yk|hffdAydKL9Pc8?)8HvsBM{;5=ky@Mb_yhMXlBP@?2u z#*3nHg z*$rZUm@Pxc;(g8BwhO=$PlTqhNmFQ|lG4EEa#N&i-^LrBXV?g$0hAnqd&!R5em9+< zDdgxb4`SR9_vM*_{hWo~^B!g$dus21xZe&UuC?tkD$x{rR#@;p;ZL6QxRU-L3C;P> z3%f+MZr&sPe4m7-&@C)@B`h?>8hV|g{8HvpWn|OC>3wYKS7B*nMHHv z3CZ26Qk)>vS2rAjhUhk`!MFY>pbIehK~GTh)9BNUJodH#FP3Wi2pu8nXt>!FWXDKDto_sc@r7 zsL#@zd(c*Q&9h~wSmQTyPMbnUYj7C{-x}%*kRMP|NP)1PsDDwahWI>f(i&<5$WL zO{Mr@A5xn`Pl+ljh`x+RjLBNJ9s%8=TDOzgDdOc|@vV3h7F0W*Mj3{`8UfP$Ih4R# zgOO-K^aZbzcgFetgV<1Bu83=0I{w{}#;CX(^p*)Pe`wKX6 zIt0P0%z5yv+R&dk%s-bs);m~y&EJM?+8-3P@_)v*hv+N;)tz|Rw{;Ae5^q8HC-I+x zP4_A{FsV0XE))SX+nRC`yYN~7gMKC6)RSF5OoyiWa+H%hF?LA}G-ZzNvf(mmIN4Qt z$wN*_TLPdT@aK}$$BwphZ9L+Ze2TD1V~eQ`kKR}PfxU-bKMepXXPmBBaQL`xdH|%NT5rL9KlTlq{*8Df?X>Cd^by?jKb)pk z8B?0PwXp>EDmwGW=vZy~^T269C$3GldPKJhuFa*o)mFb%5jbBVCvFv3Hh)eYKz;(A zc;G&43^eY42Ba5eT`EH{=MMW>Uf4Ex5;Eng+IIeMId7h5# z{4piuYV3|Tm$W^Bx?beq+4C094}AA;EaPs6=x%Wg0lD^Hf~##kREz&Nxj7~K+sP)k=~>VLy13r+|8Y53MG!ZBm)N*x&GY+syP2X|(3e!!!yV(umF^ zC-;5mm7$nJ?$6f&ojh20k$`V$_uCLc=e`}Z`?WZA)9xGJ)*kgWcAp;@!B_3xlXm(q z?fxz#A8Pmee)|=>-veuX#qQ6s?bq0SJ@ooYqvk^z`F5`d;V^d31iF*mgC|RF4om6Z zdkm&?gvzD{_KzQ<`}Xg_G5sxMQjoj~H_vG$rU4EBg#Z@p7&9 z;;^L|#?VT<%?0z7@IIT9kqCWW!Zj576$<|tlLL}Jl$d`9lso$p^20+AX!ZA;_0m~u z+ZAZ1?(Azo#jSV)nE7dY3GaY9ZDc8UJEsublKN|*oj;h=VRxT!0>ZnQGJTTnTk7|WQQ>) z2)3tN@7Jb%8GZ6Lx)OSKw*P_xnn_mmBfk#X|2*)?Y2zcAme3OP3f-{EtmB} zPMtp#d97{Tp&M9YL4C_1DR}o%Gu9gF4kmuu;(pvxKRYCR1g-yL#1`4#Xz+U0pRN15 z2eM^K`QkbB1Uc1v>id#6gvMQ+E&oS(*%jIdW^MUv_U(jh{f;A^c(fSDj>LxJdH6^) z7oj+0dun`|G@~BTv(PaR<9p^(PIA+AY{D(+ZS>r}TJ8cGr{egHPtTI}gTTwaWY!c( z&54US;l!P)+A1Dz?c9nKa6NYi-e5GSw+#ujp*YogYmU&{R*~Ogy~dI^$vya8N}r?(DO4Z#iIIE z#~w~W@=eP+akG3*)gaM0S84YlKeCxc9R za~0Z!24B0EF#k5R3S7QjS~25$kM=kA`9a$Kq#>tTHW@yJATrP!Meu~k9c%X?t3%#8 zcQWA<&@Z{0{`y2^fqq7Ej$84y2hQ@*xohX#P7k1n`d6+{?9Oy1RoaTz_EV8Tnv;UWhGfb$yeqzAm ze+z}%H^ZW2KxztN2XU2k5lEjDQ}G<53^PLpi34=PVk?#X$i`o3DM>W4R-|=n+ugqD zaaYC8%3HL0E%&`3r8EN4ftQM1Pc8K@wm(rC`KIwoIPhwo67D-bFwT!)s`i8$C;D6| zw;@Cxm$jCB3aqggZck+tLGn4FcTqA4C20;5BZes?D6!-W6!!!pzZg_$mD#<@x{wV{+ZHv|2DGt+f>;r^s>;~$QBWwZO%N9 zjFSw6N{~aV%gLn!uQI$hemaW~dhR>iTrqbr)aXf-E#*diUR%yC15)pW)Z|M(jA-9g zKSq!H_4Mf6HFZk0me6yBO;gsoDrxm_!Aiy# zmvLg>m=Lf<9){cgC3YJx{22NN$W8g5;_5}>0^!FE!M3|$^7id$+m!zz8-TNiI^LP+^8=MDE;hw*d zDmH~0G|N!>4>ZE273!~9mMNBN!Q!j_BIa42rbG9F(3F2au1Q1wZ(^eP{PtB-=A{(y za(w%r0x{7ah&y3~*rRk1DG(FQKS~-NeVB%o(r~hib2q4rbcWJU=^PW4w@m5|dxE-u zOvP&_g~y|)+eh$-_{ms~bo(}JE4~N*Gn2U1wtu2ywL38E zl?t7_u-DVNRnWD~EY)he--`RyugUq9uvec}nF(yw>In2Nytz2c5h(l;@1Xv7ef@9u za%#W(d}o30Eb#wV3#ear!#8p-pD?(>sHj|0RbDx=qH=M0T~#fAeAJk;aPgdx{2fqL zQylpHcl^-dgxKK4!(%h2l$;X_v`|?7Dqf5~%Q+!N(Tj%YmUC^v*%Uf2mUJSWNJ(KOMa6Y zDynK?r_HIJbBRV97nGcN<{4*RG$A$>KlxW#5v#9>$*%?Cw-aOdQNfzJWij*-!w-he z1AQ^NQJ*AxLp6WAGFCso5>}x3pcZ~wP;>h76;1t)W~`>6K2|d?HkZFAsAT$lG{g~$ z#dNW%#j(?8PM=Ou@`I{7$E#eo%G<5hKWIB=zHOe8xzK zkq}dy-Y^1u>eoQK;+$5!1V77Ip_^lf_)%7|j4xS<^vB^fP~%=4n^RXeXITuU^o>Lb zRn;;6{-ZXI_e+r&urDV$5d6SnO#O`N$k>^%LQOSYO^-zJ57!L%5ywjYl;hmOp_tm! zIr!Qd{90sXotn)#-mja^tLZdP-?F_P0;fYaH!he`a?;F`58uADuBND$x-XqmGiwz*PxkHH z$w-)%Ipy_L_!U@hX6DL3cOYoT&w0gC82gLWxG##G;r&{%=d@`7*DA+PaB@BApE!o7 zgS$G|rlV% zDhkQCa7)2P$PsY~aX6kJ{K6`JQCW6BW#TUQ1KYVjb8;WhQ~E9E$G;8v{C(v#v4(@)25$s55>d%Y#!pv$qGHc;n ztKETZ(3p&$9>#E!LSp!--ipiT)K$iOXN%znejCc`8|rY#@NNX(pty3czzX*Eue0Qb z$hk#xmx}S1*r_ac8T|bhf1Ce?ab8%htf}@J<>KBB`oCFyU9P{cip0E|z3k)K5cEJG z(75oij*i}zVLY|1qr*Y@=#w2C{96j<(|DhS^0H?-I#!|lEy|yuY2 zqnx!J?QDbrP!2-5_c=UZqBNiH=-{t7O+&dF<)bJ!qbz)(qhklkO(@$?PIwW2y2e4C zC!RP9QND#Tj`DIm{qt9!{)%!nO2!{HqdXmPt=CZg3~|wYD33z0I3r{jKSWe|ILb{3 zwNFQRDqfN-L>a-mw(p_bhVlWF7G4FuhVpEb`%q59i`k4Y^hY@yW$A9TN12K|frTjF zK?=lLlpi8rV++c^AmeE#$~}MR=-7`k{%%Kyn_?J8|FNT^2<5$dIyy>G_D5o6Ey{f; z*P`5thyN`oe}IhHohU~k^0FW0SY+9|cwgqUp*_k=QI?_{+>Z7rKll*sQNFns?NR=4 zAKIgA_z3M$K8DgwHH`g#>*yGR@~!;W2yKHU4}6R|HnPj(NPBb8d>httb$Xb>6b@V8YlKVZrJES1Avvb z7ox0s0`_76ZBmwdy)`*AY@ckR3!z^H^al7F)r4FX$UO(bxL)gTVKNAD`Z-|7m{z{9@d6_;pRE_LoZg7;wjfekbVs z=A5rzNuzD|6cM6h8F{cKx&>v-5D`LO3HmzF<3YML+1HVooKJwhuoL|fpWXs`2y0Cq zdORCj)joX>=(9jy+Nu3wpUxlS-U9j^o#-2UdJOboSi37A#~-78g>R!`&=XkGeS_`K zljdstpx*%cCX~tccUt7=4b)2DQ?SNsgYB&ae*bKDF6hfU(U%H623!m1kAVJRP(RMW zp5z>GAG!j8t=TA(I-Kw8!2Rh7>?7B9>SMXD1NW_7*k8Kx(J`!}K z%O}Tgo#wZ9u#U?>|EyF0`~Ch0fqo43&8s`LU*@-;0{Ts$Cpytr`E>qaw}YTR(TV@9e}TTVlYWbR{rHQ7GjPx7ioP23dvPy$wUhjp zeEFL}KO6U$*E-Q#efkd24cvP^=tTdMPj3VLCD3o~M8DCeM{uv2fP0qHX^nLF`WJ%U z_m3SNOfB^1$a>jt9|!$4(C2lc&++N}1;!lQ`=0DXf6S+^2K{HC^R<#M-+s#Pe>3Q( z<6gPHQ~SMs`yHV7#Xa=pPV^UidK>7ipugFP{)SJF;9k2N_uffC`c*`IHXS^V;051bgEFl5{5}?fekJbbUHRDeKz|Lyve`|{$59Z(M3c~zbTl{3G!jMBU>c~)$ z&%O&(*+awL-_z=);fOAK>eBnWT8s(sSFl#YV62cI?>!1* zbNpyFqd=b-4+tyZm_g9XSg2^xmyNBUP7P z|6k~E641i>9}O4k_8l7b^g_5!!cX7JR)YR@2wjW+f4%Vke*7UlkBuqBR9&8<%Xzw7 zqRZ=bd5bRZ*5zZmd`XvY>hc3!ey+=Ke?vaqbU8$qV|6)Im*?nmo-UW@@_Jp~qRYE= z`Is(W(&d}F{6LqV>oPn*_pi$#x*V&^sk%Hzm-BSFM3>j=@)lj*t;@%B`I0W*)a3`d z{9Kpefx3TP4$vD)L z$LeybF3-{BJY6o)rD~0s%6e5hdGh25u|oV+`k}F-M~@se^61#8qEVxZ#uXiH3!qtj@{7^-^$y>`wR;ele4Wm8&*O2JVPfTK(svf)!gyfK6 zits+~VFT=QgeD(OGv{1vS=O7~Cx9n4lJbg;!b$lRioTIlGx8%O=cQUH_aTik)eQd_ zkkgDk)E?6P6gIFzHRzz96GF0q;XDMgJ&a!-fvC`5v9~zfr|l8FDBW=(#NO2NI@aGM z>s|d=w;v_H8NLswDC_o96Q0A)ZO zf+>`haT^Fm=o4^-qS-$|Jz_*ZM1jG*$iYQI??JJcJs54WL)f-Lb)bf?zXh<#o(*#W zx;D+bAlx$N!H%|h3>7dJ(y}IB+l0-@U`#OwVjGT_=TNS>5_@@?Sq@CP>A)%(=EdO8 z%*ldttT3F1!4!VnJ`&xyuR~}?_@MhX^^QV^@RtSb--z7aAAn(I?E>IL`g8|mo0%_> zWTdfKIAq#)fi>+u2oFchoOeOXegwl!nS@%(VE*N6b23bAm~pU}CPP=2`6ke|nS;7x z=Fw6n?^R*Lc>t=WjIcj}%^7;MV5w#`2W?<@do zWNhq0)LqtVBj-k9P%v~ptQk2kJr0}^`U1E1$c1@7hE*e>-+>&tIAbdSH-zsy7?H9J zhCmBKKP7!`#vf3`LVQCLsqBVnFbYGzhXRpHGV%cwg_e<0l`$B=xX}6VkjR3J2>^;i zw?gMgb@y2S;-NgU)n+ULP#XF-`>D%V4q#TOglzR0>j9L722%9p8TSB~Z)AVWnVQ5w zjXwi=n)|?Nm=D3gruil6mf41}IA$SR8BQbnIML>ao$X+XoYeag)H7Ij7ErY*?ouG^ z<+y}5;$q3=N37BC7JIS8N_HuXXkP%>IR=-=RQF*N_T#vO`C2s4Quv*o!u}YSa0HfA&7_t|Q1wNDHn#?+kb^zV?F*Vc5SQ?{&W%)GKVV;_{icAH z!MZb-h%?=pY<51I)%eY%rn;dl=Suc)wy@@N;B*6}Rnh_rf!C_7q%?YmC03$=40|(? z^b$cD_S1yvD2nNBVR{{KK1WKYQ9a0z|Bw{^9^284EZ-uA9ReJtI|X!K;uD015V>ivw zly9Dnx^3PK7kA7FaNv-6Ba{3(P&Z z_AqY+wWs-WTzi?X;@aE%3$A_4Ay_zl&0<{pnI-Vim^mBQ{$>ug+yUlrTnCy{aUEoq z;X2s70@oqt&A1+6K8S0fxdYds<|F8FnE6Xwk2ITMnc?P(kTb&EhJ`%RY{saMGRNRr zWIlyaA8pc(RXSTv{BNXsyL zk>nUXIU}|B-;HVZMYpFwL0k@LgtsSY}j1GZOQBp?IY&-z@+A!0u1h)mxC$&6niWroIc-v2XtpSWM%a4(;wsv*6n=MoEU1Ecl0_Q_2`i#5#gK- zOJ#oFJq-x^OkBcqak1nQM^}bTRwqmkX~@|Hgjg*8Z_TzM$=9A8fX`h zzA{YJS>!ByV>Ozo8b%`0b(W&J5n4JLHS>6GDTv&Hd5^kg9(`d@Bm~LPY}Iaa8GHjX3F!R#mpYG(MmHV0V(~>g6jdTHd9W(Bn?pOW38D| z3}~R)tqHW-@R!8NV{;m9&c2-rHPUGF=pfVX4|H?`&}mDEIl^=wATL7YxWrfP5Q!q60ZOvtqL=qy};~|3v|XTTyk#( z+C6(HsunMXy&KHAy|GPYK5`d@9ds4; z5qCxwf!yxYaM?dSq8u`etThlBEi$7+AhQ5NRhGO5yt>a^N^i~M0eK|pycqVeU>|%n z{4M7pD|0IGaiEQ?O$ZI;R+$+b^Tk9{yIw}->+si{DnZwKXd|l!rZu(L%p}uVqU9n3 zvY)_2=h|S%{O#Q&DKq~Va`K+c+JXk$nMJ&jRS9*o|DojknrL1O`ykL+b1>lSt4y){ z-$>)du){!SU5RS;^@`?V=7nalX4v$J%%7qEyop&H8y{w5km__c5-4NHt*}7$J7$DX z)+}nVOi3#zw_G?HWow%~XJvsacZIUh8gg+g76oWq9T5T6oF)q2UI;uso8$`g#*gE1?+5X?W3-qGUrZM4*uC61ZkT4w zbC^PW;DJEpa+G<`9KGE_se(yxWv57SUt`W5JCxNLpa zy6Ne>caG4s`9@)XfM$9gExT+mF8D|`8cK6xPb{=NHcvlFsqxg+L(A(I;_1kx{q1!- zu1@FPotZ{Xd)=O^(>aE`o}6}j-Oj6}w_ehly>9o_#xOoz%dKYxGW7=H&SIF61gtzl z!USvJ0{k2rka!vREENjKQlWq>6(Pt{@q#QB7zi^kU=8U$5+brxU|^&Q41^gNu!eOz z9+dF$2&r1bdo+?u1qs3o5?CX8O(wYzkx1({A%~B{60~mbMbb4`9YuH$1jE)* zgl(ut3^x_@FvBI`H@j0;44)ANjN(1`P?1v#dN+wE&^uGEXRe4P5d}*k3YJ6^EQu&s z5>c=uqG0XAA_!X)nPN#q!IFrAB@qQnA_|s76fB7-^vc4NtuVrjD5N}YpM!34C8CgW z&}Dv%&4@zEmj#lm5@JLl1rde6L%btrlN3Z0{sJgsq_bHHA_}iVMmi%3DTpY130gOa zC~(3egU^FZOCk!EL=-HEC|D9vuq2{jNkqYdKjEn)%!oo{gxwd-y4{4cP>P7TXf?&8 zgGXRlVmN5W8fz1F!>fDTD0mN(uAW|#4QBI-F z07U8~88rZkYz81wt1?yq7-us8k-8w`W&p)D0}!dz-5&-Jw;6y)t<7i!P--&(ky@AW z7Jykc0}!e88T$Z~*$hCWUY@~o+I*v%1R!Ya)baO1PfG$2mINRy2|!p9fUr~mBFq3p z>WMZ-9A?lV^`ze0QO{;Q%m75{6n7U8&Re*oeU6JMmoHeWKsP3PF<+vUocmxz=TX36 z1|U+Wx*4#ClZ{K-5L^N+g+I)oL+Z4?qd?1MJZ$HzHjA^_T)&yrE+MG;qCkhc zO1O}NJ=K9(K61P;SF9+Wh?k?C8+aAp%pcM_!G)DxyhDW-)Yd==n44vpTWgfo(&<=)OF zt)$54IWWU{oJhKyAPwg=!t^@D^h=TZ4w3Y}q)80t??9$A+>nL5__;D_Fzfu!IId6C9wxfVh@(Y9xRDHSQ2}%B=%sv zj84)li9J{nd$1(-U`g!3lGuYKu?I_H50=CpEQvi>5__;D_Fzfu!IId6C9wxfVh@(Y z9xRDHSQ2}%B=%rQ?7@=QgC(&COJWa}#2ze(Jy;TZuq5_iN$kOr*n=gp2TNiPmc$+` zi9J{nd$1(-U`g!3lGuYKu?I_H50=CpEERhQGxm_a!7hN^yG!gLJz_ozd&?~<9kGYM zaC%2E_K=R)14)h%mqP*qreO>zOy-RF_R&Cv8E?q!-{(ry-Ai%FCciA9ldTL={k~#2r~eY z^?mmqAe;wqNqY(xQ!X!|Kf@twcmwXGS)1I~$+e4IfAzU&1iff}gX&;X!VFkM8*+FM z$SuQVRdk&@7(0y3fJJn@GPpdlMsLa{0rvho8XkkHws)BAqBq-L0__r?D^Ux#-Tg5I z@igjwn9be{o1p`DuK*F7Q44pU970^1Pkio2sZ=u0X4Jy{Sl9|ej9R#eT2RNBkxt<* zq83vje29u#q?=i2E%6Z-F$?J`#F&MPm<5|fBwXSmWqSTD&m<9c0mI)0cX2Eu4W<#a+ZKwgBx806Lv93l}kqN#vP|OIjH&$}^=FaJ-{H={_7s_#N&x^X~vcy#TmR zdXqK;Ugtigph)OR90}d0y-B-(oX;qzKuzJZY6@eav253(Xhoq<$+=xY<3h*ddo1pA zYC?AHMM$j2pZ7%pl!Qd6t#Kjd9Z1=~!Q zCp~8pdC&2AX?(TZy6?fmN6hVI-3Oxb(%zQ#Qdtmv6ch=qpf-IiwIo9C;K9x9r=UEE z@wqVt6&UH1>Grp5cG!J6h8S~)SUs>dR0l_N>Y%Vw2SYn`FsxGtN9qnFis%lvWI^^e z(%FMM%CaA4cMritrS7rTJAQZLI(0YR>rPhq1g|?;;>RhGd7-ngQ@O`0s36pbR-dRi zdx!cFI>GAA4q_p$5cfn&w$j4Ty&QP4mH9U8TNHYNdQGzWd;rdI676(PQoR?ejbo;g z88@6ifyLnzID1*6tT3JAP&L*zy~rDuY!MfG!{Xw0 zXDgZ>NSUI=)IjD~z1VkQ=p4GsTm==WVU??4jSF$fx)rKjafnOSt+aYjmAD$@JT=JD z&?j_@ORU};#Vo_w3KnNS2Sfec`IgP&vdf1O=M`LrJchNg)V$t$7bkHwtQ$HFYjvk# zCA?upxNomfP+n*ip(X|C#rHi+_RrpGNi|!te-^48^M5S8W6p|enqImfECYY&9Ea>fY|vtwY+885&f`%~B>XMzYQw8Jn(&T%53$bJxJ%$b-`3hr@s zIdsZ7A)^dHvHdr8dZJL`_E{8NoUsg)Qu}U7o0Rbb0JH4<1WuARW%kP)+vJR2fHL1s zBV|hZ8vttU4@j9RY)kD`ly%OGH=vWnS||VyDT#MtcHferO$D=J#wy{{=87Xyz!`=3O_NjaF1GSHcT$e+HaKH+_u+xezj(TcMP*l~i^?tLnbq zL^XFDsJnBIj$DQz*}Jj2b4RC0JNq&iCU(5;{_OJ-vl4aohU%Dy@&#e1&G_j$u>!VQo9YN%RNbe zS@ug*XG*s<=)26mmTjiy-3Va5y^fv6MeAC79(9{0K)oHKv{TY=!4Q_(3AQ;c=NJGh z?Y~fi)1#*VxYj<1xy?NzaxFtoCYF3g#>*Ia_Bb;{f!m0doiSq+nB8GYk3B@o zlaX{b2HU?9neiYD;f_^Y>6n!Omw?-;oI2o5!T~pWGDa7@C$k8w{BO#IQ7V&XawM#f z>2}y9`U7D))nhU;_^zls-W5^La-ylrP$T1q#Fs1lO5%6X;QNFay#d66{+VRGg)~`_ z(Y??jYrBm20b+SEoONKzusQ6H)qvh2O@>WNnaQzaM4+L&S8-Wz)4;IBLPsU1>um_h z9Mg?~*#dI%VmM3K*Zu74E=#8R1YgR2+!pnOO@`gG_6WV)r%ML`T^3Q7%}UDu_*|m# zA!-lc=9f9_hh&nyF5^tB5cfgV_La_UX{q3l`R32Xn?E+(>$4_ZARF8_OXZS?ow{TSclqj-?!E+GMEoQBYr}7Qk7uLyqI<(dmr!olog>@EPh%XUS*w2@i?6r9NnDPcJAGYQB4`ayr zz3yPKh?gOx+PP|k7viD*76^aA%BPl}j8i-~%gV>x_#$)>`7e6%=Nkig+}dnirkStR za?Op=-g?lREzic8HML+J&qacFmMOd8N)K3RJjqz=YK*=-(p_eS3FnMea^wdIP&GIH zoZ>iTmsx|U9maZf>I76Sv&K+;d)*^fr%uJ3U1r6(lJN%h>J*;GF1NC|d)n(>xH_dA zjLqs{fiEjlN?@D~>M4NlGV`I|tyV7eVI?M7i-e z4r7u)(vy@~1>i)+BQQmoe35&iHI>8UTgK_oqo;NMXvMHx^O+mhDLs06ddx~~63(M^Q|Y;C+l~VqR74d}WQdX)xf4#Ic#=ZfG=5uD+axK$K zIX5?k*Oi6`#==X0f$g6&k5smwpIKG06yUMSsVij6&zUEwG0!qmiXic2Q_u3I6~i7r zT6J}cDvZ9+6$}3@QwrWIGnlW2B6PvLBe;l}m00p)a3; zmYK3j{xgz{%u7@yb_?2>?zGG-)H{vL(K62*XQ%8$S2wHSV}GE_-{wK{jUM+wu?n+7 z3%*0i#RT?~@f7K})I3G4EWH`d z@Ow@fjnSRydEA9Lk|+S-dOaJW$jqQ3JibgcmuW>7`-=4HFXou&DWVqIL{E{kMUjb0 z5pSWL;OmidhZZ^LddaX;*2g=VJa^KLli#>J}RLUXL12U+2T=0s%y)p4OY zJ-EV;^g6~0=L2j&Z#cBsE>&YGP3B65R*pIiYC(cwVmKsNXhOyq>bfgkA$oJ*z zmB8DF>$!%&+b91D=O}CzBJlQ8)OvYpg-E=8rkeIGD|#=4lHc!10l2g0WNTe-)w&M9 z)ObMO^01jYT!iC?;r3!K$>hDKx7MUavzr^Af}nm}RZE5{v&=UpFlJ#+l4bbIp^8&} zB?(n?;}>3oNpi1(61{nrpVo~h8@l+BJRHQlG?xv2PxA+g5o3Cl#bscz(aKcCy&045 zUm)2K>(1`YJN*E?s%G_O6lP!=1z=eZUt|oDAPzfoXeOg=Fm`UkjGP4HA1T>3|J0^F z^y@q`aR2L^ZIgWr1bo|+o8g^PZYH6rmvXb3VmhbX(EGfU8#D*8>#D*8`eie z>|K&!QeNviWm5 zUdl}zsLm-jBkh@>_mGsEDo|6de+lsajg*_b&M7w+pc_BsCe?!4I^~A_8-B{o=Kzu^ zHy;8Dq}=QRtDkbiV{Z@tOFWUm%y{`PQf?SB>>(*Pli1ls%@osh%FU%@_rLQKS^N~) zyH2^e9pqkTK`>Kp`1;mQxnT-YGUbL)GUbL)AmwHUgk-aEzrc5X$^id&DL46trrhLE zw4~h7BQCM;0-V=H%1xf6+~ggSab&1W@^T~nKM)l8+?LR=mk2Zit^Guxe7rGnxThl#=v9cqckb|T zibSB>fQvXf5$I%0@VSS<>*A98vv9!IuU3i0GxLu5r|e!9nWvwe9J^2 zjySwMf>tN>z7X{&>s}(zA|UKKTr$_;V#?(f)@XQ>y_jMpy97qGO96X{K=+_-KY&Z- zc5)?K3cr^K#P8okgNZ=zve}>6Oj2&7nbep~qx+&jn|qy?2$Tz&U4TpG2y!JGslId~ z(0I_I!9<`_*z628tMHpiO$~{%yhI?f4&=b;2C9Rk1?B*+Rcin_lip#9m1rQt{yvfP z5mn&xfav+%jC4=kr4l9G&O$A#jGXHXZVB$`*prX94IB;lH+InC+0~ zb2(6cicbMrI6B3L9pN=QHeRIo5QsQB#fROxj!yBZ0+8qE6d$rBQ+&u5OQ!fd38JL< zq?^}dVBV!4B=|^2eu57hB@=u|OD6d69F|P*p<5&qeAq6T;KPCX2|iR2ud8)}4;hmQ zKI{N5uQ6^W_;f=D#eRYhX?S_96MT4r(J!y@r6f*0US6Xazm&vwWqyJWEsfXJI>Cp> zlVpMqd$08qdGCHKx5A-3{4{vr)at-yu*Q(%^L_ zDPT)fBkduVE1LF@rDk5hLzbC&0S~!CwbLGQrRgR;Rx3z* zNW$zz8)*+&WA@w(NP9?=nHlhq@8N4}Ff2WUJT~VsomO_6P5Wd3**^n1J%PcyYfbkx z^1OjdCR0+BUq~(B7fk=`<>f(5LCC<*gW{S|UuSfY2Sq5E2c`VN%Y!16%!48n$b(`A zOfN4FN-}t4w?H0LpabMV1v)?;RGE4{8aH&}ux$ zg9>zqJSf$jmj|V~^YWmSpL=;wgpzqs3LyJjpwma= zDa>79xl71%B`%p8a8aHrH5y;=a1N1fKtL z@?;~#(;A-ka`Ht^2EKlTmSMKc>1KCOikHa27XXe<*8XCZd!% zI+2434)YzI$U&`Z9i7NQpx)7m9Crd(>I4%x9G%E<1}N7$I+5dVkk;tvM2-#ss~w%l zaSzzmIy#Xf6>+)S9G%FK3t*F@6FI2PW=AJ-yoxqk9G%E<93IrRIy#Yqy0thuk)r?t zl8GE8n7<;O$Pr~ChrI_fZKC_^LNjV5=P4j}qaI}9@g8aAhP zFcC-VL=M)&&-BMzk>Y`8pq_mKF45QEa6P8NbtFiUUwJu@R$~mkS{GvTHm$8-F!6&k z0P+{uXM>!6J?nRvJ=Rjd0`S_6sEtZ-CZSo+qs)H+%5O(IB#4XxFQO8EW#QzX2e&jL z`B`v9!_8kxD3(7lhN3wCAr>pGq3q8p0m-srs5{m!=o~R(1(~Ts5xjMn+h%6XR4XF3(&K9ZmT3<%L)W;~}njT<`<*{x!!(mgizie|j zygvz?&4W?+kL+lGeG?Gf_Mkqfdkd{F z+}*%n^WNI+JhV8{{*#E?qQzyTV$|;KW;6z?%mAy}z@7!a+PgA721B>|tt`4OGa&_S z(szxF0!Yk1+LmC`|BxmZzVtS4!^N;qfnn`QtkJ*yJQV_xXEOqHa~`@r!ss~{qb(Sb z$*rDmuOyIS_&GS#?{lK%d4x>nJ+PNnl3x+-j;{z)Z~@<4aC;CXO|l+g6dnobJlm+CH3n6^>98X+5nTph7qjb!-RMMSX zjEuWzogvCP_mJjW2g8Ev<{zPG&mTg&2o}#zv&5>uBW(k$WMq6!^iGBT+(VnJ88+8y zPk!~f$3&T^UU&hdCW;nOvo(4@*QIGkICmL~sGO;!olb7Kh+VnHmGy1*obeu9)vdS0 zMVMZyEL8;~YU_J>F`T0fK0|VPdNUEL8xpZLdukaynJUxc$t=#(GsKEXB~_*yQf26D zza?7v*~>9#P^~oh!tda74lSuhf0a;^!Bxh&H2SOTnLa+Er%r&OO-}N#YQ`9nHi^SG zb8&$7lWNF%F93MtmicXuLqEz0J$1$ld%l@;iM7e7dVBdX+-a2{KM96h&-iFB z35K2Z_L5*E<%SqFCq1!oGYN*F`vYvri(wy)etUa4Kaz5zG*4ii|Ig2H(;N)I8n;rOER144LS$N%bXl;osXQS`uVFW zpz2Jpx_DoHrKj3_qx&DRR}68kI9D;rZ{MS8Zv2B%ZHO~YsTPN7L!22(wPI0ih%<|- zF(X8D8{(8xH-7cM;7cuVu9AzdPs1c9I5|`jDIh85$B>BP^rW5`HUb9QpobZDGWp~- zUN@ek8=D*ZVST5SV*Fue44?0QIwyfTE6KEAU5T5 z80XJ+Pu4Llw8UOpPtyE?*L9nDx{X_9{LRi%w!aXg8jsy@z;y$#gWGq^R6H;H;!_|Q z6S>nKketY!_Hn_9+-aW_oXDN_Y2HLqtv5Wi<`=YS>B~GtE;V-BIjU_1bl4ihy0Y&( zTaowsI$WuAc*Y)>)ZrQX_@EBY*pq`gJY%08)ZtlAhq9El7-y?3$7}jlP90=#R9kxc znX1R_rYg;i2S7|KkCCI0y8`kBWUe;aC2FpUQ)WWm_idMZE~YzWH^3j*J-NYSB2w1F zH-2d6sF^Hv@t3`jEG)-)W((!42KgFWmfuL-`IG*rPlgwy{SG_sHTH1bxyZZ0_Esb3 zd9^psSd3F3uEyRmcRs37M1xf}jWz1ZW&0 zA#&Xw%nX1r2Q%;-JbcJDDA`UWu9Yn(ak30eX}xh`lk&02+Dl1ZW!FyRwY^cv6?yI2 zWaC(r?3JswR<>NVYu7s8|G)RTdwQl--p!_~fbRbLz5o61zu(b43WX7O=-N$Sf(&z! zK9_&F$Vo5%a*=T_|8kMvGW_E%yg%X?W2+5zygeeZ_3uurmj2A4`Ik)dFQkM_H-aTh zKW>nV7WH^ah;8Qp#W&I%gGvRhc1ma5TzXM=K zr9KNMRH4fubq-y75^am2&V=vQwjzc)6F%lO)I_+!Fi85n_V$>!C8g@OsGc z3ml~XI^_6;&HO7ee;WFa$5bP~bO>z0L`OZ3d;TFl3B!+5bd8uB!P`4!)~fK+B2HcaEs4-*r?jvQ?OOBGj*#$7#fg&}pr1;+{@~ z&M5b!(})wH8P<1BBbM<{a@4TztkufzIBW}vkXP!q{!lduGAGbh{U`|87P{*ffFfsF z#;<2=H*~7RY=`LuWWEaKQWN^;0}97Kb5MO%kzEstxiYT_4S8i=6B_YaX-(*iwo++x znIU@Kx_c{l^=gxD10GV2(6u+wMn{(h>yx#L7d3veo-<(HRc-CN)ddNBu9m08I__6h za@RJ4rv4ySqQ?`q+~ zYrO4uEd!Gj0c%4cg^h>V*7_KzRG7M&wy#+cYF+j~$NQwe8&-twYHn+YY+AR8!7WJT zHbO{fev{^ElxMiC?O<7#^a>K#3<*ThT}J|2gfLPdrfX}=@^crHc@8s#w~80roRSX1 zVd_pv=m#^#OY#osji`?Q(cO?Y6DC^4;@-)800%-!|H4Ke@urrMJ(LQ)t#LHdsG`%k z+HzH0W^_sla3e|~yINcotuq34%G4WuZYbB#MyIDv_nCkAkgbxvgP_?}^5sq)%^k(b z7Nw&rjE1*1gqUqmLPu>-p0TfVwXIz^1`BZ-TIE$KW~I`o)eaJ)dmRoLLb@VijZrm} z@~PTd(x`MKH#~J7ZBS<4szk|Vzfm`*X!T2eli|37q0^W^mocc#4#8ey+~UQ{ zHtN;2tzKqyMIHOP>wx%!ZCdX|_R1o+w}l$II-rAHZT($!%=gtbJwyV-O?{STDw=zzw;c!I78>r=h zw8v|Ly_F`|R}(_Efka3JIcC-#$Gr&em3!Iia8Lui#<BE?`ekzyp8&M*hYQ}_C5}l7ej9=$SQ{CJ%)PIh) z-lX2>G_Ai$dvMx#lVW(jiE9-p#^_(hE`xAQ%~_f_OnnTWr3r@L#uk5pM@MKa!;7?y z;YB)GqPikAhPSm*Qz`mss(Y4}KSSpP8j9Ya!#&jWGa{~Yo0_8cML*peZR?@XW@@?b zBee44v>Z>PpNM`udLz2>8ESl%Let?eB=sl+#e%#I)&vXkI@o9g$wFmeI)YsLF+2^) zKat^+xb+BJ{@hN)xC0#T#Dg?pbee0 zD^hoeRy|8AnR#caxkS+-wLor9QG2wP+87)K{3=DE0@JJl^i=d)RQIY@3`q0j9RXja z2Iy5cwfuvSe2HBD2F`)OMbzNV~de-x6)PPW6YVqexq#hp3CGTcWihqvJ+2s zs3)v%k>g7HPSAP=7O5^$x{1y&@1*mQx>;O(+lt0$_aH5QjwrmjjT$3O0D!!QBK0v^ z12!~XrOqNj)9U6>WXmcF!7wJ7b!(#C6n&Jo%)z2|w^8VisO}y-z0ZBhth+&7TwsT{ zKtffY!*(^<8q<1aR%;VGrBOQ)W*DTdR-J{QOyNq;*>qK9r)v71U`Lx91+VB*! zn&ra`>wJ=$evbv#`Y^3qqPxM6#uL;uO)L57#8Y&BiQWa^))O#`Z&Jr|6b)})Ni8s_ z%hVX%P1_mqZI)pp+X{_DHpFOE^c>MN9gO4--KN@CxJc~@YOW3Uwo%!t%sv>rWPEe5@(n-1Tkt~Y4U zC0cQlHl^uaV2ebqTvt*(L7j~KI_<|P{1Dy6caCtQk>mq02Ga?%fK@pldX)4kHb&uX5c7d!cbBd*H7il*oO9lc2_Zd3FYwZKXIdy1;!Z~z+^DT+-KMH;WOIPbbi_d~X;igXv0zesP3 zeu7WC(f$3v!eYNg8?IBwH(?t6ZRqb~xafnp(QD|=;Yb~G^yjqsBGof?#FfXS$A~&V zfyaRMp{pmUIg$mPp~%Wk+P;_iVK(2>aiI1rt*bpx8*b6MTeRv9Q?=#}D-y1E-k~k8 zic&>4E0=VemT@zOsQo0>EnVdA6# z)b>Rh;S-;EE&8ojsqQsuC{ar{i2fd}jNVII;M7jgUPbs$K0QvMQQC17H7NQlt-i%! zu^rBO2_EARwVa@}(_CvCZdRP2_N)AaiEDrKt;@tv<^UQ9N3NhYx1_DCNUI|ak4rP% z4vHe}Q#9SjrzINT6ENJv=b}RNAs?C*=csW>@!+g-#Nhi?3OyT+Ao8X$O~G-PqiWSS zjF}q5T|_*894%wL} zF@jIqM85``XBFGr>)61Dwc0oQ6$j16A307pvibzoeN8_N{R9RCb?p2(MPE}UKPwCm z!|qg2*bzZQTqWpwlw8C?7HJfB;j_e2LK1asnzkZ|`U0(-BNdR>L|S6B@v0KXS$4mk z7_#|ECVA6MVa`1vm4yNhY6>0nywarsE6NykT zcZXI^Q{6>sja+(#nh*>kb)Aw^P7`*IAmG3SfbNHN)h2|{S7{Th{%K7pJV5Aaibq-w z(Q>#-amb*Blh!_P2j|s&v=TNwN4=5e*iCA_Lv1ChhvQa^k_7k=HIHC`4Wi(}`2=G= zsX}GTd*I5pwo4Q|Oqs}Xc(Uc3u6zOLbxY@I)f{ao(t4;j{8$OCww|XoMe0~$Ta+B- zI;}da%fQtdFS7DHCrWFVXe&~e=qc{hzG-%}3fu1Mw2R4EqI$TZB|3y>OZwT~>ne3# zqS{l`ge2zUNUv~iyGm;xquq~j*k8kyZooGjS!z5)8zD7ZH65bXM-}XZ13N)&k0P2K5*>$=xv3mG z3NVeRMUi@VnMmPf`2Xfk61T{0e2LqDmaJB7bi%!Je^yo7*Q8>B-hKK0;57e2}S3K-~9}+AiyI|a5 zdV8cXdiD)!eT|}*ob&md|fsayG<>%NZwVUvs5=v+n%A8ZxyXuGcv~w)e@t~xL=WHLbRznFMcH+efeB^N zPU`*$ZFm_Y>Z`QrWl;E0H9~q>nhU?oO(Q$nEa&JORCkKH!h74*i02iz52qrR!&^eo z{)QNxij=~4g!IgAb0k%Ng&7YY@f`bzIb_Gt zdFZJ&D?Tspqs>>TRlIS3&uyy5IH0Vhw-jviCGp%JR^n9#by^uz^sfSST<7O6(6(A6 zlk}Wo7yg?$4!>ckeEx-6jEdO8p3oKspDiXwPiPA}i!6REv>swvgRpcJ{X2Ayj>GBC z(%o)xa z-efn6R1ZTVjEK50yah@KYXx#Xg<$PT9$j=Z>?G~s4(>7um?XZyY}4*u+9p|b%SECa z)WPF9h_G2Q*|&Go*&>|-28>zikgju>j(kO_)(MjbHzI94N$13_p5_5#4}#%M9xiOX zOrblp5NTtJd$0DS=V|>M9V~K=`~YI(MX(7kbNA2k@T>PE9h#+9jN<3$5dI@K!3gaV zirn=ut-nRvXQ|_pw6{o|OLQNiA9obiahUos5?SIQi^NeCh1Z^^{YBcmME5(P^fcz6 zin{UR*XbD7H=*|!ocS`ZWq@pLwm%PpEm$<%BrUkxX4IAxg# zMrDW+g3z?5;i-dsGkAPpbaZIMK0P)uJUKizYEKLw9kNG;j!p8@q0zyyqr;;Q+NVwr zJ!lUP4esyl-*doe_Tc3BNYz#*$4=YF#>Yk{9R^6f@u|^KFu}nyJo?bU$na5nVsc<|NT5oT z8tzess;!I<4UF64!w()WXR)cxLIDXwXD98^v4N?{v5C_IXGX2Xd}=nAzre_Ii>Z9P zn9gMxy(6N@@u?v%rx}l5xYG3C5U`Jz)jd6UN=Vi1P7F;>veZWhPKj!kvs(H$AJ1k} z8GA8TNHZm1KL~TQ&6ogWk;%-&6Bnv7g4rz;8Fe!z(YF^SVWf6!WMI;MXl!H(v}Dm> zzF2^^T}&rZFtdChVkJl2S2nNs!eS<6gNF<8BFN3;vU8pCuaqsM=d!6}C;vM4OuUe? zweeNs;K(uIh%q#W%F!{<`QSuVa-@48!C|A{6;#N{6;Z__)h|&Wd+eC)b}*qu!Y}_b z@03nXjSQTz7IN8iF_*Usxl%rnvf@RfNgnqkZiy*WCd^MR#xovF$415mCinCm5y==0 zg(96A9)%ek<&usr!suO-uf|5B?BL2`KDU@j7hu1zR^=KiI(=$vbc_`YzBZRkXXgTn zd3a-?D+Q>bW_6i%igT_;RhiBd(%B2jjlgXdFWRL-Dq-1n30ks$uhMs=Cz=>-J5cDO z(;l|LziXCN7^AoVR!!5Ag*NiZcros+-?!IxLWC*k1Q8<#_=)3VKT4_Hrw(Bj-C$U27q=06$n&_aLD?fnH&cxCKXX;JhB3I?Y~{l@Dzg zSB$i4F%K@yGSGxY``x9qwCU6z8Xq4UuS$iR0hk01`AxP;Hpd!n?8wa&;9L=>N-1Gy z1%sRv!;Pq7s>7qhVg^QtCWjP0=8>t#^CC{CL-|rxX+<(u(kZS>0~|ESKrW;LEA+*Y zYnfQ9IRF)NBt@__1Khr6a)p#tm`Bbd$qDKU^~lfcV`Jl|1|}z}vXp!6NeuMBM2!K8 zCVN+AEBKIMf#7N6nCV;|IlcAZ=v3!m?}5(VJ+Z!6Z)aam-=3a>J-wZ~7mB59>hN3& zwx3SmHl9z+AHIBW|L*;JJ9p1@?jEbIPZLu|&Ww#6Q(31pd2|}dHxHdjo~ zR*aJdIFT_Na&vqgkq@eX?1)PS2}YmX0YP;;aFoPJ$}9B9m69jv;?_7b;Kab=BaRIW zk02j{Ip}1Q$0A(7C`|8uXp6E@Uy34`0H?T;csP1cw4@6<-Bk*FRD}eop@y3ZBb%p_ z(IO|zYYy${3rL!{_ujAhDWDHWZdKc#-=7YoY>0!NMRvvYIFoS zfXWFgSP8GA9JzL>Qy61n2s-G`Avwr^htfe~p2CJ~X+gNjX~x9V#Oa~Yql(>bQ46d} zVpOV3$6<$d=0fA>(Bzr1@smh~b7^0K?0Ok);^@%e@DYrV^$-LMag3Ws#eMd`z+jo@ zHa?}4#gL7=U;sEvn1B-%{q*RJW`P-Hs<_V_aMecV-+r+NNEKY}?cv5*mTyr;MQAs= zL3g>$YEtXnqm|Z-z{`eIT+3n1z^J6aRj~xd-QIpR!1vjN$y8L%iyk>f&Z@o;zicmN z;&2x#&K98j3#DQTgJg>}7ar;Yav)I+mB9muK}0HXQ5<}6KA(ywF_Yt9O=B=CK&fAd zU&I7XHp#54D9e2wJ3TZ$ATuXsnt+?V1UH(pc`yljGP!ut&~psF!CEY33aNN0iLR-U ztd&gXkwEZ}9>GVAR2Ndk`CQT^LXbhP6AS1WdJErUCrWvA1~Wxjubvf3iA1VUa2QrW zH;ig7i@_ae#6&_0fei$zRL&i-bGSt|Gn>Y!*G!2{GG)tn$YVuPS@liK2n@3&-9;Iv zWm_3v;ZnMom^aO09Eb50Qeqo_1!lGfEt998iodpxGLYsypsf_%Jl`bIcxQ3vu0LWdonjFGIu-0!q5=dZ?~_F3z;XtN{h-HByzb6 z>9T>Fa(A=wQbq}0swn@#en(pf17vQMS;=G>)8u~iiQ~+biqCadD;MM{Jub6b7wbIIVHHUiGRzgE zCr%#~oLvsmTQsLTnV9J*{7r)M3@CfJ1F9@E3t9$d#aD@ zEz7ZR-&A7d>7{npZd0)40~BhKkrzP;ly!SN%Uif*HYFJC0;7T;W=gX>)h}Vo z<9IcG7zk#<+54d!lU}KiAYTn*l*TxDW!1tQO)GlJJ@Rr1890wdxJAUCyjs_gxmaaB zpf#_Bj+x(FLb$GcuJWqP5}7{Js>K63yO^bYI6XOq8AaiNR!=a7Q!3`s zVq!t%_NM8wl_|F|u{~3P85`$%%qmTdJLcqsTG&cd4F zsmXmArI#;C6I>yyXCh1)%X0@5J*tdaSVYF@MN*JwTA(^Rmb{gtm|75Ww8(9M)z1NY zl#Aiq$ts$0+)UtlESph?wlWV@qN!^d;~Sp1oJ`Nb+zf+VK5=EClo6U_0tD!w;L%;R z0-`Km6i*4J;2?!pk@Y?;X{=>>=hvN%rm+T!G*|0JIVGmYY#$zd^$lxBFr|p8NLE<3c3)M|3!sD8WM7EgEsHqL@$A%{qCtaiPuKuA47ReK3*%P;| zbyx)Cx^%J8a$-aujP#VFwAfb|##qT*R(m9;JKipvBtbW5l3|xxGn>U!l{M`$3!RYo zq)eKX0#|U37>6aTVhV#hVJCaUGzSAENhd0ZZuI%x#OaZN=_3P!Cp}ViXGYNCTt2=y zFNi(%u2Njjt_4>^oyg+zxGL^(rp+F}8(RHx5Peo*K#hQm57pByTwbx(W6)mJO~~A* z@WPQr8B3K{sK8Oqsb0&~Ii-YEY=aYKxH>bhq&%84hXrRTnM|ck#j~>U!^2W^2~&M6 z;!+mt0l1jS#IqNww8L&i(X&S)#qTOV^oKB&F;EJ(4fm=HLk& zex(^1n3!}F%ywJ_o2wd&GySDSY&KBSCqh~xw|JqknhfWqmNdGL8#OD83nx+J63Py7rTh{u z&|W^ri*kYi&-1wqz#s>lQWxo*oH-xBMJ(nD01hXg0%v0}L%$|pjS?UUwW|o#9HFT? z+=BFwr>YqJ6|6@tU_~dDzrv+C-&T#4JwbMtSO8q|J)H6Osl{(3@KN(St=HRXUT^zp zTRHd#^dD+#K3DsBd|l+N54;^<)mVS?Yk#SY0EDe(%edCsaXx3z!ds$GkK6FBRB&0qtbhL($ge_X@O z_hAkE_W)=9m{&@ek9-(8`agklOPBY5SLcs4-2bJY7d71fm7zNt?*C{K;UyQQ$Nwd& zP7U{eQ|y3-`#+F2rs4jt#>uC7fZzWGyi2;g|67p%O2hr1uVfxolh+qf9v`@|zRsUV z@*IBxc*ttEp8uE!h|6yae6{uC-!6ww*5P|N>mEe-Tg~!m7&8{{}zY2|PP|c-BezX3PJz%Uyu4K+D!URg1I*ZFKf`R@k6|2_b|8Q+AdrdRs{;FEx_zy}L@eEi{GfU1V)QULsV z0Q~s?_{#zCUj@LoAX2u5ms>wQ=V3A~?`C*8NbW`g;OPMPCj;Q06FB1OJ*tu8x~;DS zlz&l|_kXzVRSoz5bn@S5xc^tM|5n5Ozg}5`&knGi`ac4@M&Ol<_!jh^%YSgIdbUj$ zITBDlrSZ@BK4$rzfbyRRfZt+xxRH&o?BHL|swS^L1Dy5HZ|^?{DE}*gH(UNsF|L&U zmNh9i`vc$)2EgB;`R4x;ZBE1eKkobf06dQaz5?<60c~HnmE(5<%6|iJ_IrMR^^(BX zSkG%b8jbb606f16fVT(4ox20zhXmei`9F+15m0_km-qk3^!osB0U!MG{b&H58v*b? z41oVI0RD!+n=SwMLiy*ks_9`@0Q|lH_(K8kj|9N41;GDP0Q@@v@E-=i`A5yF^^1R3 zk^MkyTxrfTT7mjC-2a2(QvrC2y1f7U+x%-`)!O}o0Qe6y9{*<_UkAL?D7WXl46dXa z{@wui!vXNi0&lMP)cJ2~xc_^`zY~Dx=>Yh5G#>v~TJLDM|9iWCtKmO8s5)!LYj~@; zYJb-Uz>fo7jc;cH;O`E=^F#pr=>YhD34p)#tcOf)@kC$wHetQOgW2W;)>z6m?*ZT& zttYU@$-7+SU93ZWM&Sdw(+(K#>pcPP`jj&#;XagQC*Y~}hboP@&ynHvQH&n$Xh+1;M9J2h`taCX5| zou*b3*Jd4uC04P<^;UC~%nN>AHggHq>g6#<1JpF8nqdoGws4EfEI;2?%zv5|^*dVr zr4;j6)iWG5^w>6be%eFFu^|wz{@BNlj$3BA%(5RG89OpCg8h%jc>n3-z!AK?CY|%m zs8?Mc6Vihwaxu4Axp>V>;SZdi8krcfWh0xh1lfnPE*4>k-a5hax4bwj zGmX67pZpDGj2%?5o_u02ue4r2Lhv^{&hJrXAE<&dv+nzi%h)u3XZJUc#3XJywI;EMcYU`**rA^Td(2;<&qiF%d@&F-FxqK?Bi`+#kG276!?)m~b>0RV90 z%*sXWdEnu)vjxEE3-2DUAf?*&6BeOF0$$d1Md)vbUrlt7^Fz;e9tUpJ!POw9(Opf1 zYcO`LVuN`_r;JiycjSY&TO90Oc$qWQ3!#1_m1YpgVb3lpr#U9QB8l;4eHDWB@GJ;n zK=R{tlM)!1-Po9+-cfc)LIahZQd_2-GOmNu%gXlfma6 z*|99{m$wL*&A3deR%0;Tq0!R=F)&7I}wyI!}$uYgE(D9bl8OLpz<^e z)93dwoJX^=>$Z#~p3-7t&K{n!P;bQwR~E2c5a(iEo#)LJmR(c%MJtB4no=<=Wyd(O zrt)~n$_34o(wXFLZ1+&0fg{7au`ke);@IwumEGi(ESgYf?A?TUJDih}l z`f4##v|IpiyM22-$3{e!x`IX~bn zjB89smL27<3~qn%>tE+g|DV_O z&3T6|j%j!~{Pf2G#Z;Bk{~zo6=6sNe!@(!!ovCluchi7z71MqvBg0|N8Pl)=3l4oL zr+4H3uRZkt3;Y%eALjgT)vaaFn0Czh5j_8UPyHQwa?PA?==w}Q(`o3}VC!SJV4fO$ zFX;N_{O7u$Y2Va0{r}gx{t;d72Jf1{Va}IzMLyvZ`cC_%{*!<)Uk!e%6E}Qx%72UX z+k5!se+>`4^*cLNX>)$3uYy@mH|Nj#>YMcybIu%4_{@J(&)nbg)i>)}=8S2zvcpG? z_4~TM;lK4xU0k2Pj(KnIVfb%gJpar6H}%bWwmJWlA9@ad``^SfZ~ZS`P=(F;rq+Lh z!r%UP@c_R}Bf7<9zQ_v2=l83#zr49O=f6ZT{4SnT|Es$GSAWC$ucI#Ojy79o-Trx9 z-!R5>!?bJU_;b|d{yX*c`u_7D01(Fxb#nfj`sU30P`vfc{(v9r`VSbvXbh&FIfqf% zTi>h~?O0M344sAmQ_s0aWri90&HB_qUH^lopgwo{?wfS`JwCXp@3%jul@D`XrRyuG z`+q{W|F{d1D^t&ad0&nn#?OAF>wjq4lvHPbS^j*wAI2qJ z{?}Hjv-$6@e^S@?^KauXRgLB?rlvZZ`sVylK>d3*suHWiZ(W~1_iu1{OAdA_Xv_=5 zwZAOi`3VH+JIB=%4Z5%wD5=xO9%=-KwS6d=AjxK8L$%^}7$Nk{5jy Ie7DyB1 +#include +#include +#include + +static const char* get_alsa_friendly_name(int card_num) { + snd_ctl_t *ctl; + char name[128]; + snprintf(name, sizeof(name), "hw:%d", card_num); + + if (snd_ctl_open(&ctl, name, 0) < 0) { + return NULL; + } + + snd_ctl_card_info_t *info; + snd_ctl_card_info_alloca(&info); + if (snd_ctl_card_info(ctl, info) < 0) { + snd_ctl_close(ctl); + return NULL; + } + + const char *friendly_name = strdup(snd_ctl_card_info_get_name(info)); + snd_ctl_close(ctl); + return friendly_name; +} + +static void sink_info_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) userdata; + + if (eol > 0) { + pa_context_disconnect(c); + return; + } + + const char *udev_description = pa_proplist_gets(info->proplist, "device.description"); + const char *card_str = pa_proplist_gets(info->proplist, "alsa.card"); + const char *device_str = pa_proplist_gets(info->proplist, "alsa.device"); + + int card_num = card_str ? atoi(card_str) : -1; + const char *friendly_name = card_num != -1 ? get_alsa_friendly_name(card_num) : NULL; + + if (udev_description && card_str && device_str) { + printf("Sink: %s, UDEV description: %s, ALSA name: hw:%s,%s", info->name, udev_description, card_str, device_str); + if (friendly_name) { + printf(", Friendly ALSA name: %s", friendly_name); + free((void*)friendly_name); + } + printf("\n"); + } else if (udev_description) { + printf("Sink: %s, UDEV description: %s, Incomplete ALSA name information.\n", info->name, udev_description); + } +} + +static void context_state_cb(pa_context *c, void *userdata) { + switch (pa_context_get_state(c)) { + case PA_CONTEXT_READY: + pa_context_get_sink_info_list(c, sink_info_cb, NULL); + break; + case PA_CONTEXT_FAILED: + case PA_CONTEXT_TERMINATED: + pa_mainloop_quit((pa_mainloop*)userdata, 0); + break; + default: + break; + } +} + +int main(void) { + pa_mainloop *mainloop; + pa_mainloop_api *mainloop_api; + pa_context *context; + + mainloop = pa_mainloop_new(); + mainloop_api = pa_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "udev_description_fetcher"); + + pa_context_set_state_callback(context, context_state_cb, mainloop); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + + pa_mainloop_run(mainloop, NULL); + + pa_context_unref(context); + pa_mainloop_free(mainloop); + + return 0; +} diff --git a/v-0.06/examples/change-speaker-mode b/v-0.06/examples/change-speaker-mode new file mode 100755 index 0000000000000000000000000000000000000000..78ccaba6d5b4ed8b69d1d831737b29a8feba48ec GIT binary patch literal 80232 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

yFF7^#5C^wd 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 literal 0 HcmV?d00001 diff --git a/v-0.06/examples/change-speaker-mode.c b/v-0.06/examples/change-speaker-mode.c new file mode 100644 index 0000000..64fa962 --- /dev/null +++ b/v-0.06/examples/change-speaker-mode.c @@ -0,0 +1,88 @@ +/** + * @file sample_program.c + * @brief PulseAudio Mode Selector + * + * This program is designed to manage the audio mode of the active PulseAudio sink. + * + * The program performs the following tasks: + * - Initializes the PulseAudio manager. + * - Detects and displays the current mode of the active device. + * - Lists audio modes supported by the active device based on its number of channels. + * - Prompts the user to select a desired mode from the list. + * - Sets the active device to the mode selected by the user. + * + * The available modes include: mono, stereo, 4.0, 5.0, 5.1, and 7.1. The program lists + * modes dynamically, ensuring that only those supported by the active device are presented. + * + * @date 10-15-2023 (creation date) + */ + +#include "../easypulse_core.h" +#include + +int main(void) { + // Initialize the pulseaudio_manager + pulseaudio_manager *manager = new_manager(); + //pulseaudio_manager *self = manager; + + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudio manager.\n"); + return 1; + } + + #if 0 + // Detect the current mode of the active device + const char* current_mode = manager->get_device_mode_by_code(manager, manager->active_device->code); + printf("Current mode of the active device (%s): %s\n", manager->active_device->code, current_mode); + + // List available modes based on the number of channels of the active device + printf("\nAvailable modes:\n"); + printf("1. mono\n"); + printf("2. stereo\n"); + + int max_choice = 2; // To keep track of the maximum mode choice number + uint32_t channels = manager->active_device->number_of_channels; + + if (channels >= 4) { + printf("3. 4.0\n"); + max_choice = 3; + } + if (channels >= 5) { + printf("4. 5.0\n"); + max_choice = 4; + } + if (channels >= 6) { + printf("5. 5.1\n"); + max_choice = 5; + } + if (channels >= 8) { + printf("6. 7.1\n"); + max_choice = 6; + } + + // Prompt the user to select a mode + printf("\nEnter the number corresponding to the desired mode: "); + int choice; + scanf("%d", &choice); + + if (choice < 1 || choice > max_choice) { + printf("Invalid choice.\n"); + manager->destroy(self); + return 1; + } + + const char* mode_choices[] = {"mono", "stereo", "4.0", "5.0", "5.1", "7.1"}; + const char* mode_to_set = mode_choices[choice - 1]; + + // Set the mode of the active device + if (manager->set_device_mode_by_code(manager, manager->active_device->code, mode_to_set)) { + printf("Mode set to %s successfully!\n", mode_to_set); + } else { + fprintf(stderr, "Failed to set the mode.\n"); + } + + // Cleanup + manager->destroy(self); + return 0; + #endif +} diff --git a/v-0.06/examples/error.txt b/v-0.06/examples/error.txt new file mode 100644 index 0000000..edb3387 --- /dev/null +++ b/v-0.06/examples/error.txt @@ -0,0 +1,103 @@ +Operation state at cycle 0: 0 +Operation state at cycle 1: 0 +Operation state at cycle 2: 0 +Operation state at cycle 3: 0 +Operation state at cycle 4: 0 +Operation state at cycle 5: 0 +Operation state at cycle 6: 0 +Operation state at cycle 7: 0 +Operation state at cycle 8: 0 +Operation state at cycle 9: 0 +Operation state at cycle 10: 0 +Operation state at cycle 11: 0 +Operation state at cycle 12: 0 +Operation state at cycle 13: 0 +Operation state at cycle 14: 0 +Operation state at cycle 15: 0 +Operation state at cycle 16: 0 +Operation state at cycle 17: 0 +Operation state at cycle 18: 0 +Operation state at cycle 19: 0 +Operation state at cycle 20: 0 +Operation state at cycle 21: 1 +Operation state at cycle 0: 0 +Operation state at cycle 1: 0 +Operation state at cycle 2: 0 +Operation state at cycle 3: 0 +Operation state at cycle 4: 0 +Operation state at cycle 5: 0 +Operation state at cycle 6: 0 +Operation state at cycle 7: 0 +Operation state at cycle 8: 0 +Operation state at cycle 9: 0 +Operation state at cycle 10: 0 +Operation state at cycle 11: 0 +Operation state at cycle 12: 0 +Operation state at cycle 13: 0 +Operation state at cycle 14: 0 +Operation state at cycle 15: 0 +Operation state at cycle 16: 0 +Operation state at cycle 17: 0 +Operation state at cycle 18: 0 +Operation state at cycle 19: 0 +Operation state at cycle 20: 0 +Operation state at cycle 21: 0 +Operation state at cycle 22: 0 +Operation state at cycle 23: 0 +Operation state at cycle 24: 0 +Operation state at cycle 25: 0 +Operation state at cycle 26: 0 +Operation state at cycle 27: 0 +Operation state at cycle 28: 0 +Operation state at cycle 29: 0 +Operation state at cycle 30: 0 +Operation state at cycle 31: 0 +Operation state at cycle 32: 0 +Operation state at cycle 33: 0 +Operation state at cycle 34: 0 +Operation state at cycle 35: 0 +Operation state at cycle 36: 0 +Operation state at cycle 37: 0 +Operation state at cycle 38: 0 +Operation state at cycle 39: 0 +Operation state at cycle 40: 0 +Operation state at cycle 41: 0 +Operation state at cycle 42: 0 +Operation state at cycle 43: 0 +Operation state at cycle 44: 0 +Operation state at cycle 45: 0 +Operation state at cycle 46: 0 +Operation state at cycle 47: 0 +Operation state at cycle 48: 0 +Operation state at cycle 49: 0 +Operation state at cycle 50: 0 +Operation state at cycle 51: 0 +Operation state at cycle 52: 0 +Operation state at cycle 53: 0 +Operation state at cycle 54: 0 +Operation state at cycle 55: 0 +Operation state at cycle 56: 0 +Operation state at cycle 57: 0 +Operation state at cycle 58: 0 +Operation state at cycle 59: 0 +Operation state at cycle 60: 0 +Operation state at cycle 61: 1 +Operation state at cycle 0: 0 +Operation state at cycle 1: 0 +Operation state at cycle 2: 0 +Operation state at cycle 3: 0 +Operation state at cycle 4: 0 +Operation state at cycle 5: 0 +Operation state at cycle 6: 0 +Operation state at cycle 7: 0 +Operation state at cycle 8: 0 +Operation state at cycle 9: 0 +Operation state at cycle 10: 0 +Operation state at cycle 11: 0 +Operation state at cycle 12: 0 +Operation state at cycle 13: 0 +Operation state at cycle 14: 0 +Operation state at cycle 15: 0 +Operation state at cycle 16: 0 +Operation state at cycle 17: 0 +Assertion '!m->thread || !pa_thread_is_running(m->thread) || !in_worker(m) || pa_atomic_load(&m->in_once_unlocked)' failed at ../pulseaudio/src/pulse/thread-mainloop.c:179, function pa_threaded_mainloop_lock(). Aborting. diff --git a/v-0.06/examples/get-card-profiles-pulseaudio_api b/v-0.06/examples/get-card-profiles-pulseaudio_api new file mode 100755 index 0000000000000000000000000000000000000000..f11d0e09ef3000f43f27736dd6e52ba7faf6ea90 GIT binary patch literal 81440 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 Gt^Wh7IRd=^ literal 0 HcmV?d00001 diff --git a/v-0.06/examples/get-card-profiles-pulseaudio_api.c b/v-0.06/examples/get-card-profiles-pulseaudio_api.c new file mode 100644 index 0000000..de59ad9 --- /dev/null +++ b/v-0.06/examples/get-card-profiles-pulseaudio_api.c @@ -0,0 +1,63 @@ +/** + * @file get-card-profiles-pulseaudio_api.c + * @brief This program queries and displays information about available sound devices in a computer. + * + * It uses the PulseAudio library to interact with the sound system and retrieve information about + * available sound devices, their properties, and ALSA (Advanced Linux Sound Architecture) related data. + */ + +#include +#include "../easypulse_core.h" + +int main(void) { + // Query the total number of PulseAudio devices + uint32_t total_devices = get_output_device_count(); + + printf("Total sound devices in this computer:%lu\n", (unsigned long) total_devices); + printf("Available PulseAudio sound devices:\n"); + + pa_sink_info **sink_info = get_available_output_devices(); + if (!sink_info) { + fprintf(stderr, "Error: Could not retrieve sound device information.\n"); + return 1; + } + + for (uint32_t i = 0; i < total_devices; i++) { + if (!sink_info[i]) { + fprintf(stderr, "Error: sound device information at index %u is NULL.\n", i); + continue; + } + + // Display sink name + printf("\n- Sound device name: %s\n", sink_info[i]->name ? sink_info[i]->name : "NULL"); + printf("\n- Sound device description: %s\n", sink_info[i]->description ? sink_info[i]->description : "NULL"); + + // Query and display the number of profiles + uint32_t profile_count = get_profile_count(i); + printf(" - Number of profiles: %u\n", profile_count); + + // Get and display the ALSA name + const char *alsa_name = get_alsa_output_name(sink_info[i]->name); + const char *alsa_id = get_alsa_id(sink_info[i]->name); + int sample_rate = get_output_sample_rate(alsa_id, sink_info[i]); + + printf(" - Sample rate: %i\n", sample_rate); + printf("\n- Alsa ID is: %s\n", alsa_id ? alsa_id : "NULL"); + + if (alsa_name) { + printf(" - ALSA name: %s\n", alsa_name); + } else { + printf(" - No corresponding ALSA name found.\n"); + } + // Get and display the minimum and maximum channels + int min_channels = get_min_output_channels(alsa_id, sink_info[i]); + int max_channels = get_max_output_channels(alsa_id, sink_info[i]); + + if(min_channels > 0) printf(" - Minimum channels: %d\n", min_channels); + if(max_channels > 0) printf(" - Maximum channels: %d\n", max_channels); + free((char *)alsa_name); // Free the memory allocated for alsa_name + } + + delete_output_devices(sink_info); + return 0; +} diff --git a/v-0.06/examples/get-input-sources b/v-0.06/examples/get-input-sources new file mode 100755 index 0000000000000000000000000000000000000000..262274c2a75f1bf22f5c04051cc002ee75ad8e36 GIT binary patch literal 81392 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 +#include "../system_query.h" + +int main() { + char *alsa_name = NULL; + + // Get all available input devices + pa_source_info **input_devices = get_available_input_devices(); + if (input_devices == NULL) { + fprintf(stderr, "Failed to get input devices\n"); + // Normally we would clean up here, but no cleanup function is available + return 1; + } + + // Output the number of input devices + uint32_t input_device_count = get_input_device_count(); + printf("Number of input devices: %u\n", input_device_count); + + // Iterate over each input device, print its name and sample rate + for (uint32_t i = 0; input_devices[i] != NULL; ++i) { + pa_source_info *source_info = input_devices[i]; + alsa_name = get_alsa_input_name(source_info->name); + printf("Input Device %u:\n", i); + printf(" Pulseaudio ID: %s\n", source_info->name); + printf(" Pulseaudio name: %s\n", source_info->description); + if (alsa_name) { + printf(" Alsa name: %s\n", alsa_name); + } + uint32_t sample_rate = get_input_sample_rate(source_info->name); + printf(" Sample Rate: %u Hz\n", sample_rate); + } + + // Clean up all input devices + delete_input_devices(input_devices); + + // Using the get_source_port_info function to get port information + pa_source_info_list* source_ports_info = get_source_port_info(); + + if (source_ports_info == NULL) { + fprintf(stderr, "Failed to get source port information\n"); + // Cleanup would go here + return 1; + } + + // Iterate over the source ports and print information about active and available ports + printf("Available source ports:\n"); + for (int i = 0; i < source_ports_info->num_ports; ++i) { + pa_port_info *port_info = &source_ports_info->ports[i]; + printf(" Port name: %s\n", port_info->name); + printf(" Port description: %s\n", port_info->description); + printf(" Port status: %s\n", port_info->is_active ? "active" : "inactive"); + } + + // Remember to free the source_ports_info structure after use + // Note: This assumes that the 'ports' array and its contents are dynamically allocated + free(source_ports_info->ports); + free(source_ports_info); + + // Normally we would clean up PulseAudio context here, if it was initialized in this file + + return 0; +} diff --git a/v-0.06/examples/print_volume_output_devices b/v-0.06/examples/print_volume_output_devices new file mode 100755 index 0000000000000000000000000000000000000000..58ad3000eb380eec3d23d12d66aae828ed8117db GIT binary patch literal 80608 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 T-9^3p2YXb?l~9Jzt@VEa>$l+W literal 0 HcmV?d00001 diff --git a/v-0.06/examples/print_volume_output_devices.c b/v-0.06/examples/print_volume_output_devices.c new file mode 100644 index 0000000..2d93f54 --- /dev/null +++ b/v-0.06/examples/print_volume_output_devices.c @@ -0,0 +1,66 @@ +/** + * @file print_volume_output_devices.c + * @brief This file contains the main function to demonstrate the retrieval + * of volume % of each individual audio channel of an output device with the PulseAudio API. + * + * volume-demo.c lists the available audio sinks, their ALSA IDs, sample rates, and + * channel volumes. This file assumes the presence of a system_query.h header + * file and related implementations for interacting with the PulseAudio system. + */ + +#include "../system_query.h" +#include + +/** + * @brief Main function which queries and displays audio device information. + * + * The function initializes necessary structures for PulseAudio (done in system_query.c), + * retrieves the count of available devices, and iterates through each device + * to display its details, including the ALSA ID, sample rate, and channel volumes. + * + * @return int Returns 0 on successful execution, 1 on failure (e.g., no sinks available). + */ +int main() { + // Initialize any necessary PulseAudio structures + + // Get the count of available devices + uint32_t device_count = get_output_device_count(); + printf("Total devices: %u\n", device_count); + + // Get all available sinks + pa_sink_info **sinks = get_available_output_devices(); + if (sinks == NULL) { + printf("No sinks available.\n"); + return 1; + } + + // Iterate through each sink + for (uint32_t i = 0; i < device_count; ++i) { + if (sinks[i] == NULL) { + continue; + } + + printf("Device %u: %s\n", i, sinks[i]->name); + + // Get the ALSA ID for the sink + const char *alsa_id = get_alsa_id(sinks[i]->name); + printf("\tALSA ID: %s\n", alsa_id); + + // Get the sample rate for the sink + int sample_rate = get_output_sample_rate(alsa_id, sinks[i]); + printf("\tSample Rate: %d Hz\n", sample_rate); + + // Iterate through each channel + for (uint8_t ch = 0; ch < sinks[i]->channel_map.channels; ++ch) { + pa_volume_t volume = get_channel_volume(sinks[i], ch); + float volume_percent = (float)volume / PA_VOLUME_NORM * 100; + printf("\tChannel %u Volume: %.2f%%\n", ch, volume_percent); + } + } + + // Cleanup + delete_output_devices(sinks); + // You may need to add cleanup functions from system_query.c here to clean up PulseAudio + + return 0; +} diff --git a/v-0.06/examples/switch-sink b/v-0.06/examples/switch-sink new file mode 100755 index 0000000000000000000000000000000000000000..48291a30da17537dc50081f6dff2c28f7c68468f GIT binary patch literal 80736 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%0D*z;0D#V9up%5SP1wtV{&wwaG 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 literal 0 HcmV?d00001 diff --git a/v-0.06/examples/switch-sink-pulseaudio b/v-0.06/examples/switch-sink-pulseaudio new file mode 100755 index 0000000000000000000000000000000000000000..c74560934a968fe16030662233d5edc9c096947a GIT binary patch literal 82904 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 literal 0 HcmV?d00001 diff --git a/v-0.06/examples/switch-sink-pulseaudio.c b/v-0.06/examples/switch-sink-pulseaudio.c new file mode 100644 index 0000000..0a0c85a --- /dev/null +++ b/v-0.06/examples/switch-sink-pulseaudio.c @@ -0,0 +1,62 @@ +#include +#include +#include +#include + +static pa_threaded_mainloop *mainloop; +static pa_context *context; +static int sink_count = 0; +static char **sink_names = NULL; + +void sink_list_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + (void) userdata; + if (eol > 0) { + int chosen; + printf("Enter the number of the sink to set as default: "); + scanf("%d", &chosen); + + if (chosen >= 0 && chosen < sink_count) { + pa_context_set_default_sink(c, sink_names[chosen], NULL, NULL); + } + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + sink_names = realloc(sink_names, sizeof(char*) * (sink_count + 1)); + sink_names[sink_count] = strdup(info->name); + printf("%d: %s (%s)\n", sink_count++, info->name, info->description); +} + +void context_state_cb(pa_context *c, void *userdata) { + (void) userdata; + + if (pa_context_get_state(c) == PA_CONTEXT_READY) { + pa_operation_unref(pa_context_get_sink_info_list(c, sink_list_cb, NULL)); + } +} + +int main(void) { + mainloop = pa_threaded_mainloop_new(); + pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "sink_switcher_threaded"); + + pa_context_set_state_callback(context, context_state_cb, NULL); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + pa_threaded_mainloop_start(mainloop); + + pa_threaded_mainloop_lock(mainloop); + pa_threaded_mainloop_wait(mainloop); // Wait until sink_list_cb signals completion + + for (int i = 0; i < sink_count; i++) { + free(sink_names[i]); + } + free(sink_names); + + pa_context_disconnect(context); + pa_context_unref(context); + pa_threaded_mainloop_unlock(mainloop); + pa_threaded_mainloop_stop(mainloop); + pa_threaded_mainloop_free(mainloop); + return 0; +} diff --git a/v-0.06/examples/switch-sink.c b/v-0.06/examples/switch-sink.c new file mode 100644 index 0000000..45a8739 --- /dev/null +++ b/v-0.06/examples/switch-sink.c @@ -0,0 +1,61 @@ +/** + * Demo Code: PulseAudio Sink Switcher + * + * This demonstration code showcases the functionality of switching audio sinks + * using the PulseAudio API. It initializes the PulseAudio manager, loads available + * audio sinks, prompts the user to select a sink, and then switches to the chosen sink. + * + * Note: Ensure the PulseAudio server is running and in a good state before executing. + */ +#include "../easypulse_core.h" +#include +#include + +int main() { + // Initialize the PulseAudio Manager + pulseaudio_manager *manager = new_manager(); + pulseaudio_manager *self = manager; + + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudioManager.\n"); + manager->destroy(self); + return 1; + } + + // Display available devices to the user + printf("Available Sinks:\n"); + for (uint32_t i = 0; i < manager->device_count; i++) { + printf("%d. %s - %s\n", i + 1, manager->devices[i].code, manager->devices[i].description); + } + + // Prompt the user to select a device + printf("Enter the number of the sink you want to switch to: "); + uint32_t choice; + scanf("%d", &choice); + + + // Validate the user's choice + if (choice < 1 || choice > manager->device_count) { + fprintf(stderr, "Invalid choice.\n"); + manager->destroy(self); + return 1; + } + + + // Switch to the selected device + if (manager->switch_device(manager, choice - 1)) { + printf("Successfully switched to the selected device.\n"); + + // Debug code to print the default device after the switch + fprintf(stderr, "[DEBUG]: Default device after switch: %s\n", manager->active_device->code); + } + else { + fprintf(stderr, "Failed to switch to the selected device.\n"); + return 1; + } + + // Cleanup + manager->destroy(self); + + return 0; +} diff --git a/v-0.06/examples/volume-change b/v-0.06/examples/volume-change new file mode 100755 index 0000000000000000000000000000000000000000..466bc436235201d54c9f571dac05bce7300997ec GIT binary patch literal 80264 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

*V~1lpATW%y-J;titZmvQ;t` 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 Rt?>UWp=vIL5JI=s{{Ste)e!&y literal 0 HcmV?d00001 diff --git a/v-0.06/examples/volume-change-pulseaudio b/v-0.06/examples/volume-change-pulseaudio new file mode 100755 index 0000000000000000000000000000000000000000..95d00d9c6dd8c20a12eab30c8cd3b2be7efa773d GIT binary patch literal 82936 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 Y@i{<$`y6g6)qkW{m0a~z@SR%!7i=3{>Hq)$ literal 0 HcmV?d00001 diff --git a/v-0.06/examples/volume-change-pulseaudio.c b/v-0.06/examples/volume-change-pulseaudio.c new file mode 100644 index 0000000..aa629ab --- /dev/null +++ b/v-0.06/examples/volume-change-pulseaudio.c @@ -0,0 +1,101 @@ +/** + * @file volume-change-pulseaudio.c + * @brief Change the volume of the default PulseAudio sink. + * + * This program prompts the user for a desired volume level, displays the current volume + * of the default sink, sets the volume of the default sink to the user's input, and then + * displays the volume after the change. + */ + +#include +#include +#include + +static pa_threaded_mainloop *mainloop; +static pa_context *context; + +/** + * @brief Callback function to set the volume of the default sink. + * + * This function fetches the current volume of the default sink, displays it, + * then prompts the user for a desired volume level, sets the volume, and finally + * displays the volume after the change. + * + * @param c The PulseAudio context. + * @param info Information about the current sink. + * @param eol End-of-list flag. + * @param userdata User data (unused). + */ +void set_volume_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + (void) userdata; + + if (eol > 0) { + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + // Prompt the user for the desired volume level first + int volume_percentage; + printf("Enter the desired volume (0-100): "); + scanf("%d", &volume_percentage); + + // Display the current volume percentage + int volume_percentage_before = (int)(100.0f * pa_cvolume_avg(&info->volume) / PA_VOLUME_NORM + 0.5); + printf("Volume before change: %d%%\n", volume_percentage_before); + + // Set the volume based on user input + pa_cvolume volume; + pa_cvolume_set(&volume, info->channel_map.channels, (volume_percentage * PA_VOLUME_NORM) / 100); + pa_context_set_sink_volume_by_index(c, info->index, &volume, NULL, NULL); + + // Display the volume after the change + int volume_percentage_after = (int)(100.0f * pa_cvolume_avg(&volume) / PA_VOLUME_NORM + 0.5); + printf("Volume after change: %d%%\n", volume_percentage_after); + + pa_threaded_mainloop_signal(mainloop, 0); +} + +/** + * @brief Callback function for context state changes. + * + * This function checks if the context is ready and then triggers the retrieval + * of the default sink's information. + * + * @param c The PulseAudio context. + * @param userdata User data (unused). + */ +void context_state_cb(pa_context *c, void *userdata) { + (void) c; + (void) userdata; + + if (pa_context_get_state(c) == PA_CONTEXT_READY) { + pa_operation_unref(pa_context_get_sink_info_by_name(c, "@DEFAULT_SINK@", set_volume_cb, NULL)); + } +} + +int main(void) { + // Initialize PulseAudio threaded mainloop and context + mainloop = pa_threaded_mainloop_new(); + pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "volume_changer_threaded"); + + // Set context state callback and connect the context + pa_context_set_state_callback(context, context_state_cb, NULL); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + + // Start the threaded mainloop + pa_threaded_mainloop_start(mainloop); + + // Lock the mainloop and wait for operations to complete + pa_threaded_mainloop_lock(mainloop); + pa_threaded_mainloop_wait(mainloop); + + // Cleanup and free resources + pa_context_disconnect(context); + pa_context_unref(context); + pa_threaded_mainloop_unlock(mainloop); + pa_threaded_mainloop_stop(mainloop); + pa_threaded_mainloop_free(mainloop); + return 0; +} diff --git a/v-0.06/examples/volume-change.c b/v-0.06/examples/volume-change.c new file mode 100644 index 0000000..6600e95 --- /dev/null +++ b/v-0.06/examples/volume-change.c @@ -0,0 +1,82 @@ +/** + * @file volume-change.c + * @brief PulseAudio Volume Control Application + * + * This application provides a simple interface to interact with PulseAudio. + * It displays the current active device, its name, and the master volume. + * The user can then input a new volume value, which the application attempts + * to set. The result of the operation (success or failure) is displayed to the user. + * + * The application leverages the EasyPulse library to communicate with PulseAudio. + * + * + * @date 10-08-2023 (creation date) + */ + +#include +#include +#include "../easypulse_core.h" + +int main() { + // Initialize the pulseaudio manager + pulseaudio_manager *manager = new_manager(); + pulseaudio_manager *self = manager; + pulseaudio_device *active_device = self->active_device; + + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudioManager.\n"); + manager->destroy(self); + return 1; + } + +#if 0 + // Display the channels of the active profile + uint32_t total_channels = manager->get_active_profile_channels(active_device, active_device->index); + + printf("[DEBUG] The active device is: %s\n", active_device->code); + printf("[DEBUG] The following profiles were found:\n"); + + for (uint32_t i = 0; i < active_device->profile_count; i++) { + if (active_device->profiles[i].name) { + printf("[DEBUG] Profile name: %s\n", active_device->profiles[i].name); + } else { + printf("[DEBUG] Profile name is NULL or invalid.\n"); + } + printf("[DEBUG] This profile has %d channels.\n", active_device->profiles[i].channels); + } + + + printf("Current device: %s\n", manager->active_device->code); + + // Debug: Print the volume of individual channels of the active device + for (uint32_t channel = 0; channel < total_channels; channel++) { + printf("Channel %d volume before change: %f%%\n", + channel, + (100.0 * manager->active_device->volume.values[channel] / PA_VOLUME_NORM)); + } + + printf("Master Volume: %f%%\n", + (100.0 * pa_cvolume_avg(&manager->active_device->volume) / PA_VOLUME_NORM)); + + + // Ask the user for a new volume value + float new_volume; + printf("Enter a new volume value (0.0 - 100.0): "); + scanf("%f", &new_volume); + + // Set the new volume + manager->set_volume(manager, manager->active_device->index, new_volume); + + + // Debug: Print the volume of individual channels of the active device + for (uint32_t channel = 0; channel < total_channels; channel++) { + printf("Channel %d volume after change: %f%%\n", + channel, + (100.0 * manager->active_device->volume.values[channel] / PA_VOLUME_NORM)); + } +#endif + // Cleanup and exit + manager->destroy(self); + return 0; + +} diff --git a/v-0.06/libeasypulse_core.a b/v-0.06/libeasypulse_core.a new file mode 100644 index 0000000000000000000000000000000000000000..7b62bfe0b3b459223e8840b790a7143e924907d4 GIT binary patch literal 39626 zcmb`Qd0b52|M;f`ZL|ojno>z=Ln_3GYVuB!cF{U5w5cgkTC`|N6jHJivM(i-kVuiG zvL+=WQ4(1~^gCzfoZQY^pYQvR-|=Yfz0dnPuk$*u^E%7DbLUc?zt4q%3=zQr;ejk#5Nowt zphu90FDsPh%?e|O2Ct!J*&T_-M0fe~vJv(HL7P``ldyO@=m( zX3yljW+rs%F*)m=FgfA1%rvuFCdaHDY}=U$80Lk%3WR|)H0 z39?7S&rpjraM(U9p_ea0sbdC^>#pJ&0`__@Lvfs~V?6I9KV<(p$(NCF^BOXW4vcE& z7R5}nZ)bA&fjBUX#!M;?7b%81-;M`$#T1!^%X9XK z^VC+sjNHP26f8S^g&VPqw&yG;|{+yhJlq&AH~=TtB`wM@QpCSNV{YKy>tEr3I>awNDL zUbAa3(}qFsGC5aE^}+TstRgcVFk^+>=pQ=bwtBLm}v}+H2YV~t1pMaLefwK z=s`B9=yZkQOwK)C$Z-VzmX-P6^3D@VFnh%Z6@UsFo4pcW&+hN<@8HW|rY-A5O#+*P z6W-0S?*#5?$yhch?0Iz_h`t(-n;L!Gu4oUN6F6ufz$q<&`gA)d98}T%2@nMRmfL@O z(-^AhHvNF~a%@yV-=&35pm=ox@Y>(J3gtoM3<~Q%T@{WWL|NTXHG3w=*PRxk2YOLA z*lo82{!Sm`!mUmnx1;=NZ=QMhxI-Fd9lA&cj4w|315mwcAXyEn2TSNqW9V_rIuq7C zps}ZOk73~pyVHQ1ffFn_)u1z*bIa$23wFzYEtgwW&~Pmr`)8oxYJpZbVuI>EqlG&$ z6V|oR*o$Go%rqMbt^vTHt4vVt)fRpxAKVNFQJ4nLwWR5R&-S_84$B=ouoa|LP&@no z@CY3@Lc+Rs8ha$v3?iR9%%S1Z1`U^K3>grVq1wzpy-96|cITS*b{x)V|B7S7wHauZ z00Sr+4OvVH)S0-IgdG`F60{4icxpl8|7Ss`z*(N*Lum{_J&+;vXRxJstsCU-9yrD> z;Emxkh%p>?h=g^$v~W4zh&c^JDcPrhI?zpdp#rMgL_MbVH_)3o;h#Y;wp(%PtvL2A zX=a}}{C|3N2xy!fZ)TdHng*;QC|bXqnQkTlLkDbY!DK7QOt-J~siIk41R;8a8=_2p zpDKokWhs+mBUZ(bw(M`sCpxa;PS;2_wj<`-!?$yZ`X6r+MfZA%b|=_ zRc3kcbjLa_PlK(U2M6Q9@xw7IuQJQ$3eE+BU=m5u1NzeJ^9K*yAk;Wu2mlh|MRB`; zym(PL$LvI!{RzOTIW`grX8CY9E>DXy0{M;2@0^j^ZgDa5=B7xb<@f!B@;Z{bxY$_%9ifxO0zLuQyYR7lG_y+-Yv`@&HCK>=5kX3F|)7)@V|yW-&z7xZ&8L0ivDh z1;)Wa4al9rd%!sL29)#;F?al5i<6kK(1HPN?O>LCn-7CHVO=dP+!z}IRv?^i*1IA=hC{879Yx4rm#VUguE_K=lB< z&7%)^)Cf=ppwD;|uBDh9CKFH_Ks$N#Gmkm}>JDfhj|xI7IZQu5LjV=y8l5Z6qmfKb zP8?S*Re^Uxm3ty3g{vzk18mZ^Oa_dTkpuSeGENXLr$8jZT7m8jCa~zY+*l!2C6pyr zd}lcjW^yhu;h1@TKKSermrP=SEjbh?aAjz0JsI=Ae2X80s7!M*(O5!a~xB)IOb~jB<_6m6H|P0IVZ^u zWRJfDKl}S>v)&fXbwULpCaq1^t$u6aq5i&VuBaa4^k+#u43- zuNw8k6mB;0BDASa%Ys%QZGWzD1_a87iZ-rY|D!zaKEWy&r>B`SDco zHl!-<{0`RyVAPc6&fDauNr$5tTnvK20j&G{P&{H=lgh=j%2Ukx#f!}P6T0~l%h`Xs zprg#)Ab$(a{3jELI=GYrfy{FO7|RF7QHd+C>+lA_f%OcE5epb2U?8kw$N(9%OUJu- z5x}uwLZLs0jKPPX$5YQb4L)=qd2Q3XZ->R}}JFb!RpXT%|+aJ_gg0&^b71DBV$ z#o;m9=Zn2DH#teYg*R%z37#U*qE%*a zxTSS0=Sjnb61ZR-G|!@iHe9^^=?B1ui9=^emxgPfZr~M-4zM`tkT-77xIGx5@Z1J3A-@&UP&FX&i%s4>TvvHP2XRt9|srQ@JdhXzsMmcB$)O6DX%YdH!myiicw;>)y(*s$7!J%vDKEa`M zbQ?HK2i|Um>5q7LP+&L^X8W<|yt}$||Dcd?Hj*6B&pYSlALPx7qz8wy>A^m9&*1PN zZ=TKpxh4KVD<_80gFFIRbpJ5AwY`-UR22rW8-ynCzONha#&1w~K!6)OLkkS{4i8{y zL!iwCf9!)dy6Nx)9iE``Bylwc)#HCjS_Vac`{v##JE$V82K3B;W}eD{df*J`7CYS| zG}L1a9b_1A64c-yM2C0Tk#q1(c2MB~J%1_!?yl2$ch`03w!jO)K{M!TVW=iN`N>EC z+^%PNt#tG9)R+XC)*4nmB-lR)+~w!BrU%z+pfP-c2es3G%#W%7n*(L1EuC*>YH#uP z{5GM%;7bPJecwNo_X*}&!qY^p2h#KBs{~L5I(7^Y^hSQBe8B)E<^_ibfMyP6|22GJ zaH4M`kO?@F2mCz9NuXKKcO1B7Jh>IEHswXXGlRG7W`I7;O+oN}A4vE(a@Qf3s1Un{ zvRB?T@4VC12L3g#Yn$6FUZGWH$}cFjPhxJM%^4dB6+ughVWO|=94a(iQtdg37Sh@R zyCt;`+A+p^YNhPkRJi@@flcq9L_BcFpAg&5UeNkE`uXa+4N(V+B1)%5N5#I0{_tVu z^GmC*otv_-ras55b+0l*gwAlo7q|uj8tRKl{P0evYU49Eot7GUDCW%@bR_2w(lE7zpg0>d^L0B z>+?H8eU5dMJqdg_V@^?0tg*(9*Wbi_T}Lq-o~)J2qF1NyYH^FXGfGdnJxa^CVa#l^ z#VdGZ=fBf4H#haVgXKqKdh z=c(UUuFsA6zClKSy*YQMVeBEft1-vVUaz_Qu07VXKeO)IDydUTe&73iyj18xe@W0C zJCC3JmMJ2y`qyVH%>1$NS|q2Yf$n-rY@A%r#?vDov$LwqT{ad9zrFE7qcZWgbF$== z#1)+>hi-T&EctRdfcDsse(4{-;zqq0Vs&Bhr7z!zEpE?>|Ii!jo@zRxt!-DOEj>r6 zqxI?!;mKzXxIR*^^~nm&P&rdAcWthIyc*|2sLew6qvzKrxbW|G7&qdJU{JwYBR`c8 zi%-s@T!c;(-d$C@pe5>&*{C)Nr@&=x`_ju@(mo2@e{n2y-wVs0D{4y<=hVfeyj^R1 zbyAFC{7RP`Pq!A)HZ$w>d&4R+T!-;kI_3Mt=DHckH1+U z`|GioOy+BSqicJ_JhkaXOwNmk^^;km(z(}OKM->DJ)MwrkZyHS-|7u_Q6xq7lNoSs@jWY-{Xc=Ews4&hjK2+$v^Py-r^I+W+ z#_`3U-xo(pkJSZQq7}PYm7nEZqs7PW|2bt+-EFPe`k&VeJG6MG<@u^d-aWtU_vtyO zPksM(XW~!8+z-ra%&=t#)z?o;eK1#Uo}5K4BX@qTX|8$hhG|OveD$Vz0vTgVlAVO> zZSz>nnoI}!$@wlxg>r8hc?Qf8%8DD=LiPKZ8w`8S|Bz`A-PC!aB6w>umIsDd#=&t84n)grCKwnT4=!KVb!~IQqV8cmw24=@?$T3bOLf_wi|Xtt59ceMZR;A@#`&^P%4+HT5}dj_&7 zRnq&7Wb-F(b1w;*y;Dfd|8$Z~YUPU^2eNE(J@(#K-ewURnE1(AP^x)ueq7~?cn{KPEfB^uFS`*WJ;sZqGOA_o~W^3&+he z`#C0Tb>-=!iIs`V^DeoV9+|H#wEJ+tG|9D`R1-6!*ksv%igmw^8FSazr%|~pc-L0< zh0NpxN9mj6Qoo(PJzl)*PI=VUmzNG4xDl83KKj?u46(C})gxT$UHOmwSdD!|%+dOUvoE(`(ZY*1H}zF^^re z_oy^g@wb?uRAmR)-R_GpTBD2yU6*+gbm*AUp>wKozJE2YiBgS zsGieVV6u~4NcNQd^x8=>ePjfE}dluj$F+eYkI*p<7DFYcf%wq74FQs;e30M zy`Exe-MC~gftu5=Q)NpwH67`%+aBNdWb`ATbI!-a^Og4%zD4D>9+@$I_TrNx*t2X^ zsz-!Bz8=l2TBEMs=3we+9+BoLxz=g*z3RXR3ZCX)+q+~-c7MIT@!8z`-L=-Ho}OLx zt$LRnQXTa!IvO^=@;|GrSa@#fg`WY%KYQc@&(KxG^_G|TJXTx!Om{+mzKoRQh1X|B zE~<2~XZz28)_maXF2|Og3B%XzGIw-4Qd8vLw6zQMAI{&Vv|~>7 z;#=ls*2m<1+3aJFG7azgDUL}lmzhy0_)fBR>9Rt;xyJEl^W&C(JkV;xcj={>{7DCk z%P-9)It6Zuu1vGOuDG@`ZMt)Z;`h{Xfkoq2ztURHmbz67KF@`xB#h!;5*kx=bpij9 z%s|C>|F0ty0;Gi}X*AspbDyVTUST>qZF{el;tr1O3U_{1mqPXg3IC(zI@10}D~30v z&+)fk;vlm=e%ly+1EFKWVha*(y6`8|`IubMH9dJpir(TDAo3Z3r(Ucxotj;pzI)HeqS5xbPrTcP*G4e)0}?qay96w|zlS@`Gd(?J zX-ROK{*z$~mAnHky-sn6YLxA|GF7L(edFyQN8|8!{5y8d@PZ#-gfxy=3-G_w@tw@S zLc>=9e#`ypa<;E^KwL zVgJpp&{Juf+T7%YUH8u19ow|9rSbRpQ}4&~PYsK`d)0?OY+ls&#}52GTNd@~UMARf zWb>*s8_Msr-;LoH<=2}$O3F#*M62$PDxt#t!MajTuVUkCcJ24s%sMis?Tbv(%!G>1 z>LI$%4LwR^Vy+0D?p`Gyqm@!~A!*{nhx?1&XX(l+-bt)?DCbW+rM5cpMQN&;)Pd^B z+xP5G7ENn4+Lt=@UY@6AtL~~uk(Rw|sp|sO!<0l*e#zA&`IPA^`ySapep_h#_0>xy zz|gx{SGD(y&B&!3_l!M$jPFy|w#O%0Ovy}W{3&%Vs?I%c&x@H&!cI5%EMp#ID1FeH zQ~N~YpJS@0X1u&*xwcqh&#f|RgAqxhC5sYQd>`NE#cXlZj2I^V+^_Pp(UdzGR^FNo zH}$$JEj?KKoZPHBThk-s#b zzoIUalT@rDnZ4&zV!C(E1=szHg?l}w58K6<7M6bQyrYHo=xy5<1#S-LUH8nb^L+jD z>|c4WuWqYqjS0#=pldMapPSAW=N4`4T)DjA>uHga?WULWoTi>+tot4EQPd9>A@L~(H|QIiL!GHE^Oi)u!x?s@L^c=M5z?@y)04T8rSd~i8$wM)OP z@xXSC>~R?%cN9*{?w(+jU~nh#{(=h0wwaIbWsQz?2;F?FOya`b=)GU2hSLRiMeOM_ zp1gHawcpsJL&s)KiXUNEpDoA`(b^H5{4B!oeThup{+8{t8VXrwT#g*B65V*Yq07+d zpSbD&cxb$B3R|I?ty4TIbWh}w>5rJEm0!9>X=^%fPYb^MOS|NfYmSy(Tg-mTFo(-} zj(%ce+qyqY7Z_RgD?v}y>Ef|}oDaJ;-C)g2`~JwLI;XiwihkF>J0gFzp>X7cSB>qn zA0?&!{5-9}e_s34?z!1j`%Im(gq7Wmq${F-+lsIB{cL2t;-mA?=rzVlzca4Q(f#L_ zqV(sO*S$@e?a%lnKgTRqwE}i{8snqVz&Ar7^j!pcNfQo2)H;MZ`GAE|0Y`@UR$%i?$_)W?>~=qXJ0v|eD_!5 z(V6m+m-#{xzvf>L4&JA-(C%!^390)wDQ3C(j%g}MGmLYDu2^(SC2c?9boa%B2zHOR zW88z=d0Q0owiwiGySvyxbL{itIg7-XoW5OOy?NH_s%4sQnqFD#`RrvKXS6|hG2g^p zW>40qicUFyUBvsX(QvyjS)W9c4)8nwc=FiNwA?@M^6uOhLR-&8*?ln|C)_Y0K*m0J zYSJ%-U$zwmiQPs8a~<0@xo!A##Mwqi%;tA*>C$zq%F6}&H}YdDZz_N3wryo3Yxm9sbHaWqa(? zBBX5cyvDBR+~55@I&S-OwZ$XC9WH9NOweq2>v=nL=5fj0l{3qBFHE@L5VP&aO#$hN2u!2fZJ@}gIm`NPOMIIcwIT;b>;F;2eQ&b#jiO`-z2t3GNja3 z=C1c1kI011;_tUI7YAARd|REj*jQzQdgE@l^_!+Gu+XSUug`Smw_dGODC~BZks$YevE%9(-yv>YNsE6(d)Uf3gf&yVF(DEEkPv7$= zSGKedT<4Yukk`E|+eU{9hS;t{(y3<;o#8*ZuUJGnxaH6-vr)Z%bISLA?ETnvDCyAU z_v%}3dP}vbv@%#C6J;b?dOw{#Ebg-SM)nk&!1ako^n&(;rrDib=@Gy7*yZ)I3^o2) z%akk1t`Cz7k`1f(u)OVU9Im~#g?%Gpl_c}!#^7nUvIUzZ=j!p-ZQn)n>sncTN_gVh z8)LIaPS>whf8_aoM!9hqze<8*^;9+W)^`n-HR+}HoMtJ`iW}h^A?Y(0Ca!W+vCC|C zDwUMH=cHfKz12y$cVkTWyRsZks>8ZVqm*Q%_jD~8cjJDIiJ%)N zIn~Nn3NKANx`4*UD#0A+31y)E?|B4%pAM&Gb3()>gkRvnZ+`Gzhnd_ z;PVNS?Y}Serrs#+c$ zjvEd;>UKEDSQuK0&RpnzgH<($&QM%-UT4|1h-Vcoa=&SoGlL`@f@ZzBb%-8_afUu9EkUskuhQK_hOLS6NhK3Ct`g`+wj7|$H%IPPH0 zss0P|i!KR@HqI#8Tt5GLSbyElxf_1_vd>pHUF(;f(fjqEwc@SMi)7bs7ObDVEyOAy zCE>>L+5+>{*PC8jW%{{youWUVj4cso*_Wd|)mmI4#%RR8?ds|!BOZj7^o?Fz0cZPRrf0~oA?Ah8g){YV> zj$vuCQ>NOyao;g|VQOHh=I4i#o{9`JdG@MZFiYLb^XM^_)#MST|5zp(-`m%9tkYiE zdZCx|mPMoVy~>=w|IqgQXXBN5p^DF5h^=Z(Gp)E7P`co=sMyD`^TIn7%Z!a}JFlJ{ z?P}ZpBTyDxxhU+Jx##NlF&{FV?p->g$zH9|9xtG))H`dI-jT*X&u2VR>{5SNe$o2brUEy`(b^ERjXVMU1sOt{&f2r(A^WV=G+NfnoFUskLncPg7wqCkB|5D4?0^I{&Za>hxeA6*e=(mK@j-1-2h$jVR+e;+sZ_jG| zI{R+mT`k|A?>%0hFdU~^dMvY$W07R^Eo;)Vkup;PrCeUF(LUQhY}l%a4|g>WSGBu- z_`-^BTe|8CO zh3UdQS=Zm@bSZyTdQ(_<$7}d{&G|>F&3vm*XDr=+vM_#15N^3EmldH+SW$MPGwAZy2=#4PSUXij^nFrzGcPVF!z)9xl46lyg%5 zrq5LIpNxPl#gF*1(1S^9J^B z=^LvG4|I56w92-$y4JM0b_7{vG|(ip!PGbL4Nf5Y=fgR zCq+M6e^Z}gSlMjlP;U)B5Z)(Y!I=K?k>I4)D4_G5hIq-8fcmMw5u6(DcT zGJC=qqZXxo>%jNC5o(R8Ej1R0n@dzICZ(Edy3{zZcD0{;n(MpPE#kxi>kg6GFHd_< zdDC$8s>Pk1FDJh-p1dT*_Lj)Y0=IV)lJ9lcgL|lrKmDf3`ky;2zEiMb_q^M6=BM2X zMjvr~bx?kzPS39E!n2u=>eL@R4~SS*woz%7unxV&R3U$p(bfYmuE@C^6z0|&ItMnSWiaIow&leSAIJoLxvQ_Kw z(S0~G-uCD&1F-{k4U!Ig(qk&Lu3pm=zTZLf%yT|Y7mXXIUv06IRd#A*p{Ck5vzseT z{gbs*invg)E#*vr2w@#7lpDvehWG8S{o>LIP;Xko@d_v(i-8bBu+d~mbt#f zXkmQS`leZ(f`)O59+IOTw%CunDYZdMXd|OZdb^qL2aTSwQn_c(MYC+S3ncn4n&Ljj z&Z3HyljPe`6XCsHF;0ATQ*yP7>MHMBn!Q!h*AnFG?T;QF6DLbE`u@qVUN5}X(yX@p zuyOyPsjb#`!lhp5**iaoSsSrBMp9p8I9;IkNy6r?5>7?>1cmMKZyYm}%v?{dljW>F zJ|;%8vd5cmpIf#;S6_c${!RJg%lhYEw{7(53@-n<=%&wir2zF)8+9%n zT+`TeMfIkD-aj_kB~!OM+2!=bwb55vXdT-5kN8_F&uei$c}r)+t=ZC88dP-t@jU%Q za{JFH27R?mm75uH;b34>7Qfn)(T|NS!>0JS*Va4MF{~E0c28=b@#cf9cgU%Lu=A;J zvY!@tAM8?1h^Pv4oRzvc^0&O4ho;}B+V7$z&zBk~N?a*$IK9_SPpI6ln=z-_tL$R# zz2Bv|%lakz^e>8B9{$+v!{xiDE-UPG=)NNE8e;F=oq4qL{Rg+z7urb5`E%aMXuPK=`mEC65wx)Y$K*QvQ zpoaU*otbmzWN8ZuRKK60{y5W(u4ixKE36wv-Q)Zmdhs? z6Pc@a8bxoq8$NPH&C~iA>h7+|tAmQdX3I_AZF#KanV;0e&Z<{A zQ+5W4B^NGfz4IVp=g|?d)+WWf*Xk{oiVQLQ(z0~Jq|QmZ&la?W?^wH)c6a=~l`$hO zn2YU|_gfnEI^%6*e9dqHy0h1bojC#V<#gwH^%ifoAG>h(+VYRji)0+{?;lqZ*?Gs| z^!sLpZA_e#@#0@6EvKFzpOT^UOQmU4Wc^HK`ugCDipzTrB=?KRBs09Pb{9wuZ#ZjQ z9<1BMl#-|$A2sts56jbN+Q%h1A^VanGY__IC^Bq6H|vUomiDZ#^4ja>HNBk|(q^mW zxgmepuHPeXOg&guB~@AduIGUaBl_ji%4Ggk>zJbDo#E5_WHMsLUzk*X_>EBDy2!om z6U%h2n@w|To+tKv>%*=!YiE7ikW}+EC{I26n(+E4n3){n$w+}eRt!s>E`SuwaRSwWIZ`C zcfTbY1Z#z+jcfaHL@9mutMGZ_$_x!W^bBN%Y-ojQ_{0PcbSSAe2q|%ZEl_$zN4i7*iMD7>ZPTp=DjWW@N!IF+?sRA@#D(b zp2rSPt=|#sC6UtzcQ$?DR~@|y+O?3Zn0(i!w5^Vuf;TU+kP{W3dcerm%J>mHN6 zU6n64&z|tZ^Ym(E$q7^B1E=3?dmbcH*5DVqtE@OxPqXownro8o{Rvqp_cUH;C`a@m}j-<)zV^P{eb?xR(|DmIvu^%O7t87e|w-lwYgddGwa-O*`# z^-{FoTwdVzb#Ktq*@k_;muoz$^Q>=OxZN;kaX|5~9}?alJ&*RgTzoL6kwv@`1S$~&9`BW^CZEBL!4)nRgf zSfs3CziR)8S$9GW2d?}2&;kpuvm$pTWz?;>rYC0BGpAC&$-Lp`6ZbQ*LZ=R@^EZaF zN>pR#T(q3=bav;}-sTA>v}CPvy&{BX{3CWU@H2D#=e#))Ge<66+<04T?(gGm*X0tz zOGd1lZ+UNije^JPQJdGEaaiDnsn z8rFE$vffL=-nuvJyN~hGw}K|F8<)N_*>y~B_6!Zrv(4@y^B3<(sWd;_u4kDUF-8_3YOwXRix%dAY+@aOu&FVuu}<&Q}(%dDhnV)Gi~7fWd^X$NARU()c1J_~gY#2xS0a1#k}j z!IT9*=8lp`=ASomIDZC^;GLTVIY`z}IX*97$p-~sURQV$q+s}g&-1U~=BEP`4LL~g zQR0E~W(fiUa$FT$9s8gFNMqp#*0GqYf_uIka*&wt1E1%gH(+B6jrG_M(0DQWeBVs@IfLv&;2>ogg{CVj7@j?0z51hY_&R-g& zznE76nCCAEiVD&`f`_*Modjs`?7x!$$U!D40Qe|e1_{u?7W6%Ig!&LV65#gEfm7Ta z*ny#ZE6T#{Gk_T*Zj0*3?JIy;As&J5hjRM|V6e|YJr5A)#ywzb5NDt&aN`}YZHN~j z&W&@xP9v_xefph7?h(M5a-4p zU?QOY(0)xxZ~zkJC(<+l+Hf8uJ_U%IjQF$wO%(4A+6vIb1|8!A0oo|MJ7_CF6CZR8 z50rqN+$S`NGt-9PHh@ckdU3~6kcT^Fg6+~F^;%pv%`A$aK!{K*jf(-3?Zh`+zp zS9u6NYY6Tz1P>U3ClA51hv0jL;D?6bCx+k!fW!9Mi24zCegW-OK7@QTk~c!3vL3}n z+Ys`@fZo6PQ)UQ03vg&pCF+md`2>`)Uq&c+tZAJVIICZV?`#VQ%^~uVC;ra3tF;j18Xj1`i6;yaHGrLE#~T-U|Xa zJVkv~2s{oBfo}`(4-Nuv-Uti{U;zcZhrow885j&+7V`Ie@X>L2YS4>EAmEnCdsf@c z3p|nT>EX3fM~~(o2Hq;-9~2NA9O4F^QeVmP*3qZ^c~%(YBo3$i`>i8TeTWCJo#z4g z{597L5VHM3SsvcNO#`Kb`TGWW1kfmNPWh`CcpUlf`JsA`5PxckL(2MuvRG6>STWQ< z$OV5d1A2m*4^%CP<;DKHa5(TDPy8>HWqX7Uk!`hyKlcoFo40@1|12hq9UMZnDLg2Y z}{0PO-YQqNJWgv$Qd zI>?AW!3OvK^>Q7Gb(9W3Ee5t8cySM}XVBbWc)$n!{Z_j9fFE#BgZ+Og2hI-)hH8Q9 z!G17kijYw7`v4zGU*eX^`@I3E4QhOJ3>-lEI9Zc@(Zp;hq$(LgC>QK7qm$DV$nv zE`_U7dB*Us-DXfPSwK)odOc+w=onBciCJi8ch*#Xb;tID=6~R zIEkTfxVsDKNghJaEef9oWU+sqQaH6oJ^wd=@fZm3a9EXLmc`C zhTcG&Q{<`r_aPyV*RbCy9GYAP{e2B2TT?5{mo;O1aL2Jg!$bMV{*CY3Rl;v>)DE!uFdZPR5%Hg+u$L(fH^| z(L=T0k0MXCKZ+txwLhMa$M)w^i~tDQ1}UoeoYE5pm133 z2~_Siik{gN`F0AYj!OojKnNtVUX~ON^*=-U7b8yAYb`~dYUd^jhk6uXK_G1(LeC{a z-WAE;qR7ty`LW;bq5A;P9%{Wbxv!_;)eDx(fI$J0E5YX@9zbv_#H$g9`sac_T&@hd zwFtQ>g=--W&4%UTd)-D9d8+-VD1078&s_?q_LuJzKA$2lD-I4og7#45r%*UGo?R&1 z4CKM}il%U73QwbOH44wBaO!w|mcl1cD&mC>+MQH0m#FhR~Bv z;naTmh{6|A%2h-6$Dln_c~c6f#-}@lTT}D|Q#dtlV-4Hw51}1V__8d`0iTnh4r~h9xc^2aeyOc?+4(<@mcBD38BSf_flFZs+tMqCH5$Lnd3b;?g#sYK z7=Q`OUxE$<$(FYn;El*wcY>#K-)V!s9|q^J9)C1XL=y69uo568^ELzWp(viy2tEzj znN9F$r3!ZRNp{?_oCnpBls)Wxj|Y(@OQ|5{Cy0r7p{L2A)kxlFpc0hQM<$M_h7<$ zL{a-@6C7V3?j|@t^20%bFG2Bnl;F>he@+v8AF3Dp-hgTkUe{hE_*@j96$H0K@pG5p z_W5_Q)1b>I-^$3D*K=RQ9e}Up; zJ;CvHJBQ$+s9mxM9*f!$e(y?cmknrKI!^F?s9t9YZh`tmF~PMF$IpIXe;T84rjC%` zhy4GX;A_$GdxA%!@vV>GSpO*GCtR*0ubQ;+1b>U_rAlyP)b5%DS48#FBlt9=e>%a> zqj-kj55t7*$w7Kd34R*I1C!uoXk4`>_(f!=9l=#lJGv5_j{1>5!RDFWcY=2y{{#};AFcPINRHw;jo|QmbC@y-p31|tY=WzyaeFtx6HuHV zB=|<;w_^l9iTqqdaA!0hRSdza2>t`b1N`0|ChRv^G>%Oq_-It_)FHSL!OfALK!RH% zKW`;?CyM{QLvVZ_8{7F4)#n}|uZ-$70*!xI-UrD`55Z*#Zif7c?+;@=zNo!)3Hcyo zzX8cnePFY`CU`a)hh+)wjO$E_*+cMM1RsvZoeF}NqH;eG{4^SWeiPgh9gCuN!0m|R zP=??P|IW1)hc>f}i`pOvq#VZxj3>^5;{6<9gxm0kQt;C=S08@;d1HND$Qz%b!PaE=BMp zwBDc-d^OUeL-6a!KeGsq{k4GLkI*>jL~vcyEj~b2CV&ir#~?fR z5WEfb>k|a`LgQ^I!F7>;s|j9$#-&FDe~seg6~XOMy*?3q92z(9Pa$x7JxBT{pt!~y z$CUxWS*X4~1Q$g8E{xzkXxxY=xGb8dHWT~=YRBCKKZ*1oCpeDJ5`yFJ?WzcFg5vNY z!Bx<4E5UJ`e-%x_%ei}#cKIETG1jqek z7s2s(b)4YXo??Rcq2o$|V>|B?9NYPV;MmR&1jly%A~?2F6pbs`&v;ywBRIBmBEfZ0 z9OCr?)`RUgCFHUFHU!7^EGIa&CxGDUsGqJS_yiOuDFm-a^4kfH$E7@i4@2wxa|CCh z>*#WV<9P=^KY;y!=bev)Joejff_tLz1%F?G_2BshKW~6J_VYw!7v^}rFd#S{x91TY z`)x77vESSXz6q@x0|}1(8AWhB-f{?z$6Ne71GXRg8GkQ_c`)+NWkL`3+e3nzqV?oU zf@6Pn6CC>!KNo?^#s0+iO);N>*4uJu+{HWv%@-O3$K&dBg5&XUKEd()ZcFf56zA>) zzmMjTAcEuXU7`t&;~|ycc>Rz=aNNF!2_A^nKZOLx_XR2l{tAspwFJlCTRkT@ZpV)V ze}%?p71Yky|ITQgpfdzFAUJ+*gF$c{4+{y7$1xXz3IyMS^h_dnBeHWk!R3%0^9X(maT|h1p>|nD@K$8!3WDb#dE9Ss zz3{p}iIB(7!EYae=Mfx_SNJ&@tltRPf0>ZS@mWJ~Jf1uuI39mq6CBs)6T!1kKkO&C z85)1YQ2Ssz@jN0+@EIt-1;MAI^>Z%4b2_B2$VFJOQqk8EPd@Z`ZFd_H{6t@cq?uXU`js#zd%JnAr zaO9s*f}5az9YgSGC~lJpUcz%f?HIv35icaTII7nZf+wKkcLc}v{6_Fh)K2(&QS5)* zucc6XV(yFlJf7f(kX}v1VY8wkm0N?Ug#1Nhza7ChqPPksxGmBjMextao=pVD<8~gw zdyzjc61)(_+Y5qMqH-lsIoJ=5Xx^Mo@IrKKMeusmPrV85h4jZ0ToCbWg1e$|^&G+N zko`{xz8KX<0L|yv{wNfm;|VT{;&~3i=b~}Ro8Ymiyv+npLG8Pb;QlE7YY099>FFeR z6N*oMG#+F7f1&Y2mf*XP{h9>NMSe3OxGGu?SQ9)D$$JpI4~-j<1kXV{jo=EX9nTYd zK8lBGg0qpITM2$29e*WwEQ&)(bRQ1;Cl>iZgWyY$-=+~<8Ff}Gg5N;?!QWG1{disH zhvZ>@hg}!{ZaQNU%CX^6W6y4#j^zbku8Peb-O&`*q``46jKO! z94Dp(*F)o&Ex~7@al@0~c%2+d@IK_{^#qSXA%6tPhY=jxxt`#-eYX%CUpMVW9NUlI zV^T=SP$YVRXKgOoSn+Y2C#Nm&$DZBuUV+x2v`{9s> zrW=|XA)kQ8Lv4yY9N+N!o_tApv~F2Va5Ka=5PI!Es#m5_%kweqlPd+5>(oMDv#% z!IvZd(-Ft^;P;EoC**NIT|#hdrx(GoouLGW@AH8vo(@0%{63`_@hx;N{+Im+2`+@{ zbrf-IKLhExL&#(MpAj6}-$8I}{|`dH2huO9OyedTpSyU6GzEhDp?N_Cacn34p3a<* z$9CEi9NXzlaBL@=;Q0PkEaH5?KG@aqd$P6@@;J^95&RZf51%LaN;L16ANq`x!BfyY;z#Itg7j=8*2|R_^KS(`I6>;oO?4KzF$KPu+ z2#({&n&9|8ExOF$_D8hz+YI;zzMl{# zFWzQ=Yas4NaDBuB32umZD8bDU$Nt0qUyOJ(A-^2)c!J~KWhE0F|NbhC;Omf{41y;k zj{66;XDi~lg#01I_Y%Aa@jQZGNBk(kYY;z0@CS$&5FC#K#RTs_@|OtSgE)>ac*u`r z;D(O&A)|5z!LeW536AZFBRC!>u^+I0JPuzc7$;Q0DN5IGmyiLZn3dwwv-*LO@p9$#1b5gcE) zrVt!ocjprvU+-5F9N&MS>4dEbWP5mmEjyIA^}~CitN;%k_!d5zj<*NfgQnvd7Dm$v z4dxwi&w8^w!+m-0qSE2*dw6<=vLb*O%#2W|N02WIWaS-(2KmC5q(N1GWCHwySXcm* zk9Q%4F9DL?^PiIgPa+>pywHEJjd1x$J@=gnT%X_*ylgbRiM$>B zdsc)8^5f%WV2AW6Joj9KC!xpN41AKZPT(NS!dJ_$2tr zdzO>8$NMB@;{oO}tQZMvp!_?aag;=eao@fEH~aOF{W7Tiq5be$80W|KLorys9zFr~ zVXD^VZ5?5yDG7_=dgOp}f6Grd_)4PXcAB=e`B{4K-@GXDdR_iydTL<=JclpnSq zTwmk-GGHI3zm*NS-%R)kwy<&_!OKi|>z&LGo0k|O0HM)pO}QJIIl6DaJK~jx_u&>^ U=KU?d(-xjoD{nLKN&5f)0k@GQ-2eap literal 0 HcmV?d00001 diff --git a/v-0.06/system_query.c b/v-0.06/system_query.c new file mode 100644 index 0000000..d4c798e --- /dev/null +++ b/v-0.06/system_query.c @@ -0,0 +1,1227 @@ +#include "system_query.h" +#include +#include +#include +#include +#include +#include +#include +#include // Include this for the isdigit() function + +// Since pulseaudio uses callbacks, we need something that will allow us to share data +// between functions. +typedef struct { + pa_threaded_mainloop *mainloop; + pa_mainloop_api *mainloop_api; + pa_context *context; +} _shared_data_1; + +static _shared_data_1 shared_data_1; + +// Structure to share data between get_alsa_name and its callback. +typedef struct { + const char *alsa_name; + const char *alsa_id; +} _shared_data_2; + +static _shared_data_2 shared_data_2 = {.alsa_name = NULL}; + + +// Structure to share data between get_available_output_devices and its callback. +typedef struct { + pa_sink_info **sinks; // An array of pointers to pa_sink_info + uint32_t count; +} _shared_data_3; + +static _shared_data_3 shared_data_3; + +// Structure to share data between get_available_input_devices and its callback. +static struct { + pa_source_info **sources; // Array of pointers to pa_source_info structures + uint32_t count; // Count of available sources + uint32_t allocated; // Allocated size of the sources array +} shared_data_sources = {NULL, 0, 0}; + + +static void pulse_cleanup(void); +static bool is_pulse_initialized(void); +static void get_output_device_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata); +static void get_profile_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata); + +/** + * @brief Iterates through operations in the pulseaudio threaded loop. + * + * @param loop Pointer to the threaded loop instance. + * @param op Pointer to the pa_operation instance. + */ +static void iterate(pa_operation *op) { + //fprintf(stderr, "[DEBUG] Entering %s\n", __FUNCTION__); // Debug statement for entry + + //Leaves if operation is invalid. + if (!op) { + fprintf(stderr, "[DEBUG] Operation is NULL\n"); // Debug statement for NULL operation + return; + } + + bool is_in_mainloop_thread = pa_threaded_mainloop_in_thread(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Is in mainloop thread: %d\n", is_in_mainloop_thread); // Debug statement for thread check + + // If we're not in the mainloop thread, lock it. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_lock(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Mainloop locked\n"); // Debug statement for mainloop locked + } + + //Wait for the operation to complete. + //The signaling to continue is performed inside the callback operation (op). + while (pa_operation_get_state(op) == PA_OPERATION_RUNNING) { + pa_threaded_mainloop_wait(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Waiting in mainloop...\n"); // Debug message while waiting + } + + //Debug code if needed. + #if 0 + // Check the operation state after waiting + switch (pa_operation_get_state(op)) { + case PA_OPERATION_DONE: + fprintf(stderr, "[DEBUG] Operation completed successfully\n"); // Debug message for successful completion + break; + case PA_OPERATION_CANCELLED: + fprintf(stderr, "[DEBUG] Operation was cancelled\n"); // Debug message for cancellation + break; + case PA_OPERATION_RUNNING: // This case should not be possible after the wait + default: + fprintf(stderr, "[DEBUG] Operation is in an unexpected state: %d\n", pa_operation_get_state(op)); // Debug message for unexpected state + break; + } + #endif + + //Cleaning up. + pa_operation_unref(op); + //fprintf(stderr, "[DEBUG] Operation unreferenced and cleaned up\n"); // Debug statement for cleanup + + // If we locked the mainloop earlier, unlock it now. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Mainloop unlocked\n"); // Debug statement for mainloop unlocked + } + + //fprintf(stderr, "[DEBUG] Exiting %s\n", __FUNCTION__); // Debug statement for exit +} + + +/** + * @brief Callback function to handle changes in PulseAudio context state. + * + * This function is triggered whenever the state of the PulseAudio context changes. + * It signals the mainloop to continue execution whenever the context is in a READY, FAILED, + * or TERMINATED state. + * + * @param c Pointer to the PulseAudio context. + * @param userdata Pointer to the data shared with the main function, which contains the mainloop. + */ +static void context_state_cb(pa_context *c, void *userdata) { + (void) userdata; + pa_context_state_t state = pa_context_get_state(c); + + // If the context is in a READY, FAILED, or TERMINATED state, signal the mainloop to continue. + if (state == PA_CONTEXT_READY || state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } +} + +/** + * @brief Utility function to check if PulseAudio is initialized and in a READY state. + * + * This function checks the state of the PulseAudio context and other key PulseAudio resources + * to determine if PulseAudio has been successfully initialized and is in a READY state. + * + * @return True if PulseAudio is initialized and in a READY state, false otherwise. + */ +static bool is_pulse_initialized(void) { + + + // Check if the main components of PulseAudio (mainloop, mainloop_api, and context) are initialized. + if (shared_data_1.mainloop && shared_data_1.mainloop_api && shared_data_1.context) { + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + + // If the context is in a READY state, PulseAudio is initialized. + if (state == PA_CONTEXT_READY) { + return true; + } + } + return false; +} + +/** + * @brief Initializes the PulseAudio mainloop and context for querying audio information. + * + * This function sets up the necessary PulseAudio components for subsequent queries + * to the audio subsystem. It creates a new threaded mainloop, obtains the mainloop API, + * and creates a new context with a specified name. It also starts the mainloop and + * connects the context to the PulseAudio server, waiting until the context is ready + * or an error occurs. + * + * @note If this function fails at any point, it ensures that all allocated resources are + * cleaned up before returning. + * + * @return true if the PulseAudio components were initialized successfully, false otherwise. + */ +bool initialize_pulse() { + shared_data_1.mainloop = pa_threaded_mainloop_new(); + if (!shared_data_1.mainloop) { + fprintf(stderr, "Failed to create mainloop.\n"); + return false; + } + + shared_data_1.mainloop_api = pa_threaded_mainloop_get_api(shared_data_1.mainloop); + if (!shared_data_1.mainloop_api) { + fprintf(stderr, "Failed to get mainloop API.\n"); + pa_threaded_mainloop_free(shared_data_1.mainloop); + return false; + } + + shared_data_1.context = pa_context_new(shared_data_1.mainloop_api, "Easypulse query API"); + if (!shared_data_1.context) { + fprintf(stderr, "Failed to create context.\n"); + pa_threaded_mainloop_free(shared_data_1.mainloop); + return false; + } + + + pa_context_set_state_callback(shared_data_1.context, context_state_cb, shared_data_1.mainloop); + + // Start the threaded mainloop + pa_threaded_mainloop_start(shared_data_1.mainloop); + + // Lock the mainloop and connect the context + pa_threaded_mainloop_lock(shared_data_1.mainloop); + if (pa_context_connect(shared_data_1.context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + pulse_cleanup(); + return false; + } + + // Wait for the context to be ready + while (true) { + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + if (state == PA_CONTEXT_READY) { + break; + } else if (state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + pulse_cleanup(); + return false; + } + pa_threaded_mainloop_wait(shared_data_1.mainloop); + } + + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + return true; +} + + +/** + * @brief Cleanup function to properly disconnect and free PulseAudio resources. + * + * This function ensures that all the PulseAudio resources are properly disconnected, + * dereferenced, and freed to avoid any resource leaks. It should be called whenever + * PulseAudio operations are done and the program wishes to terminate or release PulseAudio. + */ +static void pulse_cleanup(void) { + if (shared_data_1.context) { + // Check if the context is in a state where it can be disconnected + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + if (state == PA_CONTEXT_READY) { + pa_context_disconnect(shared_data_1.context); + } + pa_context_unref(shared_data_1.context); + shared_data_1.context = NULL; + } + if (shared_data_1.mainloop) { + pa_threaded_mainloop_free(shared_data_1.mainloop); + shared_data_1.mainloop = NULL; + } +} + +/** + * @brief Callback function used to retrieve the count of audio profiles for a specific card. + * + * This function is called by PulseAudio when querying for the list of profiles for a given card index. + * It sets the profile_count with the number of profiles available for the card. + * If there's an error or the list is exhausted, the function signals the mainloop to continue + * without further processing. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current card information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function, which contains the mainloop + * and the profile_count to be set. + */ +static void get_profile_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + + uint32_t *profile_count = (uint32_t *) userdata; + + // Handle errors in retrieving profile count. + if (eol < 0) { + fprintf(stderr, "Failed to get profile count.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // If we've reached the end of the list of profiles, signal the mainloop to continue. + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Set the profile_count with the number of profiles available for the card. + *profile_count = i->n_profiles; +} + + +/** + * @brief Retrieve the count of audio profiles for a specific card. + * + * This function queries PulseAudio to get a count of all available audio profiles + * for a specified card index. If PulseAudio is not initialized, the function attempts + * to initialize it. If there's an error in fetching the profile count or initializing + * PulseAudio, it returns UINT32_MAX. + * + * @param card_index The index of the card for which to retrieve the profile count. + * @return Count of audio profiles or UINT32_MAX on error. + */ +uint32_t get_profile_count(uint32_t card_index) { + uint32_t profile_count = 0; // Initialize profile count to zero. + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "get_profiles_count(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails. + } + } + + // Query PulseAudio for the list of audio profiles for the specified card. + // The callback get_profile_count_cb will populate the profile_count variable. + count_op = pa_context_get_card_info_by_index(shared_data_1.context, card_index, get_profile_count_cb, &profile_count); + + // Wait for the PulseAudio operation to complete. + iterate(count_op); + + return profile_count; // Return the total count of profiles. +} + +/** + * @brief Callback function used to populate the list of available audio sinks. + * + * This function is called for each audio sink found by PulseAudio when querying + * for the list of sinks. The function populates the `shared_sink_data` structure + * with `pa_sink_info` for each sink. When the list is exhausted or there's an error, + * the function exits without further processing. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio sink information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function. + */ +static void get_available_output_devices_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + (void) userdata; + + uint32_t *count = &shared_data_3.count; + + // Handle errors in retrieving sink information. + if (eol < 0) { + fprintf(stderr, "Failed to get sink info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // If we've reached the end of the list of sinks, mark the end and exit the callback. + if (eol > 0) { + shared_data_3.sinks[*count] = NULL; // Set the last element to NULL as sentinel + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Allocate memory for the pa_sink_info structure. + shared_data_3.sinks[*count] = malloc(sizeof(pa_sink_info)); + if (shared_data_3.sinks[*count] == NULL) { + fprintf(stderr, "Failed to allocate memory for sink info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Copy the pa_sink_info structure. + *(shared_data_3.sinks[*count]) = *i; + + // Duplicate the strings to ensure they remain valid. + if (i->name != NULL) { + shared_data_3.sinks[*count]->name = strdup(i->name); + } + if (i->description != NULL) { + shared_data_3.sinks[*count]->description = strdup(i->description); + } + + (*count)++; +} + +/** + * @brief Retrieve the list of available audio sinks for a specific card. + * + * This function queries PulseAudio to get a list of all available audio sinks + * for a specified card index. It dynamically allocates memory based on the count + * of sinks to store the list of sinks. + * If PulseAudio is not initialized, the function attempts to initialize it. + * + * @param card_index The index of the card for which to retrieve the sinks. + * @return Pointer to the first sink in the list or NULL on error. + */ +pa_sink_info **get_available_output_devices() { + pa_operation *op = NULL; + + // Using get_output_device_count() to obtain the number of sinks + uint32_t max_sinks = get_output_device_count(); + + // Allocate memory for pointers + shared_data_3.sinks = malloc((max_sinks + 1) * sizeof(pa_sink_info*)); + shared_data_3.count = 0; // Reset count + + // Check for successful memory allocation + if (!shared_data_3.sinks) { + fprintf(stderr, "Failed to allocate memory for sinks.\n"); + return NULL; + } + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_available_output_devices(): failed to initialize pulseaudio.\n"); + free(shared_data_3.sinks); + shared_data_3.sinks = NULL; + return NULL; + } + } + + + // Query PulseAudio for the list of available sinks for the specified card + op = pa_context_get_sink_info_list(shared_data_1.context, get_available_output_devices_cb, NULL); + + // Wait for the PulseAudio operation to complete + iterate(op); + + return shared_data_3.sinks; +} + +/** + * @brief Frees the memory allocated for an array of output devices (sinks). + * + * This function iterates over an array of `pa_sink_info` pointers, freeing the memory for + * each sink's name and description strings, followed by the sink structure itself. It concludes + * by freeing the memory for the array of pointers. + * + * @param sinks A pointer to the first element in an array of `pa_sink_info` pointers, which + * must be terminated with a NULL pointer. If NULL is passed, the function does nothing. + */ +void delete_output_devices(pa_sink_info **sinks) { + if (sinks == NULL) { + return; + } + + for (int i = 0; sinks[i] != NULL; ++i) { + if (sinks[i]->name) { + free((char*)sinks[i]->name); + } + if (sinks[i]->description) { + free((char*)sinks[i]->description); + } + free(sinks[i]); + } + + free(sinks); +} + +/** + * @brief Frees the memory allocated for an array of input devices (sources). + * + * This function iterates over an array of `pa_source_info` pointers, freeing the memory for + * each source's name and description strings, followed by the source structure itself. It concludes + * by freeing the memory for the array of pointers. + * + * @param sources A pointer to the first element in an array of `pa_source_info` pointers, which + * must be terminated with a NULL pointer. If NULL is passed, the function does nothing. + */ +void delete_input_devices(pa_source_info **sources) { + if (!sources) { + return; // Nothing to do if the pointer is NULL + } + + // Iterate through each source info and free its memory + for (int i = 0; sources[i] != NULL; i++) { + if (sources[i]->name) { + free((char*)sources[i]->name); + } + if (sources[i]->description) { + free((char*)sources[i]->description); + } + free(sources[i]); + } + + // Free the array of pointers itself + free(sources); +} + + +/** + * @brief Callback function used to count the available audio devices (cards). + * + * This function is called for each audio device found by PulseAudio when querying + * for the list of devices. The function increments the device_count for each device. + * When the list is exhausted or there's an error, it signals the mainloop to continue. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio device information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function. + */ +static void get_output_device_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + (void) i; + + uint32_t *device_count = (uint32_t *) userdata; + + if (eol < 0) { + // Handle error + //fprintf(stderr,"[DEBUG, get_output_device_count_cb()] Reached elo < 0. Signal triggered.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + if (eol > 0) { + // End of list + //fprintf(stderr,"[DEBUG, get_output_device_count_cb()] Reached elo > 0. Signal triggered.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + ++(*device_count); +} + + + +/** + * @brief Retrieve the count of audio devices in the system. + * + * This function queries PulseAudio to get a count of all available audio devices (cards). + * If PulseAudio is not initialized, the function attempts to initialize it. If the initialization + * fails or there's an error in fetching the device count, it returns UINT32_MAX. + * + * @return Count of audio devices or UINT32_MAX on error. + */ +uint32_t get_output_device_count(void) { + uint32_t device_count = 0; // Initialize device count to zero. + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "get_device_count(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails. + } + } + + // Check if context is valid after initialization attempt. + if (!shared_data_1.context) { + fprintf(stderr, "Context is NULL in get_device_count.\n"); + return UINT32_MAX; + } + + //fprintf(stderr,"[get_device_count()] context is, %p\n",&shared_data_1.context); + //fprintf(stderr,"[get_device_count()] mainloop is, %p\n",&shared_data_1.mainloop); + + // Query PulseAudio for the list of audio devices (cards). + // The callback get_device_count_cb will increment the device_count for each device found. + count_op = pa_context_get_card_info_list(shared_data_1.context, get_output_device_count_cb, &device_count); + + // Wait for the PulseAudio operation to complete. + iterate(count_op); + + return device_count; // Return the total count of devices. +} + +/** + * @brief Retrieves the maximum number of channels for the given ALSA device name. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the maximum number of channels + * supported by the device. + * + * @param alsa_name Name of the ALSA device. + * @return Maximum number of channels supported by the device or -1 on error. + */ +int get_max_output_channels(const char *alsa_id, const pa_sink_info *sink_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int max_channels = 0; + int err; + + if (!alsa_id || !sink_info) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { + //fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return sink_info->sample_spec.channels; // Return channels from PulseAudio if ALSA fails + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + //fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_hw_params_get_channels_max(params, &max_channels)) < 0) { + //fprintf(stderr, "Error getting max channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + //fprintf(stderr, "[DEBUG, get_max_channels()] sink_info->sample_spec.channels is %i\n", sink_info->sample_spec.channels); + return sink_info->sample_spec.channels; + } + + snd_pcm_close(handle); + return max_channels; +} + +/** + * @brief Retrieves the minimum number of channels for the given ALSA device id. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the minimum number of channels + * supported by the device. + * + * @param alsa_name Name of the ALSA device. + * @return Minimum number of channels supported by the device or -1 on error. + */ +int get_min_output_channels(const char *alsa_id, const pa_sink_info *sink_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int min_channels = 0; + int err; + + //fprintf(stderr, "[DEBUG, get_min_channels()] sink_info->sample_spec.channels is %i\n", sink_info->sample_spec.channels); + + if (!alsa_id || !sink_info) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { + //fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return sink_info->sample_spec.channels; + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + //fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_hw_params_get_channels_min(params, &min_channels)) < 0) { + //fprintf(stderr, "Error getting min channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.channels; + } + + snd_pcm_close(handle); + return min_channels; +} + +/** + * @brief Callback function for retrieving the ALSA card name of a PulseAudio source. + * + * This callback is called by the PulseAudio context during the operation to retrieve + * information about each available source. It is registered with the + * pa_context_get_source_info_by_name() function call. + * + * @param c The PulseAudio context. + * @param i The source information structure containing details about the source. + * @param eol End of list indicator. If non-zero, indicates no more data to process. + * @param userdata User data provided when registering the callback. In this case, it is + * expected to be the name of the source for which we want the ALSA card name. + * + * @note This function is intended to be used internally and should not be called directly. + * + * @warning This function uses global shared data (shared_data_2.alsa_name) to store the + * retrieved ALSA name, and signals the main loop to stop waiting. Ensure that + * the main loop and shared data are properly managed. + */ +static void get_alsa_input_name_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + if (eol < 0 || !i) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; // Handle error or invalid source info + } + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; // End of list + } + + // Check if this source is the one we're interested in + if (userdata && strcmp(i->name, (const char *)userdata) == 0) { + const char *prop_alsa_card_name = pa_proplist_gets(i->proplist, "alsa.card_name"); + if (prop_alsa_card_name) { + shared_data_2.alsa_name = strdup(prop_alsa_card_name); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); // Signal to stop the loop + } + } +} + +/** + * @brief Retrieves the ALSA name of a given PulseAudio source. + * + * @param source_name The name of the source for which to retrieve the ALSA name. + * @return The ALSA name of the source or NULL if not found or on error. + */ +const char* get_alsa_input_name(const char *source_name) { + if (!source_name) { + fprintf(stderr, "get_alsa_input_name(): Invalid source name.\n"); + return NULL; + } + + shared_data_2.alsa_name = NULL; // Ensure alsa_name is initialized to NULL + + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "get_alsa_input_name(): PulseAudio initialization failed.\n"); + return NULL; + } + + pa_operation *name_op = pa_context_get_source_info_by_name(shared_data_1.context, source_name, get_alsa_input_name_cb, (void*)source_name); + iterate(name_op); + + return shared_data_2.alsa_name; +} + + +/** + * @brief Callback function to retrieve the ALSA name from the card info. + * + * This callback checks for the "alsa.card_name" property in the card's + * proplist. If the property is found, it assigns the property's value + * to the shared data structure for further use. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the card info structure. + * @param eol Flag indicating end of list. + * @param userdata User-defined data pointer (unused in this callback). + */ +static void get_alsa_output_name_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + + if (eol) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + const char *target_sink_name = userdata; + if (target_sink_name && strcmp(target_sink_name, i->name) != 0) { + return; // Skip this sink, as it does not match the specified name + } + + const char *alsa_name = pa_proplist_gets(i->proplist, "alsa.card_name"); + if (alsa_name) { + shared_data_2.alsa_name = strdup(alsa_name); + if (!shared_data_2.alsa_name) { + fprintf(stderr, "Failed to allocate memory for ALSA name.\n"); + } + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } +} + + + +/** + * @brief Retrieves the ALSA name of the first audio device encountered. + * + * This function initializes PulseAudio (if not already initialized), then + * queries PulseAudio for the list of audio devices. It waits for the + * retrieval operation to complete and then returns the ALSA name + * of the first device it finds with the "alsa.card_name" property. + * + * @return ALSA name of the device or NULL if not found or on error. + */ +const char* get_alsa_output_name(const char *sink_name) { + pa_operation *name_op; + + shared_data_2.alsa_name = NULL; // Ensure alsa_name is initialized to NULL + + + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "get_alsa_name(): PulseAudio initialization failed.\n"); + return NULL; + } + + name_op = pa_context_get_sink_info_list(shared_data_1.context, get_alsa_output_name_cb, (void*)sink_name); + iterate(name_op); + + return shared_data_2.alsa_name; +} + +/** + * @brief Callback function to retrieve the ALSA device string based on the PulseAudio sink information. + * + * This function is called for each available PulseAudio sink. It checks if the sink's name matches the + * target sink name provided in the userdata. If a match is found, it retrieves the "alsa.card" and + * "alsa.device" properties from the sink's proplist, constructs the ALSA device string in the format + * "hw:,", and stores it in shared data for later retrieval. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the sink information structure. + * @param eol End of list flag. If non-zero, indicates the end of the sink list. + * @param userdata User-defined data pointer. In this case, it points to the target sink name string. + */ + + +static void get_alsa_id_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; // Unused parameter + + // Check for end of list + if (eol) { + // Signal the main loop to unblock the iterate function + //fprintf(stderr,"[DEBUG, get_alsa_id_cb()] End of function reached.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + free(userdata); + return; + } + + // Retrieve the target sink name from userdata + const char *target_sink_name = userdata; + + // If a target sink name is provided, check if it matches the current sink's name + if (target_sink_name && strcmp(target_sink_name, i->name) != 0) { + return; // Skip this sink, as it does not match the specified name + } + + // Attempt to retrieve the "alsa.card" and "alsa.device" properties + const char *alsa_card = pa_proplist_gets(i->proplist, "alsa.card"); + const char *alsa_device = pa_proplist_gets(i->proplist, "alsa.device"); + + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()], alsa.card is %s\n", alsa_card); + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()], alsa.device is %s\n", alsa_device); + + // Check if both properties are available and alsa.device is a digit + if (alsa_card && alsa_device && isdigit((unsigned char)alsa_device[0])) { + // Construct the ALSA device string + char alsa_device_string[128]; + snprintf(alsa_device_string, sizeof(alsa_device_string), "hw:%s,%s", alsa_card, alsa_device); + + // Store the ALSA device string in shared data + shared_data_2.alsa_id = strdup(alsa_device_string); + if (!shared_data_2.alsa_id) { + fprintf(stderr, "Failed to allocate memory for ALSA device id.\n"); + } + } else { + fprintf(stderr, " - ALSA properties not found or invalid for sink.\n"); + } + + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()] alsa ID is %s\n", shared_data_2.alsa_id); + + // Signal the main loop to unblock the iterate function + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + + +/** + * @brief Retrieves the ALSA device string for a given PulseAudio sink name. + * + * This function initializes PulseAudio (if not already initialized), then queries PulseAudio for the + * information of a specific sink by its name. It waits for the retrieval operation to complete and then + * returns the constructed ALSA device string based on the "alsa.card" and "alsa.device" properties of + * the sink. + * + * @param sink_name The name of the PulseAudio sink. + * @return ALSA device string in the format "hw:," or NULL if not found or on error. + */ +const char* get_alsa_id(const char *sink_name) { + pa_operation *op; + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_alsa_id(): PulseAudio initialization failed.\n"); + return NULL; + } + } + + // Make a copy of the sink name to ensure it remains valid + char *sink_name_copy = strdup(sink_name); + if (!sink_name_copy) { + fprintf(stderr, "get_alsa_id(): Failed to allocate memory for sink name.\n"); + return NULL; + } + + // Query PulseAudio for the information of the specified sink + //fprintf(stderr,"[DEBUG, get_alsa_id()] sink name is: %s\n", sink_name_copy); + op = pa_context_get_sink_info_by_name(shared_data_1.context, sink_name_copy, get_alsa_id_cb, sink_name_copy); + + // Wait for the PulseAudio operation to complete + iterate(op); + + // Return the ALSA device string retrieved by the callback function + return shared_data_2.alsa_id; +} + +static void get_input_sample_rate_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; + if (eol < 0) { + // An error occurred + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + if (eol > 0) { + // No more entries + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Extract the sample rate and store it in the user data + uint32_t *sample_rate = userdata; + *sample_rate = i->sample_spec.rate; +} + +uint32_t get_input_sample_rate(const char *source_name) { + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "PulseAudio is not initialized.\n"); + return 0; + } + + uint32_t sample_rate = 0; + pa_operation *op = NULL; + + + // Get the source info, passing the address of sample_rate as user data + op = pa_context_get_source_info_by_name(shared_data_1.context, source_name, get_input_sample_rate_cb, &sample_rate); + iterate(op); + + return sample_rate; +} + +/** + * @brief Retrieves the sample rate of the given ALSA device. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the sample rate. + * + * @param alsa_id Name of the ALSA device. + * @param sink_info Pointer to a PulseAudio sink_info structure. + * @return Sample rate of the device or -1 on error. + */ +int get_output_sample_rate(const char *alsa_id, const pa_sink_info *sink_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int sample_rate; + int err; + + if (!alsa_id || !sink_info) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { + fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return sink_info->sample_spec.rate; // Return sample rate from PulseAudio if ALSA fails + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.rate; + } + + if ((err = snd_pcm_hw_params_get_rate(params, &sample_rate, 0)) < 0) { + //fprintf(stderr, "Error getting sample rate for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.rate; + } + + snd_pcm_close(handle); + return sample_rate; +} + +// Callback for source information to get ports +void get_source_ports(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + pa_source_info_list *info_list = (pa_source_info_list *)userdata; + if (eol > 0) { + info_list->done = 1; + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + info_list->ports = realloc(info_list->ports, (info_list->num_ports + 1) * sizeof(pa_port_info)); + pa_port_info *port = &info_list->ports[info_list->num_ports]; + port->name = strdup(i->name); + port->description = strdup(i->description); + port->is_active = 0; // Will be set in the active port callback + + info_list->num_ports++; +} + +// Callback for source information to get the active port +void get_active_port(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + pa_source_info_list *info_list = (pa_source_info_list *)userdata; + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (i->active_port) { + for (int j = 0; j < info_list->num_ports; ++j) { + if (strcmp(info_list->ports[j].name, i->active_port->name) == 0) { + info_list->ports[j].is_active = 1; + break; + } + } + } +} + +// Function to collect source port information and return it +pa_source_info_list* get_source_port_info() { + pa_source_info_list* info_list = malloc(sizeof(pa_source_info_list)); + if (!info_list) { + // Handle malloc failure + return NULL; + } + memset(info_list, 0, sizeof(pa_source_info_list)); + + // Call the function to get the list of sources + pa_operation *op = pa_context_get_source_info_list(shared_data_1.context, get_source_ports, info_list); + iterate(op); + + // Now iterate over the collected sources and get detailed info for each one + for (int i = 0; i < info_list->num_ports; ++i) { + op = pa_context_get_source_info_by_name(shared_data_1.context, info_list->ports[i].name, get_active_port, info_list); + + iterate(op); + } + + // The info_list now contains all the ports and their active status + return info_list; +} + + +/** + * @brief Retrieves the volume of a given channel from a PulseAudio sink. + * + * This function takes a pointer to a pa_sink_info structure and a channel index + * and returns the volume of that channel. The volume is given as a pa_volume_t, + * which is an unsigned 32-bit integer. The function checks if the channel index + * is within the valid range for the sink. + * + * @param sink_info A pointer to a pa_sink_info structure containing the sink details. + * @param channel_index The index of the channel for which to retrieve the volume. + * @return The volume of the specified channel as a pa_volume_t, or PA_VOLUME_INVALID on error. + */ +pa_volume_t get_channel_volume(const pa_sink_info *sink_info, unsigned int channel_index) { + // Check if the sink_info is NULL + if (sink_info == NULL) { + return PA_VOLUME_INVALID; // Return invalid volume if sink_info is NULL + } + + // Check if the provided channel index is valid + if (channel_index >= sink_info->channel_map.channels) { + return PA_VOLUME_INVALID; // Return invalid volume if the channel_index is out of range + } + + // Retrieve the volume of the given channel + return sink_info->volume.values[channel_index]; +} + + + +/** + * @brief Callback function for processing each available audio input device (source) found. + * + * This function is called by the PulseAudio context as part of the operation initiated by + * `get_available_input_devices`. It is invoked for each source found, and is responsible for + * storing the details of each source into a dynamically allocated array. The function handles + * memory allocation for the array of `pa_source_info` structures, as well as for the strings + * within them. It also handles error conditions and signals the mainloop to terminate the wait + * when the end of the source list is reached or an error occurs. + * + * @param c The PulseAudio context. + * @param i The `pa_source_info` structure containing details about the current source. + * @param eol End-Of-List indicator. If positive, indicates the end of the list; if negative, indicates an error. + * @param userdata User data pointer provided during the context operation setup; unused in this callback. + */ +static void get_available_input_devices_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void)c; // Unused parameter + //fprintf(stderr, "[DEBUG] %s called with eol=%d\n", __FUNCTION__, eol); // Debug statement for entry + (void)userdata; // Unused parameter + //fprintf(stderr, "[DEBUG] %s called with eol=%d\n", __FUNCTION__, eol); // Debug statement for entry + + // Error or end of list + if (eol < 0) { + //fprintf(stderr, "Failed to get source info.\n"); + //fprintf(stderr, "[DEBUG] Signaling main loop to continue.\n"); // Debug statement before signaling + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // If we've reached the end of the list, signal the main loop to stop waiting + if (eol > 0) { + shared_data_sources.sources[shared_data_sources.count] = NULL; // Sentinel value + //fprintf(stderr, "[DEBUG] Signaling main loop to continue.\n"); // Debug statement before signaling + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Allocate or resize the sources array as needed + if (shared_data_sources.count >= shared_data_sources.allocated) { + uint32_t new_size = (shared_data_sources.allocated + 8) * sizeof(pa_source_info *); + pa_source_info **temp = realloc(shared_data_sources.sources, new_size); + if (!temp) { + //fprintf(stderr, "Out of memory.\n"); + //fprintf(stderr, "[DEBUG] Signaling main loop to continue.\n"); // Debug statement before signaling + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + shared_data_sources.sources = temp; + shared_data_sources.allocated += 8; + } + + // Allocate memory for a new pa_source_info structure + shared_data_sources.sources[shared_data_sources.count] = malloc(sizeof(pa_source_info)); + if (!shared_data_sources.sources[shared_data_sources.count]) { + fprintf(stderr, "Failed to allocate memory for source info.\n"); + fprintf(stderr, "[DEBUG] Signaling main loop to continue.\n"); // Debug statement before signaling + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Copy the information from the callback + *(shared_data_sources.sources[shared_data_sources.count]) = *i; + + // Duplicate the strings to ensure they will remain valid + if (i->name) { + shared_data_sources.sources[shared_data_sources.count]->name = strdup(i->name); + } + if (i->description) { + shared_data_sources.sources[shared_data_sources.count]->description = strdup(i->description); + } + + // Increase the count of found sources + shared_data_sources.count++; +} + +/** + * @brief Retrieves an array of available audio input devices (sources). + * + * This function queries the PulseAudio server for a list of all audio input devices + * currently available. It ensures that PulseAudio is initialized before making the query + * and locks the main loop to provide thread safety during the operation. + * + * Each call to this function should be followed by a call to `delete_input_devices` + * to free the allocated memory for the returned array of `pa_source_info` pointers. + * + * @note The array is terminated with a NULL pointer as the last element. + * + * @return On success, a pointer to an array of `pa_source_info` pointers, each representing + * an audio input device. On failure, or if PulseAudio is not initialized, NULL is returned. + */ +pa_source_info **get_available_input_devices() { + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "PulseAudio is not initialized.\\n"); + return NULL; + } + + shared_data_sources.sources = NULL; + shared_data_sources.count = 0; + + // Prepare the PulseAudio operation to list the sources + pa_operation *op = pa_context_get_source_info_list(shared_data_1.context, get_available_input_devices_cb, NULL); + + // Wait for the operation to complete + iterate(op); + // Allocate one extra pointer to NULL at the end as a sentinel + shared_data_sources.sources = realloc(shared_data_sources.sources, (shared_data_sources.count + 1) * sizeof(pa_source_info *)); + shared_data_sources.sources[shared_data_sources.count] = NULL; + + return shared_data_sources.sources; +} + +/** + * @brief Callback function used to count the available audio input devices (sources). + * + * This function is called for each audio input device found by PulseAudio when querying + * for the list of sources. The function increments the device_count for each device. + * When the list is exhausted or there's an error, it signals the mainloop to continue. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio input device information. + * @param eol End-Of-List indicator. If positive, indicates the end of the list; if negative, indicates an error. + * @param userdata Pointer to the user data, which in this case is expected to be a pointer to the device_count. + */ +static void get_input_device_count_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; // Suppress unused parameter warning + (void) i; // Suppress unused parameter warning + + uint32_t *device_count = (uint32_t *) userdata; + + if (eol < 0) { + // Handle error + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + if (eol > 0) { + // End of list + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + ++(*device_count); +} + + +/** + * @brief Retrieve the count of audio input devices in the system. + * + * This function queries PulseAudio to get a count of all available audio input devices (sources). + * If PulseAudio is not initialized, the function attempts to initialize it. If the initialization + * fails or there's an error in fetching the device count, it returns UINT32_MAX. + * + * @return Count of audio input devices or UINT32_MAX on error. + */ +uint32_t get_input_device_count(void) { + uint32_t device_count = 0; // Initialize device count to zero + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_input_device_count(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails + } + } + + // Check if context is valid after initialization attempt + if (!shared_data_1.context) { + fprintf(stderr, "Context is NULL in get_input_device_count.\n"); + return UINT32_MAX; + } + + // Query PulseAudio for the list of audio input devices (sources) + count_op = pa_context_get_source_info_list(shared_data_1.context, get_input_device_count_cb, &device_count); + + // Wait for the PulseAudio operation to complete + iterate(count_op); + + return device_count; // Return the total count of input devices +} + diff --git a/v-0.06/system_query.h b/v-0.06/system_query.h new file mode 100644 index 0000000..e7b87a7 --- /dev/null +++ b/v-0.06/system_query.h @@ -0,0 +1,51 @@ +//Header definition files to query about sound card properties (number of sinks, profiles...) +#ifndef SYSTEM_QUERY_H +#define SYSTEM_QUERY_H + +#include +#include +#include +#include + +//Structures to get source port information (e.g, line in, microphone...) +//Used by get_source_port_info, get_active_port, and get_source_ports. +typedef struct pa_port_info { + char *name; // Port name + char *description; // Port description + bool is_active; // Is this the active port +} pa_port_info; + +typedef struct pa_source_info_list { + pa_port_info *ports; // Array of ports + int num_ports; // Number of ports + bool done; // Indicates if the callback has been called +} pa_source_info_list; + +uint32_t get_output_device_count(void); //Gets the number of output devices in the system. +uint32_t get_input_device_count(void); //Gets the number of input devices in the system. +uint32_t get_profile_count(uint32_t card_index); //Gets the number of profiles for a given soundcard. +pa_sink_info **get_available_output_devices(); //Gets the total available sinks (output devices) for this system. +pa_source_info **get_available_input_devices(); //Gets the total available sources (input devices) for this system. +const char* get_alsa_output_name(const char *sink_name); //Gets the corresponding alsa name of a pulseaudio sink (output device). +pa_source_info_list* get_source_port_info(); //Returns which ports in the source are available (mic, line in...). +const char* get_alsa_input_name(const char *source_name); //Gets the corresponding alsa name of a pulseaudio source (input device). +int get_max_output_channels(const char *alsa_id, +const pa_sink_info *sink_info); //Gets the maximum output channels an ALSA card supports. + +int get_min_output_channels(const char *alsa_id, +const pa_sink_info *sink_info); //Gets the maximum output channels an ALSA card supports. + +const char* get_alsa_id(const char *sink_name); //Gets the alsa id based on the pulseaudio channel name. + +int get_output_sample_rate(const char *alsa_id, +const pa_sink_info *sink_info); //Gets the sample rate of a pulseaudio sink (output device). + +uint32_t get_input_sample_rate(const char *source_name); //Gets the sample rate of a pulseaudio source (input device). + +void delete_output_devices(pa_sink_info **sinks); //Releases memory for allocated output devices. +void delete_input_devices(pa_source_info **sources); //Releases memory for allocated input devices. +pa_volume_t get_channel_volume(const pa_sink_info *sink_info, +unsigned int channel_index); //Retrieves the volume of a given channel. + + +#endif From 00f1bd2171f3b3456fcee898826ea7278650e06f Mon Sep 17 00:00:00 2001 From: NMagic Date: Sun, 5 Nov 2023 20:26:12 -0300 Subject: [PATCH 10/20] ... Added extra sink functions. --- v-0.07/Makefile | 20 + .../pa_context -- interface overview.docx | Bin 0 -> 33970 bytes .../pavucontrol sink update flow.txt | 41 + .../pulseaudio/introspect.c summary | 79 + .../pulseaudio/mainloop code flow.txt | 17 + v-0.07/easypulse_core.c | 843 ++++++++ v-0.07/easypulse_core.h | 90 + v-0.07/examples/Makefile | 19 + v-0.07/examples/alsa-mapper_pulseaudio-api | Bin 0 -> 91520 bytes v-0.07/examples/alsa-mapper_pulseaudio-api.c | 91 + v-0.07/examples/change-speaker-mode | Bin 0 -> 87808 bytes v-0.07/examples/change-speaker-mode.c | 88 + v-0.07/examples/error.txt | 103 + .../examples/get-card-profiles-pulseaudio_api | Bin 0 -> 89024 bytes .../get-card-profiles-pulseaudio_api.c | 63 + v-0.07/examples/print-input-sources | Bin 0 -> 88800 bytes v-0.07/examples/print-input-sources.c | 90 + v-0.07/examples/print_volume_output_devices | Bin 0 -> 88320 bytes v-0.07/examples/print_volume_output_devices.c | 72 + v-0.07/examples/switch-sink | Bin 0 -> 88312 bytes v-0.07/examples/switch-sink-pulseaudio | Bin 0 -> 90472 bytes v-0.07/examples/switch-sink-pulseaudio.c | 62 + v-0.07/examples/switch-sink.c | 61 + v-0.07/examples/volume-change | Bin 0 -> 87840 bytes v-0.07/examples/volume-change-pulseaudio | Bin 0 -> 90512 bytes v-0.07/examples/volume-change-pulseaudio.c | 101 + v-0.07/examples/volume-change.c | 82 + v-0.07/libeasypulse_core.a | Bin 0 -> 39642 bytes v-0.07/system_query.c | 1712 +++++++++++++++++ v-0.07/system_query.h | 65 + 30 files changed, 3699 insertions(+) create mode 100644 v-0.07/Makefile create mode 100644 v-0.07/documentation/pa_context -- interface overview.docx create mode 100644 v-0.07/documentation/pavucontrol/pavucontrol sink update flow.txt create mode 100644 v-0.07/documentation/pulseaudio/introspect.c summary create mode 100644 v-0.07/documentation/pulseaudio/mainloop code flow.txt create mode 100644 v-0.07/easypulse_core.c create mode 100644 v-0.07/easypulse_core.h create mode 100644 v-0.07/examples/Makefile create mode 100755 v-0.07/examples/alsa-mapper_pulseaudio-api create mode 100644 v-0.07/examples/alsa-mapper_pulseaudio-api.c create mode 100755 v-0.07/examples/change-speaker-mode create mode 100644 v-0.07/examples/change-speaker-mode.c create mode 100644 v-0.07/examples/error.txt create mode 100755 v-0.07/examples/get-card-profiles-pulseaudio_api create mode 100644 v-0.07/examples/get-card-profiles-pulseaudio_api.c create mode 100755 v-0.07/examples/print-input-sources create mode 100644 v-0.07/examples/print-input-sources.c create mode 100755 v-0.07/examples/print_volume_output_devices create mode 100644 v-0.07/examples/print_volume_output_devices.c create mode 100755 v-0.07/examples/switch-sink create mode 100755 v-0.07/examples/switch-sink-pulseaudio create mode 100644 v-0.07/examples/switch-sink-pulseaudio.c create mode 100644 v-0.07/examples/switch-sink.c create mode 100755 v-0.07/examples/volume-change create mode 100755 v-0.07/examples/volume-change-pulseaudio create mode 100644 v-0.07/examples/volume-change-pulseaudio.c create mode 100644 v-0.07/examples/volume-change.c create mode 100644 v-0.07/libeasypulse_core.a create mode 100644 v-0.07/system_query.c create mode 100644 v-0.07/system_query.h diff --git a/v-0.07/Makefile b/v-0.07/Makefile new file mode 100644 index 0000000..b1c5107 --- /dev/null +++ b/v-0.07/Makefile @@ -0,0 +1,20 @@ +CC = gcc +CFLAGS = -Wall -g -Wextra + +LIB_NAME = easypulse_core +LIB_SRC = easypulse_core.c +LIB_OBJ = easypulse_core.o +LIB_OUT = lib$(LIB_NAME).a + +all: $(LIB_OUT) + +$(LIB_OUT): $(LIB_OBJ) + ar rcs $(LIB_OUT) $(LIB_OBJ) + +$(LIB_OBJ): $(LIB_SRC) + $(CC) $(CFLAGS) -c $(LIB_SRC) -o $(LIB_OBJ) + +clean: + rm -f $(LIB_OBJ) $(LIB_OUT) + +.PHONY: all clean diff --git a/v-0.07/documentation/pa_context -- interface overview.docx b/v-0.07/documentation/pa_context -- interface overview.docx new file mode 100644 index 0000000000000000000000000000000000000000..6cbe2d09c38dfcab843409c88d5b9d8666c90192 GIT binary patch literal 33970 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 literal 0 HcmV?d00001 diff --git a/v-0.07/documentation/pavucontrol/pavucontrol sink update flow.txt b/v-0.07/documentation/pavucontrol/pavucontrol sink update flow.txt new file mode 100644 index 0000000..9428de8 --- /dev/null +++ b/v-0.07/documentation/pavucontrol/pavucontrol sink update flow.txt @@ -0,0 +1,41 @@ ++----------------+ +| pavucontrol | +| (initial file)| ++----------------+ + | + | Callback function triggered when there's info/change related to a sink + V ++----------------+ +| sink_cb | +| (pavucontrol.cc)| ++----------------+ + | + | - If error, show error and return + | - If end-of-list (eol) is reached, decrease outstanding tasks count and return + | - Update GUI representation of a sink using w->updateSink() + V ++---------------------------+ +| MainWindow::updateSink | +| (mainwindow.cc & .h) | ++---------------------------+ + | + | - Retrieve or create SinkWidget for the sink + | - Update SinkWidget properties (e.g., volume, mute state, active port, etc.) + | - Prepare context menu for the sink + | - Ensure the sink is displayed correctly via updateDeviceVisibility + V ++-------------------------------------+ +| MainWindow::updateDeviceVisibility | +| (mainwindow.cc & .h) | ++-------------------------------------+ + | + | - If idle source/callback is already queued, return + | - Schedule the idle_cb function to be called when the app is idle + V ++----------------+ +| idle_cb | +| (mainwindow.cc)| ++----------------+ + | + V + ... (Specific steps and logic for updating device visibility) diff --git a/v-0.07/documentation/pulseaudio/introspect.c summary b/v-0.07/documentation/pulseaudio/introspect.c summary new file mode 100644 index 0000000..d9616f2 --- /dev/null +++ b/v-0.07/documentation/pulseaudio/introspect.c summary @@ -0,0 +1,79 @@ +* !pa_tagstruct_eof (context_string_callback): this function seems to be a callback function for processing string responses from the server. It examines the incoming command and checks for errors. If there's an error or if the command isn't a reply, it sets the success flag to 0 and prepares an empty response string. If the command is a reply, it extracts the response string from the tag structure. If there's any issue with extracting the string or if there's unexpected data in the tag structure, it flags a protocol error. + +* pa_context_stat: this function sends a simple command to request statistics. It leverages another function pa_context_send_simple_command and provides the context_stat_callback as the callback function to handle the response. It's used to retrieve statistical information. + +* pa_context_get_server_info: similar to the previous function, this function sends a command to get server information. It again uses pa_context_send_simple_command, but this time with a different callback, context_get_server_info_callback, to process the server information response. + +* context_get_sink_info_callback: this function is a callback that processes information about a sink. It first ensures that the operation and context are valid. If the received command is not a reply, it handles the error. If it is a reply, it starts parsing the sink information from the tag structure, extracting details like the sink's name, description, sample specification, channel map, owner module, volume, mute status, monitor source, latency, and more. The function seems to account for different versions of the context and extracts varying levels of information based on that. + +* pa_tagstruct_getu32: this function seems to be a snippet or part of another function and is possibly not a standalone function. It attempts to retrieve a 32-bit unsigned integer from a tag structure. If unsuccessful, it returns an error indicating a protocol issue. + +* pa_context_get_sink_info_list: this function sends a command to retrieve a list of sink information. It utilizes the pa_context_send_simple_command function and provides the context_get_sink_info_callback as the callback to process the list of sinks. + +* pa_context_get_sink_info_by_index: this function requests information about a specific sink identified by its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SINK_INFO) with the specified sink index and sends it to the server. The response from the server is expected to be handled by the context_get_sink_info_callback. + +* pa_context_get_sink_info_by_name: similar to the previous function, this one requests information about a sink, but it identifies the sink by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SINK_INFO) with the specified sink name to the server. The server's response will be processed by the context_get_sink_info_callback. + +* pa_context_set_sink_port_by_index: this function is designed to set the port for a specific sink identified by its index. After some validity checks, it builds a command (PA_COMMAND_SET_SINK_PORT) with the given sink index and port information, then sends this command to the server. The acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_sink_port_by_name: this function sets the port of a sink based on its name. It first performs some validation checks, then constructs a command with the sink's name and desired port. This command is sent to the PulseAudio server, and the response will be handled by a generic acknowledgment callback. + +* context_get_source_info_callback: this callback function processes information about a source. It starts by performing some initializations and checks. If the received command is a reply, it begins parsing the source information from the tag structure. This includes extracting details like the source's name, description, sample specification, volume, mute status, latency, and more. It appears to accommodate different versions of the context, extracting varying levels of information based on that. + +* pa_context_get_source_info_list: this function sends a command to retrieve a list of source information. It employs the pa_context_send_simple_command function, providing the context_get_source_info_callback as the callback to process the list of sources. + +* pa_context_get_source_info_by_index: this function retrieves information about a specific audio source based on its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source index and sends it to the server. The response from the server is expected to be handled by the context_get_source_info_callback. + +* pa_context_get_source_info_by_name: similar to the previous function, this one retrieves information about a source but identifies the source by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source name to the server. The server's response is again expected to be processed by the context_get_source_info_callback. + +* pa_context_set_source_port_by_index: this function sets the port of a specific source based on its index. After performing some validity checks and ensuring that the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source index. This command is sent to the server, and the acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_source_port_by_name: this function is designed to set the port of a specific audio source based on its name. It constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source name and sends this command to the PulseAudio server. The server's response will be handled by a generic acknowledgment callback. + +* context_get_client_info_callback: This callback function processes client-related information. It first performs checks to ensure the received command is a reply. If it is, the function begins parsing the client information, extracting details like client index, name, owner module, and driver. The function appears to be prepared to handle multiple client records in the same response and will loop through them until the end of the tag structure. + +* pa_context_get_client_info: this function requests information about a specific client based on its index. It constructs and sends a command (PA_COMMAND_GET_CLIENT_INFO) with the specified client index to the server. The server's response is expected to be processed by the context_get_client_info_callback. + +* pa_context_get_client_info_list: this function requests a list of client information from the PulseAudio server. It utilizes the pa_context_send_simple_command function and specifies the PA_COMMAND_GET_CLIENT_INFO_LIST command. The response from the server is expected to be handled by the context_get_client_info_callback. + + +* card_info_free: this is a utility function designed to free the memory associated with a pa_card_info structure. It releases memory for various properties and profiles associated with the card, such as its property list (proplist), profiles (profiles), and extended profile information (profiles2). + +* fill_card_port_info: this function populates the port information for a given card. It starts by extracting the number of ports (n_ports) for the card from a tag structure. If the card has ports, it then proceeds to fill in details about each port. If there's a protocol error while fetching the details, it returns an error. + +* fill_card_profile_info: this function is responsible for populating the profile information of a given card. It begins by allocating memory for the profiles and then proceeds to iterate through each profile, extracting details like name, description, number of sinks, number of sources, and priority. It also accounts for different versions of the context, fetching additional details if the version is >= 29. + + +* context_get_card_info_callback: this callback function processes card-related information. It starts by performing initialization checks and then examines the received command. If the command is a reply, the function starts parsing card details like index, name, owner module, driver, and the number of profiles. It then calls the fill_card_profile_info function to populate the profiles for the card. If there are any protocol errors during this process, the function handles them accordingly. + + +* pa_tagstruct_get_proplist: This function seems to be a snippet or a partial representation of a larger function. Its purpose appears to be to extract a property list (proplist) from a tag structure. If there's any issue during this extraction, it flags an error. + + +* pa_context_get_card_info_by_index: this function requests information about a specific card based on its index. After performing several validity checks, it constructs a command (PA_COMMAND_GET_CARD_INFO) with the specified card index and sends it to the server. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_by_name: similar to the previous function, this one requests information about a card, but it identifies the card by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_CARD_INFO) with the specified card name to the server. Again, the server's response is expected to be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_list: this function requests a list of all card information from the PulseAudio server. It employs the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_CARD_INFO_LIST command. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_set_card_profile_by_index: this function sets the profile of a specific card based on its index. After checking the validity of the context and ensuring the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the specified card index and desired profile. This command is sent to the server, and the response is handled by a generic acknowledgment callback. + +* pa_context_set_card_profile_by_name: this function sets the profile of a card identified by its name. Like the previous function, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the card name and desired profile, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_module_info_callback: this callback function processes module-related information. It checks if the received command is a reply and, if so, starts parsing the module details. This includes extracting details like the module's index, name, argument, and usage count. If there's an error or unexpected end of file in the tag structure, it flags a protocol error. + +* pa_context_get_module_info: this function retrieves information about a specific module based on its index. After conducting various validity checks, it constructs a command (PA_COMMAND_GET_MODULE_INFO) with the specified module index and sends it to the server. The response from the server will be processed by the context_get_module_info_callback. + +* pa_context_get_module_info_list: this function requests a list of all module information from the PulseAudio server. It uses the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_MODULE_INFO_LIST command. The server's response will be processed by the context_get_module_info_callback. + +* context_get_sink_input_info_callback: this callback function processes information related to sink inputs. It checks if the received command is a reply and, if so, starts parsing the sink input details. This includes extracting details like the sink input's index, name, owner module, client, sink, sample specification, channel map, volume, buffer usec, sink usec, resample method, driver, and more. It also accounts for different versions of the context, extracting varying levels of information based on that. + +* pa_context_set_source_output_volume: this function sets the volume of a specific source output based on its index. It starts by performing various checks, including verifying the validity of the provided volume. It then constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_VOLUME) with the specified source output index and volume and sends it to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_set_source_output_mute: this function mutes or unmutes a specific source output based on its index. It constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_MUTE) with the desired mute status and the source output index, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_sample_info_callback: this callback function processes sample-related information. It checks if the received command is a reply and, if so, begins parsing the sample details, extracting attributes like the sample's index, name, volume, mute status, proplist, and more. The function also handles possible protocol errors and is prepared to process multiple sample records in the same response. + +* pa_context_suspend_source_by_index: this function suspends or resumes a specific source based on its index. It verifies the server version, constructs a command (PA_COMMAND_SUSPEND_SOURCE) with the desired suspend status and source index, and then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_send_message_to_object: this function sends a message to a specific object within the PulseAudio server. After checking the server version and other conditions, it constructs a command (PA_COMMAND_SEND_OBJECT_MESSAGE) with the object's path, the message, and any additional parameters. The server's response will be processed by a callback function. diff --git a/v-0.07/documentation/pulseaudio/mainloop code flow.txt b/v-0.07/documentation/pulseaudio/mainloop code flow.txt new file mode 100644 index 0000000..f4c8b96 --- /dev/null +++ b/v-0.07/documentation/pulseaudio/mainloop code flow.txt @@ -0,0 +1,17 @@ ++---------------------------------------------+ +| Mainloop | +| | +| +--------------+ +-------------------+ | +| | I/O Events | | Timers | | +| +--------------+ +-------------------+ | +| | +| +--------------+ +-------------------+ | +| | Signals | | Deferred Callbacks| | +| +--------------+ +-------------------+ | +| | +| +---------------------+ | +| | Other Asynchronous | | +| | Tasks | | +| +---------------------+ | +| | ++---------------------------------------------+ diff --git a/v-0.07/easypulse_core.c b/v-0.07/easypulse_core.c new file mode 100644 index 0000000..15ec1ba --- /dev/null +++ b/v-0.07/easypulse_core.c @@ -0,0 +1,843 @@ +/** + * @file easypulse_core.c + * @brief Implementation of the easypulse core functions. + * + * This file provides the core functionality to interact with PulseAudio, + * allowing operations like setting the default device and adjusting volume. + */ + +#include "easypulse_core.h" +#include +#include +#include +#include +#include +#include +#include + +//Variables shared for count_profile function and its callback. +typedef struct { + pulseaudio_manager *manager; + pulseaudio_device *device; + uint32_t profile_count; +} _shared_vars_1; + +static _shared_vars_1 shared_vars_1; + +/** + * @brief Callback function to check the state of the PulseAudio context. + * @param c The PulseAudio context. + * @param userdata User-provided data (expected to be a pointer to an int indicating readiness). + */ +static void context_state_cb(pa_context *c, void *userdata) { + pa_context_state_t state; + pulseaudio_manager *manager = (pulseaudio_manager *) userdata; + int *pa_ready = &(manager->pa_ready); + pa_threaded_mainloop *m = manager->mainloop; + + state = pa_context_get_state(c); + switch (state) { + // There are other states you can handle, but these are the important ones + case PA_CONTEXT_CONNECTING: + case PA_CONTEXT_AUTHORIZING: + case PA_CONTEXT_SETTING_NAME: + default: + break; + case PA_CONTEXT_READY: + *pa_ready = 1; + pa_threaded_mainloop_signal(m, 0); + break; + case PA_CONTEXT_FAILED: + case PA_CONTEXT_TERMINATED: + *pa_ready = 2; + pa_threaded_mainloop_signal(m, 0); + break; + } +} + + +/** + * @brief Initializes the pulseaudio_manager. + * + * @param self Pointer to the pulseaudio_manager instance. + * @return Boolean indicating success or failure. + */ +bool initialize(pulseaudio_manager *self) { + // 1. Create the threaded mainloop + self->mainloop = pa_threaded_mainloop_new(); + if (!self->mainloop) { + return false; + } + + // Get the mainloop API + pa_mainloop_api *mlapi = pa_threaded_mainloop_get_api(self->mainloop); + + // Create the context + self->context = pa_context_new(mlapi, "PulseAudio Manager"); + if (!self->context) { + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // Set the state callback + pa_context_set_state_callback(self->context, context_state_cb, self); + + // Lock the mainloop and connect the context + pa_threaded_mainloop_lock(self->mainloop); + + if (pa_context_connect(self->context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) { + pa_threaded_mainloop_unlock(self->mainloop); + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // 2. Start the threaded mainloop + pa_threaded_mainloop_start(self->mainloop); + + // 4. Wait for the context to be ready + while (self->pa_ready == 0) { + pa_threaded_mainloop_wait(self->mainloop); + } + + pa_threaded_mainloop_unlock(self->mainloop); + + if (self->pa_ready == 2) { + return false; + } + + return true; +} + + +/** + * @brief Cleans up the pulseaudio_manager. + * + * @param self Pointer to the pulseaudio_manager instance. + * @return Boolean indicating success or failure. + */ +static bool cleanup(pulseaudio_manager *self) { + // Lock the mainloop before making changes to the context + pa_threaded_mainloop_lock(self->mainloop); + + // Disconnect the context + pa_context_disconnect(self->context); + + // Unlock the mainloop before stopping it + pa_threaded_mainloop_unlock(self->mainloop); + + // Stop the threaded mainloop + pa_threaded_mainloop_stop(self->mainloop); + + // Unreference the context + pa_context_unref(self->context); + + // Free the threaded mainloop + pa_threaded_mainloop_free(self->mainloop); + + return true; +} + + +/** + * @brief Nested callback to load sound card profiles for a device. + * + * This function is triggered after invoking pa_context_get_card_info_by_index() + * to fetch details about a specific card. It is responsible for allocating memory + * for the profiles associated with the card and populating them with the relevant details. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the pa_card_info structure containing details about the card. + * @param eol Indicates the end of the list. If eol > 0, the list has ended or no more data is available. + * @param userdata User-provided data, expected to be a pointer to the profiles field of a pulseaudio_device structure. + */ +static void load_devices_cb_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + + // Cast userdata to a double pointer to pulseaudio_profile + pulseaudio_profile **profiles_ptr = (pulseaudio_profile **) userdata; + + // If eol > 0, the list has ended or no more data is available + if (eol > 0) { + return; + } + + // Allocate memory for device profiles based on the number of profiles available for the card + *profiles_ptr = malloc(i->n_profiles * sizeof(pulseaudio_profile)); + if (!*profiles_ptr) { + fprintf(stderr, "[ERROR]: Failed to allocate memory for profiles.\n"); + return; + } + + // Populate the allocated memory with the profile details + for (uint32_t j = 0; j < i->n_profiles; j++) { + (*profiles_ptr)[j].name = strdup(i->profiles[j].name); + (*profiles_ptr)[j].description = strdup(i->profiles[j].description); + } +} + +/** + * @brief Callback function for retrieving device information. + * @param c The PulseAudio context. + * @param i The device information. + * @param eol End of list flag. + * @param userdata User-provided data (expected to be a pointer to pulseaudio_manager). + */ +static void load_devices_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + (void) userdata; +#if 0 + //Variable to check if devices need to be reloaded. + static bool reload_devices = false; + pulseaudio_manager *manager = (pulseaudio_manager *)userdata; + pulseaudio_device *devices = NULL; + pulseaudio_profile *profiles = NULL; + + if(manager->devices) { + devices = manager->devices; + if(manager->devices->profiles) profiles = manager->devices->profiles; + } + + if(reload_devices == true) { + for(uint32_t i = 0; i < manager->device_count; ++i) { + for(uint32_t j = 0 j > profiles-> + } + } + + manager->devices = (pulseaudio_device *)malloc(manager->device_count * sizeof(pulseaudio_device)); + + if (!manager->devices) { + free(manager); + return NULL; + } +#endif + +#if 0 + //TODO: rewrite this so that this is called every time load_devices has been called again. + //We need to detect that. + //size_t newSize = (manager->device_count) * sizeof(pulseaudio_device); + //pulseaudio_device *new_devices = realloc(manager->devices, newSize); + + /*if (!new_devices) { + fprintf(stderr, "[ERROR]: Failed to resize the devices array.\n"); + free(manager->devices); // Free old memory + manager->devices = NULL; + manager->device_count = 0; // Reset device_count to prevent out-of-bounds access + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + manager->devices = new_devices; */ + + if (eol < 0) { + if (pa_context_errno(c) != PA_ERR_NOENTITY) + fprintf(stderr, "Sink callback failure\\n"); + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + + if (eol > 0) { + manager->devices_loaded = 1; + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + + // Store the device's information + pulseaudio_device device; + device.index = i->index; + device.code = strdup(i->name); + device.description = strdup(i->description); + device.volume = i->volume; + device.channel_map = i->channel_map; + device.mute = i->mute; + + //Pulseaudio operation to fetch card profiles. + //pa_operation *profile_op = pa_context_get_card_info_by_index(manager->context,device.index,load_devices_cb_cb,&i->profiles); + //iterate(manager, profile_op); + + // Add the device to the manager's list + manager->devices[manager->device_count++] = device; + + pa_threaded_mainloop_signal(manager->mainloop, 0); + #endif +} + +/** + * @brief Load available sound cards (devices). + * @param self The pulseaudio_manager instance. + * @return true on success, false otherwise. + */ +bool load_devices(pulseaudio_manager *self) { + pa_operation *data_op; + + data_op = pa_context_get_sink_info_list(self->context, load_devices_cb, self); + iterate(self, data_op); + + #if 0 + pa_threaded_mainloop_lock(self->mainloop); + data_op = pa_context_get_sink_info_list(self->context, load_devices_cb, self); + pa_threaded_mainloop_wait(self->mainloop); + + // Once all devices are loaded, loads the active device. + // get_active_device(self); + + pa_threaded_mainloop_unlock(self->mainloop); + pa_operation_unref(data_op); + #endif + return true; +} + + +/** + * @brief Callback function handling the completion of the "unmute" operation. + * + * @param c The PulseAudio context. + * @param success A flag indicating the success or failure of the operation. + * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. + */ +static void operation_complete_unmute_cb(pa_context *c, int success, void *userdata) { + (void)c; // Suppress unused parameter warning + + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + manager->operations_pending--; + + if (!success) { + fprintf(stderr, "Failed to unmute the device input.\n"); + } + + // Signal the mainloop to resume any waiting threads. + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + +/** + * @brief Callback function handling the completion of the "move" operation. + * + * @param c The PulseAudio context. + * @param success A flag indicating the success or failure of the operation. + * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. + */ +static void operation_complete_move_cb(pa_context *c, int success, void *userdata) { + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + + if (success) { + pa_operation* unmute_op = pa_context_set_sink_input_mute(c, manager->current_device_index, 0, operation_complete_unmute_cb, manager); + pa_operation_unref(unmute_op); + } else { + // Handle error... + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + +/** + * @brief Callback function handling the completion of the "mute" operation. + * + * @param c The PulseAudio context. + * @param success A flag indicating the success or failure of the operation. + * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. + */ +static void operation_complete_mute_cb(pa_context *c, int success, void *userdata) { + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + uint32_t target_device_index = manager->current_device_index; + + if (success) { + pa_operation* move_op = pa_context_move_sink_input_by_index(c, manager->current_device_index, target_device_index, operation_complete_move_cb, manager); + pa_operation_unref(move_op); + } else { + // Handle error... + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + +/** + * @brief Callback function to handle each device input. + * @param c The PulseAudio context. + * @param i The device input information. + * @param eol End of list flag. + * @param userdata User-provided data (expected to be a pointer to the target device index). + */ +static void switch_device_cb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata) { + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + + if (!eol && i) { + // Move this device input to the desired device + pa_operation* move_op = pa_context_move_sink_input_by_index(c, i->index, manager->devices[manager->current_device_index].index, NULL, NULL); + pa_operation_unref(move_op); + } + + if (eol) { + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + +/** + * @brief Switches the device (audio source) for the pulseaudio_manager. + * + * @param self Pointer to the pulseaudio_manager instance. + * @param device_index Index of the device to switch to. + * @return Boolean indicating success or failure. + */ +bool switch_device(pulseaudio_manager *self, uint32_t device_index) { + // Ensure the context is valid + if (!self || !self->context) { + return false; + } + + // Check if device_index is out of bounds + if (device_index >= self->device_count) { + fprintf(stderr, "[ERROR]: device_index out of bounds.\n"); + return false; + } + + self->current_device_index = device_index; + + // Set the desired device as the default device + /*fprintf(stderr, "[DEBUG]: self->context = %p\n", self->context); + fprintf(stderr, "[DEBUG]: self->devices = %p\n", self->devices); + fprintf(stderr, "[DEBUG]: device_index = %d\n", device_index);*/ + + if (self->devices) { + // Check if the name attribute is NULL + if (!self->devices[device_index].code) { + fprintf(stderr, "[ERROR]: Sink's name is NULL.\n"); + return false; + } + //fprintf(stderr, "[DEBUG]: self->devices[device_index].code = %s\n", self->devices[device_index].code); + } + pa_operation* set_default_op = pa_context_set_default_sink(self->context, self->devices[device_index].code, NULL, NULL); + pa_operation_unref(set_default_op); + + // Use the introspect API to get a list of all device inputs + pa_operation *op = pa_context_get_sink_input_info_list(self->context, switch_device_cb, self); + + if (!op) { + return false; + } + + while (pa_operation_get_state(op) == PA_OPERATION_RUNNING) { + iterate(self, op); + } + + pa_operation_unref(op); + + return true; +} + + +/** + * @brief Process PulseAudio profiles using a null sink. + * + * This function initializes a null sink, iterates through all `pulseaudio_profile`s, + * retrieves the number of channels from the device's channel map, assigns it to the + * profile's `channels` attribute, and finally unloads the null sink. + * + * @param manager A pointer to the `pulseaudio_manager` structure. + * + * @note This function uses the `iterate` method from `pulseaudio_manager` to wait for PulseAudio operations to complete. + * + * @warning Ensure that the `pulseaudio_manager` is properly initialized before calling this function. + */ +void get_profile_channels(pulseaudio_manager *manager) { + uint32_t module_index = PA_INVALID_INDEX; + + // Static variable to track if the mainloop is locked + static int is_mainloop_locked = 0; + + // Check if the threaded mainloop is locked + if (!is_mainloop_locked) { + pa_threaded_mainloop_lock(manager->mainloop); + is_mainloop_locked = 1; + } + + // Callback to capture the module index when loading the null sink module + void load_module_callback(pa_context *c, uint32_t idx, void *userdata) { + (void) c; + (void) userdata; + module_index = idx; + } + + // 1. Initialize a Null Sink + pa_operation *load_op = pa_context_load_module(manager->context, "module-null-sink", "sink_name=easy_pulse_null_sink", load_module_callback, NULL); + if (!load_op) { + fprintf(stderr, "Failed to load null sink module\n"); + if (is_mainloop_locked) { + pa_threaded_mainloop_unlock(manager->mainloop); + is_mainloop_locked = 0; + } + return; + } + + // Wait for the operation to complete and for the callback to capture the module index + iterate(manager, load_op); + + // 2. Iterate through Profiles and Extract Channel Map + for (uint32_t i = 0; i < manager->device_count; i++) { + pulseaudio_device *device = &(manager->devices[i]); + for (uint32_t j = 0; j < device->profile_count; j++) { + pulseaudio_profile *profile = &(device->profiles[j]); + + // Extract the number of channels from the device's channel map + int num_channels = device->channel_map.channels; + + // Update the pulseaudio_profile with the number of channels + profile->channels = num_channels; + } + } + + // 3. Unload the Null Sink using the captured module index + if (module_index != PA_INVALID_INDEX) { + pa_operation *unload_op = pa_context_unload_module(manager->context, module_index, NULL, NULL); + if (!unload_op) { + fprintf(stderr, "Failed to unload null sink module\n"); + if (is_mainloop_locked) { + pa_threaded_mainloop_unlock(manager->mainloop); + is_mainloop_locked = 0; + } + return; + } + + // Wait for the operation to complete + iterate(manager, unload_op); + } else { + fprintf(stderr, "Invalid module index for null sink\n"); + } + + if (is_mainloop_locked) { + pa_threaded_mainloop_unlock(manager->mainloop); + is_mainloop_locked = 0; + } +} + + +/** + * @brief Retrieves the number of channels for a specified device. + * + * @param devices Pointer to an array of PulseSink structures. + * @param device_index Index of the device whose number of channels is to be retrieved. + * + * @return Number of channels for the specified device. Returns -1 on error. + */ +int get_active_profile_channels(const pulseaudio_device *devices, int device_index) { + if (!devices || device_index < 0) { + fprintf(stderr, "[ERROR]: Invalid devices array or device index in get_device_channels.\n"); + return -1; // Return -1 or another indicator of failure + } + return devices[device_index].channel_map.channels; +} + + + +/** + * @brief Callback function belonging to set_volume. Triggers when audio volume is set. + * + * + * @param c Pointer to the PulseAudio context. + * @param success Indicates the success (1) or failure (0) of the volume setting operation. + * @param userdata User data provided during the set_volume operation, expected to be of type `pulseaudio_manager`. + * + * @note On failure, an error message is printed to stderr with the reason for the failure. + * @note After the operations are processed, the function signals the main loop to continue. + */ +static void set_volume_cb1(pa_context *c, int success, void *userdata) { + (void) c; + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + + + if (!success) { + fprintf(stderr, "[ERROR]: Failed to set volume. Reason: %s\n", pa_strerror(pa_context_errno(c))); + } + + // Debug: Print cvolume values for each channel as percentages + //pa_cvolume cvolume = manager->devices[manager->active_device_index].volume; + + /*for (int i = 0; i < cvolume.channels; i++) { + float percentage = (cvolume.values[i] / (float)PA_VOLUME_NORM) * 100; + //printf("[DEBUG, volume_set_complete_cb()]: Channel %d cvolume value: %u (%.2f%%)\n", i, cvolume.values[i], percentage); + } + //printf("[DEBUG, volume_set_complete_cb invoked. Success: %d\n", success);*/ + + // Decrease the operations count and potentially signal the condition variable. + manager->operations_pending--; + + // Signal the main loop to continue + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + + +/** + * @brief Callback function belonging to set_volume. + * Triggers after audio volume levels are updated. + * + * @param c Pointer to the PulseAudio context. + * @param success Indicates the success (1) or failure (0) of the volume setting operation. + * @param userdata User data provided during the set_volume operation, expected to be of type `pulseaudio_manager`. + * + * @note On failure, an error message is printed to stderr with the reason for the failure. + * @note After the operations are processed, the function signals the main loop to continue. + */ +static void set_volume_cb2(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + pulseaudio_manager *self = (pulseaudio_manager *)userdata; + + if (eol > 0) { + //printf("[DEBUG, volume_check_cb()]: End-of-list reached.\n"); + self->operations_pending--; + return; + } + + if (!i) { + fprintf(stderr, "[ERROR, volume_check_cb()]: Null pointer for pa_sink_info.\n"); + self->operations_pending--; + return; + } + + if (!i->name) { + fprintf(stderr, "[ERROR, volume_check_cb()]: Null pointer for device name.\n"); + self->operations_pending--; + return; + } + + printf("[DEBUG, volume_check_cb()]: Processing device info for device: %s\n", i->name); + + // Update the volume values in the manager's devices structure + self->active_device->volume = i->volume; + + // Print the volume for each channel + for (int channel = 0; channel < i->volume.channels; channel++) { + //float volume_percentage = (float)i->volume.values[channel] / PA_VOLUME_NORM * 100.0; + //printf("Channel %d Volume: %.2f%%\n", channel, volume_percentage); + } + + //Signaling to continue. + pa_threaded_mainloop_signal(self->mainloop, 0); +} + + +/** + * @brief Set the volume for a specified device. + * + * This function allows setting the volume for a specific device based on the given percentage. + * The function performs various checks to ensure valid inputs and that the PulseAudio system is ready. + * It will adjust the volume for all channels of the device to the desired level. + * + * @param self Pointer to the pulseaudio_manager instance. + * @param device_index Index of the device to set the volume for. + * @param percentage Desired volume level as a percentage. + * @return Boolean indicating success or failure. + */ +bool set_volume(pulseaudio_manager *self, uint32_t device_index, float percentage) { + if (!self || percentage < 0.0f || percentage > 100.0f || device_index >= self->device_count) { + return false; + } + + // Convert percentage to volume + pa_volume_t volume = (percentage / 100.0) * PA_VOLUME_NORM; + if (volume >= PA_VOLUME_NORM) { + volume = PA_VOLUME_NORM - 1; + } + + // Debug: show index and desired volume. + //printf("[DEBUG, set_volume()] Index is: %i\n", device_index); + //printf("[DEBUG, set_volume()] Desired volume: %f%% (value: %u)\n", percentage, volume); + + // Ensure PulseAudio is ready and devices are loaded + if (self->pa_ready != 1 || self->devices_loaded != 1) { + return false; + } + + // Debug: Show channel volumes before the change. + /*for (int channel = 0; channel < self->devices[device_index].channel_map.channels; channel++) { + printf("[DEBUG, set_volume()]: Channel %d Before volume: %f%%\n", + channel, + 100.0 * self->devices[device_index].volume.values[channel] / PA_VOLUME_NORM); + }*/ + + // Create a pa_cvolume structure and set the volume for all channels + pa_cvolume cvolume; + pa_cvolume_init(&cvolume); + cvolume.channels = self->devices[device_index].channel_map.channels; // Manually set channels + pa_cvolume_set(&cvolume, cvolume.channels, volume); + + printf("[DEBUG, set_volume()] channels: %d\n", cvolume.channels); + + // Apply the volume change to the specific device by index and wait for the operation to complete + const char *device_name_to_change = self->devices[device_index].code; + self->operations_pending++; + pa_operation *op = pa_context_set_sink_volume_by_name(self->context, device_name_to_change, &cvolume, set_volume_cb1, self); + iterate(self, op); + + // Fetch the updated volume for the device and wait for the operation to complete + pa_operation *op2 = pa_context_get_sink_info_by_name(self->context, device_name_to_change, set_volume_cb2, self); + iterate(self, op2); + + return true; +} + + +/** + * @brief Iterates through operations in the pulseaudio_manager. + * + * @param manager Pointer to the pulseaudio_manager instance. + * @param op Pointer to the pa_operation instance. + */ +void iterate(pulseaudio_manager *manager, pa_operation *op) { + //Leaves if operation is invalid. + if (!op) return; + + bool is_in_mainloop_thread = pa_threaded_mainloop_in_thread(manager->mainloop); + + // If we're not in the mainloop thread, lock it. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_lock(manager->mainloop); + } + + //Wait for the operation to complete. + //The signaling to continue is performed inside the callback operation (op). + pa_threaded_mainloop_wait(manager->mainloop); + + //Cleaning up. + pa_operation_unref(op); + + // If we locked the mainloop earlier, unlock it now. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_unlock(manager->mainloop); + } +} + +/** + * @brief Create a new pulseaudio_manager instance. + * @return Returns a pointer to a manager structure. + */ +pulseaudio_manager *new_manager(void) { + pulseaudio_manager *manager = (pulseaudio_manager *)malloc(sizeof(pulseaudio_manager)); + if (!manager) return NULL; + + + // Initialize pointers to 0 -- good practice. + manager->device_count = 0; + manager->devices_loaded = 0; // Initialize to 0 + manager->load_devices = load_devices; + manager->destroy = destroy; + manager->switch_device = switch_device; + manager->set_volume = set_volume; + manager->get_active_device = get_active_device; + manager->iterate = iterate; + manager->get_active_profile_channels = get_active_profile_channels; + //manager->get_profiles_for_device = get_profiles_for_device; + manager->get_profile_channels = get_profile_channels; + manager->get_profile_count = get_profile_count; + + if(!initialize(manager)) { + free(manager->devices); + free(manager); + return NULL; + } + + manager->device_count = get_output_device_count(); + manager->devices = malloc(manager->device_count * sizeof(pulseaudio_manager)); + + if(!manager->devices) { + fprintf(stderr, "[new_manager()] Could not allocate memory for the manager devices.\n"); + return NULL; + } + +#if 0 + if (!load_devices(manager)) { + fprintf(stderr, "No audio devices were detected. Aborting.\n"); + destroy(manager); + return NULL; + } +#endif + + return manager; +} + +/** + * @brief Callback function to process the PulseAudio server information. + * + * This callback is invoked once the server information is available. It retrieves the default device name + * from the server response and determines the active device by matching the name with the available devices + * in the manager's list. + * + * @param c Pointer to the PulseAudio context. + * @param info Pointer to the pa_server_info structure containing the server's information. + * @param userdata User-provided data (expected to be a pointer to pulseaudio_manager). + */ +static void get_active_device_cb(pa_context *c, const pa_server_info *info, void *userdata) { + (void) c; + pulseaudio_manager *manager = (pulseaudio_manager *)userdata; + + if (!info || !info->default_sink_name) { + fprintf(stderr, "[ERROR]: Null pointer in active_device_cb.\n"); + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + + // Get the default device name from the server information + const char *default_device_name = info->default_sink_name; + + // Iterate over the available devices to find the active one + for (uint32_t i = 0; i < manager->device_count; i++) { + if (strcmp(manager->devices[i].code, default_device_name) == 0) { + // Set the active device pointer when a match is found + manager->active_device = &manager->devices[i]; + break; + } + } + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + + +/** + * @brief Request the default device name from the PulseAudio server and determine the active device. + * + * This function initiates a request to retrieve the default device name (active device) from the PulseAudio server. + * Once the server provides this information, the active_device_cb callback is triggered to process the response. + * + * @param manager Pointer to the pulseaudio_manager instance. + */ +//TODO: REWORK THE WAITING LOGIC. +void get_active_device(pulseaudio_manager *manager) { + pa_threaded_mainloop_lock(manager->mainloop); + + // Request server information + pa_context_get_server_info(manager->context, get_active_device_cb, manager); + + // Wait until the iterate function signals that it's done + pa_threaded_mainloop_wait(manager->mainloop); + + pa_threaded_mainloop_unlock(manager->mainloop); + + // The original loop to wait for active_device_name to be set + int timeout = 50; // Number of iterations or timeout value + while (!manager->active_device->code && timeout-- > 0) { + manager->iterate(manager, NULL); + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + + +/** + * @brief Frees the memory of a pulseaudio_manager instance. + * + * @param manager Pointer to the pulseaudio_manager instance to be deleted. + */ +void destroy(pulseaudio_manager *self) { + cleanup(self); + + if (self) { + for (uint32_t i = 0; i < self->device_count; i++) { + if (self->devices[i].code) { + free(self->devices[i].code); + self->devices[i].code = NULL; + } + if (self->devices[i].description) { + free(self->devices[i].description); + self->devices[i].description = NULL; + } + } + // Now, free profiles for each device (if they exist) + for (uint32_t i = 0; i < self->device_count; i++) { + if (self->devices[i].profiles) free(self->devices[i].profiles); + } + if (self->devices) free(self->devices); + free(self); + } +} diff --git a/v-0.07/easypulse_core.h b/v-0.07/easypulse_core.h new file mode 100644 index 0000000..9129942 --- /dev/null +++ b/v-0.07/easypulse_core.h @@ -0,0 +1,90 @@ +/** + * @file core.h + * @brief EasyPulse Library Header. + * + * EasyPulse is a library designed to provide pseudo-object oriented programming + * functions to simplify access to PulseAudio. + */ + +#ifndef EASPYPULSE_CORE_H +#define EASPYPULSE_CORE_H +#define DEBUG_MODE 0 // Debug mode flag + +#include +#include "system_query.h" +#include +#include +#include + +typedef struct { + char *name; // Name of the profile + char *description; // Description of the profile + uint32_t channels; // Number of channels this profile has +} pulseaudio_profile; + + +// Forward declarations +typedef struct pulseaudio_manager pulseaudio_manager; +typedef struct pulseaudio_device pulseaudio_device; + +/** + * @brief Represents a PulseAudio devices. + */ +struct pulseaudio_device { + uint32_t index; // Index of the device. + char *code; // Name of the device. + char *description; // Description of the device. + pa_cvolume volume; // Volume of the device. + /* pulseaudio_profile *active_profile; // Active alsa profile of this device. */ + pa_channel_map channel_map; // Channel map of the devices. + int mute; // Mute status of the devices (1 for muted, 0 for unmuted). + int min_play_channels; // The minimum number of playback channels of the device. + int max_play_channels; // The maximum number of playback channels of the device. + pulseaudio_profile *profiles; // Array of available profiles for the device + uint32_t profile_count; // Number of available profiles +}; + +/** + * @brief Represents the main manager for PulseAudio operations. + */ +struct pulseaudio_manager { + pa_threaded_mainloop *mainloop; // Mainloop for PulseAudio operations. + pa_context *context; // PulseAudio context. + pulseaudio_device *devices; // Array of available devices. + uint32_t device_count; // Count of available devices. + int pa_ready; // Indicates if PulseAudio is ready (1 for ready, 2 for error). + int devices_loaded; // Indicates if devices are loaded (0 for not loaded, 1 for loaded successfully, 2 for error). + int operations_pending; // Counter for pending operations. + pulseaudio_device *active_device; // Pointer to active device. + uint32_t current_device_index; // The devices being processed right now by the program. It's not necessarily the same as the playback device. + + bool (*initialize)(pulseaudio_manager *self); // Initializes the manager. + void (*destroy)(pulseaudio_manager *manager); // Destroys the manager. + bool (*load_devices)(pulseaudio_manager *self); // Loads available devices. + bool (*switch_device)(pulseaudio_manager *self, uint32_t devices_index); // Switches to a specified device. + bool (*set_volume)(pulseaudio_manager *self, uint32_t devices_index, float percentage); // Sets the volume to a specified percentage. + void (*get_active_device)(pulseaudio_manager *manager); // Assures that a pulseaudio operation is not pending. + void (*iterate)(pulseaudio_manager *manager, pa_operation *op); // Goes through every step of a threaded loop. + int (*get_active_profile_channels) (const pulseaudio_device *device, int device_index); // Gets the number of channels of an active profile. + //void (*get_profiles_for_device)(pulseaudio_manager *manager, const char* device_code); // Updates the profiles of a particular device. + void (*get_profile_channels)(pulseaudio_manager *manager); // Extracts profile channels by copying them to null sink. + uint32_t (*get_profile_count)(uint32_t card_index); // Gets the number of pulseaudio profiles in the system. +}; + +/** + * @brief Create a new pulseaudio_manager instance. + * @return A pointer to the newly created pulseaudio_manager instance. + */ +pulseaudio_manager* new_manager(void); + +bool load_devices(pulseaudio_manager *self); +int get_active_profile_channels(const pulseaudio_device *devices, int device_index); +bool set_volume(pulseaudio_manager *self, uint32_t devices_index, float percentage); +void iterate(pulseaudio_manager *manager, pa_operation *op); +int get_device_channels(const pulseaudio_device *devices, int devices_index); +void destroy(pulseaudio_manager *manager); +//void get_profiles_for_device(pulseaudio_manager *manager, const char* device_code); +void get_active_device(pulseaudio_manager *manager); +void get_profile_channels(pulseaudio_manager *manager); + +#endif // CORE_H diff --git a/v-0.07/examples/Makefile b/v-0.07/examples/Makefile new file mode 100644 index 0000000..6f11288 --- /dev/null +++ b/v-0.07/examples/Makefile @@ -0,0 +1,19 @@ +CC = gcc +CFLAGS = -Wall -Wextra -g -O0 + +LIB_DIR = ../ +LIB_SRC = $(LIB_DIR)*.c + +EXAMPLES_DIR = . +EXAMPLES_SRC = $(wildcard $(EXAMPLES_DIR)/*.c) +EXAMPLES_OUT = $(patsubst $(EXAMPLES_DIR)/%.c,$(EXAMPLES_DIR)/%,$(EXAMPLES_SRC)) + +all: $(EXAMPLES_OUT) + +$(EXAMPLES_DIR)/%: $(EXAMPLES_DIR)/%.c + $(CC) $(CFLAGS) $< $(LIB_SRC) -o $@ -lpulse -lasound + +clean: + rm -f $(EXAMPLES_DIR)/*~ $(EXAMPLES_OUT) + +.PHONY: all clean diff --git a/v-0.07/examples/alsa-mapper_pulseaudio-api b/v-0.07/examples/alsa-mapper_pulseaudio-api new file mode 100755 index 0000000000000000000000000000000000000000..a06e2343744d31a57181f647ca522330ce3b8b34 GIT binary patch literal 91520 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 KXrMyi()zzv%dZUp literal 0 HcmV?d00001 diff --git a/v-0.07/examples/alsa-mapper_pulseaudio-api.c b/v-0.07/examples/alsa-mapper_pulseaudio-api.c new file mode 100644 index 0000000..47eb39b --- /dev/null +++ b/v-0.07/examples/alsa-mapper_pulseaudio-api.c @@ -0,0 +1,91 @@ +/** + * @file pulseaudio_alsa_mapper.c + * @brief Demonstrates how to map PulseAudio sinks to their corresponding ALSA device names. + */ + +#include +#include +#include +#include + +static const char* get_alsa_friendly_name(int card_num) { + snd_ctl_t *ctl; + char name[128]; + snprintf(name, sizeof(name), "hw:%d", card_num); + + if (snd_ctl_open(&ctl, name, 0) < 0) { + return NULL; + } + + snd_ctl_card_info_t *info; + snd_ctl_card_info_alloca(&info); + if (snd_ctl_card_info(ctl, info) < 0) { + snd_ctl_close(ctl); + return NULL; + } + + const char *friendly_name = strdup(snd_ctl_card_info_get_name(info)); + snd_ctl_close(ctl); + return friendly_name; +} + +static void sink_info_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) userdata; + + if (eol > 0) { + pa_context_disconnect(c); + return; + } + + const char *udev_description = pa_proplist_gets(info->proplist, "device.description"); + const char *card_str = pa_proplist_gets(info->proplist, "alsa.card"); + const char *device_str = pa_proplist_gets(info->proplist, "alsa.device"); + + int card_num = card_str ? atoi(card_str) : -1; + const char *friendly_name = card_num != -1 ? get_alsa_friendly_name(card_num) : NULL; + + if (udev_description && card_str && device_str) { + printf("Sink: %s, UDEV description: %s, ALSA name: hw:%s,%s", info->name, udev_description, card_str, device_str); + if (friendly_name) { + printf(", Friendly ALSA name: %s", friendly_name); + free((void*)friendly_name); + } + printf("\n"); + } else if (udev_description) { + printf("Sink: %s, UDEV description: %s, Incomplete ALSA name information.\n", info->name, udev_description); + } +} + +static void context_state_cb(pa_context *c, void *userdata) { + switch (pa_context_get_state(c)) { + case PA_CONTEXT_READY: + pa_context_get_sink_info_list(c, sink_info_cb, NULL); + break; + case PA_CONTEXT_FAILED: + case PA_CONTEXT_TERMINATED: + pa_mainloop_quit((pa_mainloop*)userdata, 0); + break; + default: + break; + } +} + +int main(void) { + pa_mainloop *mainloop; + pa_mainloop_api *mainloop_api; + pa_context *context; + + mainloop = pa_mainloop_new(); + mainloop_api = pa_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "udev_description_fetcher"); + + pa_context_set_state_callback(context, context_state_cb, mainloop); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + + pa_mainloop_run(mainloop, NULL); + + pa_context_unref(context); + pa_mainloop_free(mainloop); + + return 0; +} diff --git a/v-0.07/examples/change-speaker-mode b/v-0.07/examples/change-speaker-mode new file mode 100755 index 0000000000000000000000000000000000000000..9a3bbc19d1a12792c5d667505049d94f6c259453 GIT binary patch literal 87808 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 z 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 + +int main(void) { + // Initialize the pulseaudio_manager + pulseaudio_manager *manager = new_manager(); + //pulseaudio_manager *self = manager; + + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudio manager.\n"); + return 1; + } + + #if 0 + // Detect the current mode of the active device + const char* current_mode = manager->get_device_mode_by_code(manager, manager->active_device->code); + printf("Current mode of the active device (%s): %s\n", manager->active_device->code, current_mode); + + // List available modes based on the number of channels of the active device + printf("\nAvailable modes:\n"); + printf("1. mono\n"); + printf("2. stereo\n"); + + int max_choice = 2; // To keep track of the maximum mode choice number + uint32_t channels = manager->active_device->number_of_channels; + + if (channels >= 4) { + printf("3. 4.0\n"); + max_choice = 3; + } + if (channels >= 5) { + printf("4. 5.0\n"); + max_choice = 4; + } + if (channels >= 6) { + printf("5. 5.1\n"); + max_choice = 5; + } + if (channels >= 8) { + printf("6. 7.1\n"); + max_choice = 6; + } + + // Prompt the user to select a mode + printf("\nEnter the number corresponding to the desired mode: "); + int choice; + scanf("%d", &choice); + + if (choice < 1 || choice > max_choice) { + printf("Invalid choice.\n"); + manager->destroy(self); + return 1; + } + + const char* mode_choices[] = {"mono", "stereo", "4.0", "5.0", "5.1", "7.1"}; + const char* mode_to_set = mode_choices[choice - 1]; + + // Set the mode of the active device + if (manager->set_device_mode_by_code(manager, manager->active_device->code, mode_to_set)) { + printf("Mode set to %s successfully!\n", mode_to_set); + } else { + fprintf(stderr, "Failed to set the mode.\n"); + } + + // Cleanup + manager->destroy(self); + return 0; + #endif +} diff --git a/v-0.07/examples/error.txt b/v-0.07/examples/error.txt new file mode 100644 index 0000000..edb3387 --- /dev/null +++ b/v-0.07/examples/error.txt @@ -0,0 +1,103 @@ +Operation state at cycle 0: 0 +Operation state at cycle 1: 0 +Operation state at cycle 2: 0 +Operation state at cycle 3: 0 +Operation state at cycle 4: 0 +Operation state at cycle 5: 0 +Operation state at cycle 6: 0 +Operation state at cycle 7: 0 +Operation state at cycle 8: 0 +Operation state at cycle 9: 0 +Operation state at cycle 10: 0 +Operation state at cycle 11: 0 +Operation state at cycle 12: 0 +Operation state at cycle 13: 0 +Operation state at cycle 14: 0 +Operation state at cycle 15: 0 +Operation state at cycle 16: 0 +Operation state at cycle 17: 0 +Operation state at cycle 18: 0 +Operation state at cycle 19: 0 +Operation state at cycle 20: 0 +Operation state at cycle 21: 1 +Operation state at cycle 0: 0 +Operation state at cycle 1: 0 +Operation state at cycle 2: 0 +Operation state at cycle 3: 0 +Operation state at cycle 4: 0 +Operation state at cycle 5: 0 +Operation state at cycle 6: 0 +Operation state at cycle 7: 0 +Operation state at cycle 8: 0 +Operation state at cycle 9: 0 +Operation state at cycle 10: 0 +Operation state at cycle 11: 0 +Operation state at cycle 12: 0 +Operation state at cycle 13: 0 +Operation state at cycle 14: 0 +Operation state at cycle 15: 0 +Operation state at cycle 16: 0 +Operation state at cycle 17: 0 +Operation state at cycle 18: 0 +Operation state at cycle 19: 0 +Operation state at cycle 20: 0 +Operation state at cycle 21: 0 +Operation state at cycle 22: 0 +Operation state at cycle 23: 0 +Operation state at cycle 24: 0 +Operation state at cycle 25: 0 +Operation state at cycle 26: 0 +Operation state at cycle 27: 0 +Operation state at cycle 28: 0 +Operation state at cycle 29: 0 +Operation state at cycle 30: 0 +Operation state at cycle 31: 0 +Operation state at cycle 32: 0 +Operation state at cycle 33: 0 +Operation state at cycle 34: 0 +Operation state at cycle 35: 0 +Operation state at cycle 36: 0 +Operation state at cycle 37: 0 +Operation state at cycle 38: 0 +Operation state at cycle 39: 0 +Operation state at cycle 40: 0 +Operation state at cycle 41: 0 +Operation state at cycle 42: 0 +Operation state at cycle 43: 0 +Operation state at cycle 44: 0 +Operation state at cycle 45: 0 +Operation state at cycle 46: 0 +Operation state at cycle 47: 0 +Operation state at cycle 48: 0 +Operation state at cycle 49: 0 +Operation state at cycle 50: 0 +Operation state at cycle 51: 0 +Operation state at cycle 52: 0 +Operation state at cycle 53: 0 +Operation state at cycle 54: 0 +Operation state at cycle 55: 0 +Operation state at cycle 56: 0 +Operation state at cycle 57: 0 +Operation state at cycle 58: 0 +Operation state at cycle 59: 0 +Operation state at cycle 60: 0 +Operation state at cycle 61: 1 +Operation state at cycle 0: 0 +Operation state at cycle 1: 0 +Operation state at cycle 2: 0 +Operation state at cycle 3: 0 +Operation state at cycle 4: 0 +Operation state at cycle 5: 0 +Operation state at cycle 6: 0 +Operation state at cycle 7: 0 +Operation state at cycle 8: 0 +Operation state at cycle 9: 0 +Operation state at cycle 10: 0 +Operation state at cycle 11: 0 +Operation state at cycle 12: 0 +Operation state at cycle 13: 0 +Operation state at cycle 14: 0 +Operation state at cycle 15: 0 +Operation state at cycle 16: 0 +Operation state at cycle 17: 0 +Assertion '!m->thread || !pa_thread_is_running(m->thread) || !in_worker(m) || pa_atomic_load(&m->in_once_unlocked)' failed at ../pulseaudio/src/pulse/thread-mainloop.c:179, function pa_threaded_mainloop_lock(). Aborting. diff --git a/v-0.07/examples/get-card-profiles-pulseaudio_api b/v-0.07/examples/get-card-profiles-pulseaudio_api new file mode 100755 index 0000000000000000000000000000000000000000..ee4bee267e46661c707ad52134bbe863f6cde11a GIT binary patch literal 89024 zcmeFad3;pW`9FS_napIL>@^lB2t&&7OdJLb)o&(e$XOLgj!rn-SU0EpL6b=JD5@H=ll76e}6cwr>M0}hws6fL;Nx4E+dMHa2+Hgvzb(WM%^qF0#C{AgF6ihikt6^U73Cq)dDsuikcS`Q_}}@^>}mK<9>$GSd`3UwD)9f(6}MhF{=If*8j&OJ(;FSg zj>9P6A{0I02cYqu@b|%hp78zz`0WYsA0@zVNYL&-fbZ9X{r`Ytda|cIf&Q%+h@SWd zB=FC{1pMU*@Us%&uS}qSOoIOQOQ7fe1ml&Gzz=qUc7L6Ke@X&-UP<83ixTL!6X+S4 zK+iD=^jw+%e|Z8w>`vgfixSw=oPhs~1pJ>Sz(*6AC+P3=1ol)Uz~7$0&X*Fjdr|`bT$+G?dV;v(x*Ep+BR{nX_!lSWZ$*N3 zPe{<;2NLLcD?z(U6Zi-0J=#As0sarb_q4vXC9uCbf&IA&>-%lRgKNFW*M_iIcNH;>YB!y`L#{WHI3&?pSrNVuI8Mo zISXqPtw%~j)vUSobpuG}}~Lcj>If^$S}T)yx7&AK*jV4#b7L*=v2t%i zV|@edorNwmiEgb6x(T}US`2elbArK=u<%+&hcwl6|dadBF^cW59pec=uS`s;RUSrJ{`=Qj*lsM&IoIgiIC|j+rnOD`aP=yQ~^hKe| ztJDC*CS78Wx*hDnp9sCWdZVeXdRD{SMV!KQ0=PlxQ06YIZ>n+m7F<57p{lWJQ4>6V zMNR#@9tbo?!qCwWlOaj33{6-@mh>Q9RkySUY`kD?9oD+JOR8qgtHpeT9mXQWUj1BP zamJXdS3oXP2D&qMQG+qB0c%e4JY!MKB2F4eH!p3#WaJWNV5FMJSl!ZKV2Kk=O?6tL zsToUXBL(L+EH&m`-iS#CdCaD{m!dD1&YD+MyU<|lLlatWXj#})!$VCOp(;$Ux@vXC zp=qp*H71{S_T*V*!^gXo;bo0;M;nzhPCL6|R+(|~X{St?I&0+c(Qa*&TN~j)#;PNS zkKw(*!r3SG&*#Dp-on{R(UVZJ9uPQaBunXs1pnLmzawYkd}ImE(QbmrCwxjH&Ss*4 z5+*qLVYvbKD((w-u3LKa<+#)Nje9gMH)Si1pFZQafcc@0R!s{7Zus7h0ole5m+m(< zYdZOJYirXDSpKZW

92)&Q{vh&4d00eT8= z5q>zK{ds<4UBth@Fjh$X&+$gAq&V$^YJP-SIKS-G5o&mg7G9(kFHq&PMAxB*30k_9 zDxXNy(b6`#+UHvE)2Z@C+G3Y=(2^Hvv65<4fuNU~A-d^ls!z00ofdD^MM}&;8B}wf z=;_33RQ86_P~vqe>$xuA^HdIlXr-FJrxkgkKB`0;K~`}N0;g8HtcB>s8*ksZ@itYw z!63)3ZlUFg^OSg)R{b8;U(y8gv``o+8;Y*2qq?)K(k-oY>m04ULJK=+S)SHHy-m#B z9JTMGjyc+lJIDCWX587N?zG@yAEnj&?U*vRJeApns~CKBBb~L&M)B#(R-%QP4^s6@ zMA0>MRAE;F0QT;%7q(CX#87dO8e#8GQrQ@qtX)D8nEe2Yt^qa(6JI+^Hi-y33aV{nnlg}VSzP1MV0@V6;^vEt(c>mA&`n=R5?V8`R=Kw>FgZ655RTs ziNve4>?KM>*DR)*0+pSoibOMQWW>+24l7<{LG;?IT4+h)E}|jYWlwcHPw{KqBz}yl z;?cG`DtnX?V77-=UZ+)d`4zeOLrTP%U|E4G`C2hbl@R20L=B>|R0qLAuPv>#bB}h@4DA6n+rDr`Y4sR2GWIL91DEI>w4T4Y%1zi+muT$^ z7{!mMvOtTNZp|ny>Y;UT1SqgQ(HmV`?{QmZpLw1t?NuExgvv%5w964q64$Yh53~^J zm=bB-EHx)yp~w?-lx?;lv6XGMY>ZpQpJz_4P(>Vu^9oxEJtY=$7pB{2I?F1q9H%Cr zgEsGS1)>1ucWK>;kQ8hHqDJdPhMMN6D*7t^yBEIi2OYbG*s3vNiMOv4-L0*$dNgs3 zITx$ALhG2RSLh`7fpGWo^$OKoqzz9~YvL*`dY%%`Pz{2_?-Rl+H%C}q#TPUiBC;#4 zusYXYrQ4y~C3#v8!*w$_b|q{0HddRY4%gEp9>Mh&!Fmxa^0cCr*3HpI_)_IDs$i_w zsHK+;dIQD+|AN7boo)`M3Fw)bO=2t@ggmKhW(`;!Fmo6ql0RW(efegwES0FvB^f(Tq5YU zD&0vC%~Kz~Mb8jxGMcBuL$oeW6`!KTW2BOHgI&`?H(gXJJHsK`muJ>IrDE|l7cSuz zDc~vPZ*VcwL*E&C8g7$#7;b-E7Z9(g0%C{`Ul8KYP~AASGLuLbW7lc%5S7hRt$pqq zRU%>7WsRzUqbAPIOAsc&_no?HCDQC0v>K7&SktQHg{}DtYz^$p(L#i)IqJZ@Iel;Y6>3-a;>W2HcJ>jJV7S&@q~#A& z^TS*kNU{EWftEhy*XzQk-^JipvqmfP)O3*+KSK*y3Tx`A0rf(G+BvKxUZAQ^bC9eZ zLM=JUQ-qs_5U8Nm4yt`f!H&7GV^sH$6zyDmAP`+u!5nrLPR1v_d0S!RU=90 zWE#&g4Oq!iMWYcRP|;Y7@Xav9G7UpaR5Uo63JsZp=wK%_INI6oXBst)G{(8UI`KZv z1Z5evnXUQ?OB9K2g5x1W|AIEN^ny>^_oE0yK@7ohO<9pR^Fyk=L5Xv!CTDX|B}m27 zw2VcOr%iyot=$JxBvpjGLYv~qnDjQciJ##CMz?VlV?R$dag_dI$S_XRK916F(+gDd zT9G?n<2&>kRlK0Mf>FOKuHGri)z^vMDb5uNF}_iRt1lP1qqzFAmeqUSm8_8PeX`mx z{%!;`P8))90pLYX96rJqN-OE#i?B}*X}g|FDTJ{_EHy-TjwE;0g6{%;4HWpL{M!{P^`Efh#*}-0F3=C0w;j(W=^<4!cSb3S^%7AzNDJFMy-#~s;g)Trz|Lx&(n$mRpfb!QWjmi82<_I z3>*;C)7=QkwCW{Vh+xX2!RYzYVXCR(d{u)l)c=aD6xfPxsHMcWsqCYPeb>2oOMFA> zVHCPDHAJ1uSQCxZ`YW{Rb!r3Wt6v9)zpCb=uM4^8>)Z&n=o+~uen@4#)D+!buaI2x z#&F!e5M3Lg)f@$n+xb@zx)4mt>=7B(sz%JAD)Dh4CX0;99aPC2a}(mlk6b-1JkMfB ztbLhd?XbPb9pA^i@o_na@#%VABtL(AkNzv;J6>vh=hgVid3*&PUoDR>CF8rPk#^cu zJU&!3?{0i6gX6oP$M+JCZwxc7#5k3W>+s9h>ULUlk!mGt@80@6EySEMKySoP`+Hm_&V;QqbLqW>E<8uiiS*AuF|>!-HLUPD^&LiEidr!Wl0T_KDiJ+d6m<#nr35m-GrqQpoFp(Vg8^HEbpPFJf?_%_0TrJ zqFYQcFOw)>cBr|HHpmREW|rtlTE=SwFwrWR6}_jG&gAJXV8Hyh4COADbM_xA$2n%^ zR27&4_0U}sHJ;_ghpi}@uuO;=^gKnb)1+O;@#F(KY%Coe4 zl&A7-J=8HuwOA1vqYk{IhQ)0E9Ga}ZlU6=M8%Jr`kTXLNkqLq0~{OA=r%>7NtbsG2P^u7KobX?tA)<-uaZp=D3OKG)RK*%v7_N^4Q0qgF(@#rUt%vVtB?N1j&CvY(7|s5G^T z-&uH>MOfL0c=T_qRS+UByor6a^`}(?iofG}1x(B-Z`<%|fGuyUW zrS7!xom1U?JVW$UmBO;WG?N@ zPE8ah(~P6L-|4!et8c*R?mIC!U?pdhnTh0ZW+Icn;Ec^o6{fApsca@cHRI%_3Nxv+ zAWlwBPo$mPbUGz$bRIv^+vS{U+i{?)D8mE&C!E74`$6O&D0Q7=9QpB?baEs;;!Gwp z*@-EfMJhJb#Tj)7iY0 z&rGJB(V2AG%3qk4L5tu{4W2sD)pw}t5ci*&PR}IsnW?NbJ(bIkPR-nF6>{mBkz_vU z8{*;K{?37I?Y$ywmy1FwmCogqkR7Lx$>w)~DaAo9op(mkx%|x31;N7_>+ZXwv$y+@ zb84V-Krjh|idWI#L?)L9I_7Jhn4sgaY;r=xFrLh2(-RIj&M@mB%0{8J(Y_tp$ZAbP zRO#uQl^UPQr7^^$lbKS&QP$#S~QcXq?rV2P=z0>lq$ z(=$`kJSZQ3gS%u1T9c*7ob2j6X^h5itbK#My^O4@?_mF-?!F^V=fQ1Gch|ukZM(Pa zWW+xGE5#IJmF-d}^mZK{kio!4yUq+agFp*!JU9U3C}dgU>5<0NcyfkOyQbn4vNP$? zqC)U2UQol-Cnlx>&a$l?>Jh~kGm%qW1J2?8lgB#;P8G$kyy;~3k)s35(tIm9m&}N? zF%B6~U;p9W&LgLaH_qkZep%SjOg>kX+^OzEU5*iwEA!(gx{kCvot*~*k~eOVoyuoM zFL=V&jKKYmclW{Y56S3fValu;m(9+>f&Nn`I#2ic!2llZKiPdJG|gafUo)a&iaj-W z;BLNV~o##&B}5 zuTLAtJhCiJP1GCusrK#A1`A(X9z1S<14&=!@h-&fTxupWE%`tRXj{9Ak%l}wtx7j3 zxb|=oHZn1l9cz>~WB_X#p@FlA1VR=`anC}uEScmb$Ily%_@c6lVz$F&Ls4_ZjgkTT z)>1uol)ACA)Qw%GZtQ05i8MIQIFe^rA1Whu4_NSvP$+b*QD;m>?ZUdkA>YfQCgUpS zet$uS!f=J<`At!twarYO%c7E)oEj;>R*Om8%_6Q+TpkY%obp_V2di^)xP%zV^M0NIaAq@T+mk8dz5pz@;;=EKP(bX-hMALTsclAHTS^K$P$o@!GjEUaE!kiI*`*sBB5)zOs=ZiDSBuA5l2?!Bkilt*pR*6ZT+q;#5 z_97jAx z@C!SAT?424Pxkoq&ps(JpGmQ!f?>#g$k)UzAd$%nI>@=n{BUP?uuNmN!KATfJy$W< zkDhjp4-RxW2M10DyPY_A+&5ZXg`<8#T|I&s%E(M+HZ8T8aUFi1qZ_JamVk0Psp|S8 zeS?h$+jcg#ZEI<7X=`lX+P-b;uB~m2&6D{;Hob2w4S&z1@HIJ;8sB$**N)~L+Z&t5 z8k_sKTDft=u140c;d!vH7lPqQ#7t&t2D2tr)XkvgXWe1267wWesvPTDc-P63{U^o1 z!`k(gcfpiCFB?b^;#CR$iIGoYoxPo>{W_C~z&TfDhfFaR zHM27ru(4ZQRjyh7q^jCWs;a%Ds@hAcs=cH_+Dj^=y`)0gMIkyq4zm3t9*kzj3Nu)9n83P0 zHgzEoiUJb?cH8OXxvZ%=eYJ&D?fF^MDpK9MX{fVr2=nIi&h$hQvmTYgbC^9&7O+Nv z`4#IEA?02KDv1a(JzyYKHqxnC2^I5ImBFlDR!XFQE;*Zq-;J=U`cHJ7?39%vQ~WZr za|l6chu3&OdSWU$Vn`o`immCwL@u2yjKF(G(zBUV+8W8spz7dt4@4}Lizn0h@u?Ay zo*+Y{O-*7D7#NlYoK#^3d}9qMi?SC)RC(mMwJ--5O!`MNSSE61;iEp8%qGVmiNH7x z_4jpI?(90}Ok<>2^RW;}8K2@9;b$a$UV@o6eq?AXi7`Mlnxyc4E;EvLWc>!pG`T=J ztFllM8wTx2_{*KkBK zcJ>|Y>SZTmC2Kk}4 ztqfmKQ^9~}A=imfOXdA`tVckU4uR@`E9xrh5ShZKE zr8a2Utxeg;pdM}-9HEC5tATl?qsa-LUZVzZ>s$qA$4*0Md9#j~8g2`Ig&s7^VyBa^ zvS0+vspV0&laQ_X5Ft2&4w^`4%w&xgRdg{Hru^ox=liVD_9xjaXTC&7zUkKAUV9Qup<~V|O;tXt9-W1m-f1|45z^E)o zic0Q{s5*lMYok+TwV*qrm82FCSxWx!!$Xku8;zeA8=O2A{o!0=tUL*1vMMuQz$zBP zGZ1{lFA(SvzourC>BBIR=9PHr6c@Y5C@KcZ034?#GQ2P0IMd0ITg7&@F+r?Y zF=rcfoD^?XIK!MQ*u|!uKrN!T}1ee&6S|Smr=PawD`iF zgtfdpw!T!7?j;mf3KOpVo#PoPl?2S8)pM#ChBqwuda9?^#tsE&{P1VXM{R&k+5Eho0 zt1L0VO7zGTSE{AjwnVk*N0pO%dStq~#V%i3a;w_y2-yIWVXe4e-Pyo-s6{-$zXxj~ zBcpJO3{_+rpVT3y`_%c7%ou`-8IUI}?kt>!8PP^+iWe2WgX+`;tqOVKN=joY3b0m? zL9;%$2~A6jb7Mx$v4Cygn5KjIhH&axe`r;Zhrn_RTA0#}Ut3=AlR>*0)&0B>%Ehem za<6b2vBX6n9@tn9J%+ zh~}6eVgdzG_%*JbL&B%=HXXHs;}8=w2B9*H#bMUS*&3P3>bl02gkM^mOMEfN6z?AQ zW~olZ55%goi=M#&jy&BgJ%;Qj((o*WKyWI zF-kyBs%DMUGEUqIe|2k_wtim=V{OkCN#OTY^jJexq=#e~7f zsJkv{81mXDv$FEx6D0(XU4LMiE@ZI>!GjZb(hO%tcx1ReJdwl-cwiWuACVplGua}X ziB|Md2*&_SW3wYz_=h*8kPs!RLcAt7^8{D|y%*5Lt`$RiijM_YWr!*ugl(+1^VEQA zk6!-an4zXYJdVONN=0vL4yF%oIH(17rc|B^EJ~}nY%^!OW^XRglCoOIrzX>_=UWeM z+0vR$<}S$1R$b7yrq9dLO3rF6jrmKHM(Jq%a&ss-bdaq;pOL)OVgL*e|992*;~vAq|Nr$N4bL#c zc;TUO@_HQa+&=uTai7!h@c-)N#~^b1@IMp2q2b|wb^K!u5C6aEYVgnFJsOhRIz6s* zJ38X^OX^~6)A0YJ;pU%(AJFhsyH!JZSOGqs2E3S@M*(NLCqi=OAI>p+TElBJ-8l_6 z{|dms`KS2Y{!*y@e*&E46Mpj7J;2BC@N>nk>h|G>mGPrxx%~(BD@Gnr7mI(^$MEo@ z+pcMN_(^oJsA?a6yx(dK4?m)EhlYorx7nxR;fIc5wFRP+B)4G%wU z`8f@5NUDb8x;G3tR$8)}{Tkhkl_xdK_5&T<}FZ@Rj#-DBoe5v*ACxY<5D#KH` zgCP0#&uCu@IftLaTw^PE_(_KAH9Y(f!2<%HPhg}3{FgMI@Ix%wu9%-KI~A@ujq>pl zc>X}+nd?*yKd;+AU!wh2b^Dw4sD_`^?f)L|8h!xi(;A>J-zkBo3IVW~JU0ux$_hUp z^9bbM2>joFDu};Rw+}yOn*USkB5)+n!9W*$mDfGGefZ(*=LN1C`7WOTe2wqB`S{;8 zo@e=CFL-r9?)>6^*;i~_Z2VEdFeX z_Fpdnf3pPK(((*HtA3G&f38^#m!I3iFaA$I#pKow_#)IBX1pLLuP(qjK8NGyNr5+5 zPln?5=@R(wF9Cl{;D`@HiXPV`{QCV8?fgIKbL^tR9<|%w+p<= z3P1IKP{ZGDQ{&{vLhX4VaLvG|{k7nAc}lz_jZ@r0kryI{WS3Wc?R z7sG$N1bnsx{BeO-&HLvgpDfY-%6?nJ!;gC}!}Dc1{y(GZu4!#o^#a#I z^j&T#0Y3wHqpzL$I93Aw!4i0WuLS(%67a8k4VtA~wVav??$q*P`+ShM-hm|teGbFhoOBmM zyqmJ;2t37Z@mV3<3LKemX@(Bjv~1-?Ei-O8RFWQP32o1ZzP9_9()4~3)AKKjxH6Hw z10eA2B(w*STDLd5bG$x?^(1vn$ZUPe>SKvDQuq!lYxhJ42o`u$_PpbkXJe9pEBdKBKuDa z_MYl;w)$7aMf!(ej@^w%KpyYQ=QJ% zmfbB|XHwgF|NeXuhY0XfJ?u2>KhoQM;Golv1IM?jAJ>6(6KhJHL2!rSYs)8bB$@?} zTa;?*9~M<3h2OexjCOh7w%solk*PXH;NLTJ3Gygi?=mJ9JU;~1T`vH- zoZDCJvbcnC6q>08L#NSw@jXiK;1~ZSN`A!Z?MDf=d7DV!#u&DYjrVkljx5~JJJRG1 zfD!mDO7?~VCu7{fZG*=_*f>|28pltd@grvU7MzipW~qC&EI%J}2|3Qd@q_qj(ILkv z9(efYl)l#fAH%qGc8WlX?Q|Pc^`eJ54dI!s7`s16m@cx7=(Q7(Dsxfi7Xp<6LJRN9 zx*Tz|L2yG94}jpce1ueN(~|RD5Y2pp7U@rC++joiI078N#7(q4`O>1;_rG?G#zm{o zmd(TKrVqV;2n7%0SJsMapYa4W>AT^R)qH=KFu)POeswX_hljtuNlsKNR4iEv_j(%o5U&PYB*G^;|TbP)$KCXO`hE_-#@^f%6GsE8eA5Bsxp6 zC~ygbN_7$i{U@TCJ#C2)w9A)|Yi3a=K6A2GP6@ef9cK(jC6sd^28w)3Nq4>t^6$r8 zR6epu1pJ#u_tvPKnGT4=*P5C1v=z+G!P9WuQimN=53^8mmerEGFo{E^xaMcnb=-Wy z261|3+G@#8<C6iGf6PYJ&rZ5c@q7sk+!&jSOlzH&@7 zpOeGGGwE6L4W|*(<};*cJ~9{<;(njWjN6VH|f^c9*|d<|0JMT5_8A@ZQb8oFX@gvMwXrFkCkhA zW$?~j4E^(1ALN(0))~SIEI9N>x$u7f&wTuUNN-TPSKZj4F?7t8_m%&}*MHd})xli9 zp!+lb%%|aBgRNi32bQV9_jTRhz3PUBzUgnq|698M0p0G?da=-4zk>ZHesTY$_zU-c z3NV(d!EZI<3%?rW-D3Opzry;zjGO-cjg6|cxqe^k)8H`s|K|GfP=B*;Vy>}6rl-1^ zeg^tXsK43YGFL3q1zutP|48>Y@;CdU=6Z{^CxgVu&wPI&)ZgrJg^@YN-F2 z`&B!0eKABZ^ws)HG{=&o*cSKvwBEP>G#eIP;r8acxqb_6@XThn|L1i7&%Mk3-$h@x z9iwJ*Zr}^LzcFmKe|{OdMvrd+#`fd(*XIkq@EEtoKNwOM_uce2*MGtte}8j6;oG`@ zA|!v)&s?ME?C)>(fxiC{MbhwT7%=_Z@94}h!@t>IvOcO>JZT#0Yh&nprKZ0%1ULP| z{>QxX%UqY}{tD{7uh8@_c_8^@`Wf*068%4^`~Ts4O-pqR_iroF|GnQ=?HfY=6YhU| ziT< +#include +#include +#include + +static pa_threaded_mainloop *mainloop; +static pa_context *context; +static int sink_count = 0; +static char **sink_names = NULL; + +void sink_list_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + (void) userdata; + if (eol > 0) { + int chosen; + printf("Enter the number of the sink to set as default: "); + scanf("%d", &chosen); + + if (chosen >= 0 && chosen < sink_count) { + pa_context_set_default_sink(c, sink_names[chosen], NULL, NULL); + } + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + sink_names = realloc(sink_names, sizeof(char*) * (sink_count + 1)); + sink_names[sink_count] = strdup(info->name); + printf("%d: %s (%s)\n", sink_count++, info->name, info->description); +} + +void context_state_cb(pa_context *c, void *userdata) { + (void) userdata; + + if (pa_context_get_state(c) == PA_CONTEXT_READY) { + pa_operation_unref(pa_context_get_sink_info_list(c, sink_list_cb, NULL)); + } +} + +int main(void) { + mainloop = pa_threaded_mainloop_new(); + pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "sink_switcher_threaded"); + + pa_context_set_state_callback(context, context_state_cb, NULL); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + pa_threaded_mainloop_start(mainloop); + + pa_threaded_mainloop_lock(mainloop); + pa_threaded_mainloop_wait(mainloop); // Wait until sink_list_cb signals completion + + for (int i = 0; i < sink_count; i++) { + free(sink_names[i]); + } + free(sink_names); + + pa_context_disconnect(context); + pa_context_unref(context); + pa_threaded_mainloop_unlock(mainloop); + pa_threaded_mainloop_stop(mainloop); + pa_threaded_mainloop_free(mainloop); + return 0; +} diff --git a/v-0.07/examples/switch-sink.c b/v-0.07/examples/switch-sink.c new file mode 100644 index 0000000..45a8739 --- /dev/null +++ b/v-0.07/examples/switch-sink.c @@ -0,0 +1,61 @@ +/** + * Demo Code: PulseAudio Sink Switcher + * + * This demonstration code showcases the functionality of switching audio sinks + * using the PulseAudio API. It initializes the PulseAudio manager, loads available + * audio sinks, prompts the user to select a sink, and then switches to the chosen sink. + * + * Note: Ensure the PulseAudio server is running and in a good state before executing. + */ +#include "../easypulse_core.h" +#include +#include + +int main() { + // Initialize the PulseAudio Manager + pulseaudio_manager *manager = new_manager(); + pulseaudio_manager *self = manager; + + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudioManager.\n"); + manager->destroy(self); + return 1; + } + + // Display available devices to the user + printf("Available Sinks:\n"); + for (uint32_t i = 0; i < manager->device_count; i++) { + printf("%d. %s - %s\n", i + 1, manager->devices[i].code, manager->devices[i].description); + } + + // Prompt the user to select a device + printf("Enter the number of the sink you want to switch to: "); + uint32_t choice; + scanf("%d", &choice); + + + // Validate the user's choice + if (choice < 1 || choice > manager->device_count) { + fprintf(stderr, "Invalid choice.\n"); + manager->destroy(self); + return 1; + } + + + // Switch to the selected device + if (manager->switch_device(manager, choice - 1)) { + printf("Successfully switched to the selected device.\n"); + + // Debug code to print the default device after the switch + fprintf(stderr, "[DEBUG]: Default device after switch: %s\n", manager->active_device->code); + } + else { + fprintf(stderr, "Failed to switch to the selected device.\n"); + return 1; + } + + // Cleanup + manager->destroy(self); + + return 0; +} diff --git a/v-0.07/examples/volume-change b/v-0.07/examples/volume-change new file mode 100755 index 0000000000000000000000000000000000000000..7ff9e515f9ba569af079dc511ccdb40a50480c2e GIT binary patch literal 87840 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 literal 0 HcmV?d00001 diff --git a/v-0.07/examples/volume-change-pulseaudio b/v-0.07/examples/volume-change-pulseaudio new file mode 100755 index 0000000000000000000000000000000000000000..adf5643e90dbb12de90c329adc09c924d3efe1bd GIT binary patch literal 90512 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 +#include +#include + +static pa_threaded_mainloop *mainloop; +static pa_context *context; + +/** + * @brief Callback function to set the volume of the default sink. + * + * This function fetches the current volume of the default sink, displays it, + * then prompts the user for a desired volume level, sets the volume, and finally + * displays the volume after the change. + * + * @param c The PulseAudio context. + * @param info Information about the current sink. + * @param eol End-of-list flag. + * @param userdata User data (unused). + */ +void set_volume_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + (void) userdata; + + if (eol > 0) { + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + // Prompt the user for the desired volume level first + int volume_percentage; + printf("Enter the desired volume (0-100): "); + scanf("%d", &volume_percentage); + + // Display the current volume percentage + int volume_percentage_before = (int)(100.0f * pa_cvolume_avg(&info->volume) / PA_VOLUME_NORM + 0.5); + printf("Volume before change: %d%%\n", volume_percentage_before); + + // Set the volume based on user input + pa_cvolume volume; + pa_cvolume_set(&volume, info->channel_map.channels, (volume_percentage * PA_VOLUME_NORM) / 100); + pa_context_set_sink_volume_by_index(c, info->index, &volume, NULL, NULL); + + // Display the volume after the change + int volume_percentage_after = (int)(100.0f * pa_cvolume_avg(&volume) / PA_VOLUME_NORM + 0.5); + printf("Volume after change: %d%%\n", volume_percentage_after); + + pa_threaded_mainloop_signal(mainloop, 0); +} + +/** + * @brief Callback function for context state changes. + * + * This function checks if the context is ready and then triggers the retrieval + * of the default sink's information. + * + * @param c The PulseAudio context. + * @param userdata User data (unused). + */ +void context_state_cb(pa_context *c, void *userdata) { + (void) c; + (void) userdata; + + if (pa_context_get_state(c) == PA_CONTEXT_READY) { + pa_operation_unref(pa_context_get_sink_info_by_name(c, "@DEFAULT_SINK@", set_volume_cb, NULL)); + } +} + +int main(void) { + // Initialize PulseAudio threaded mainloop and context + mainloop = pa_threaded_mainloop_new(); + pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "volume_changer_threaded"); + + // Set context state callback and connect the context + pa_context_set_state_callback(context, context_state_cb, NULL); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + + // Start the threaded mainloop + pa_threaded_mainloop_start(mainloop); + + // Lock the mainloop and wait for operations to complete + pa_threaded_mainloop_lock(mainloop); + pa_threaded_mainloop_wait(mainloop); + + // Cleanup and free resources + pa_context_disconnect(context); + pa_context_unref(context); + pa_threaded_mainloop_unlock(mainloop); + pa_threaded_mainloop_stop(mainloop); + pa_threaded_mainloop_free(mainloop); + return 0; +} diff --git a/v-0.07/examples/volume-change.c b/v-0.07/examples/volume-change.c new file mode 100644 index 0000000..6600e95 --- /dev/null +++ b/v-0.07/examples/volume-change.c @@ -0,0 +1,82 @@ +/** + * @file volume-change.c + * @brief PulseAudio Volume Control Application + * + * This application provides a simple interface to interact with PulseAudio. + * It displays the current active device, its name, and the master volume. + * The user can then input a new volume value, which the application attempts + * to set. The result of the operation (success or failure) is displayed to the user. + * + * The application leverages the EasyPulse library to communicate with PulseAudio. + * + * + * @date 10-08-2023 (creation date) + */ + +#include +#include +#include "../easypulse_core.h" + +int main() { + // Initialize the pulseaudio manager + pulseaudio_manager *manager = new_manager(); + pulseaudio_manager *self = manager; + pulseaudio_device *active_device = self->active_device; + + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudioManager.\n"); + manager->destroy(self); + return 1; + } + +#if 0 + // Display the channels of the active profile + uint32_t total_channels = manager->get_active_profile_channels(active_device, active_device->index); + + printf("[DEBUG] The active device is: %s\n", active_device->code); + printf("[DEBUG] The following profiles were found:\n"); + + for (uint32_t i = 0; i < active_device->profile_count; i++) { + if (active_device->profiles[i].name) { + printf("[DEBUG] Profile name: %s\n", active_device->profiles[i].name); + } else { + printf("[DEBUG] Profile name is NULL or invalid.\n"); + } + printf("[DEBUG] This profile has %d channels.\n", active_device->profiles[i].channels); + } + + + printf("Current device: %s\n", manager->active_device->code); + + // Debug: Print the volume of individual channels of the active device + for (uint32_t channel = 0; channel < total_channels; channel++) { + printf("Channel %d volume before change: %f%%\n", + channel, + (100.0 * manager->active_device->volume.values[channel] / PA_VOLUME_NORM)); + } + + printf("Master Volume: %f%%\n", + (100.0 * pa_cvolume_avg(&manager->active_device->volume) / PA_VOLUME_NORM)); + + + // Ask the user for a new volume value + float new_volume; + printf("Enter a new volume value (0.0 - 100.0): "); + scanf("%f", &new_volume); + + // Set the new volume + manager->set_volume(manager, manager->active_device->index, new_volume); + + + // Debug: Print the volume of individual channels of the active device + for (uint32_t channel = 0; channel < total_channels; channel++) { + printf("Channel %d volume after change: %f%%\n", + channel, + (100.0 * manager->active_device->volume.values[channel] / PA_VOLUME_NORM)); + } +#endif + // Cleanup and exit + manager->destroy(self); + return 0; + +} diff --git a/v-0.07/libeasypulse_core.a b/v-0.07/libeasypulse_core.a new file mode 100644 index 0000000000000000000000000000000000000000..3ad576961a0a2ffdde6ec812f4d71118f96a4f78 GIT binary patch literal 39642 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 +#include +#include +#include +#include +#include +#include +#include // Include this for the isdigit() function + +// Since pulseaudio uses callbacks, we need something that will allow us to share data +// between functions. +typedef struct { + pa_threaded_mainloop *mainloop; + pa_mainloop_api *mainloop_api; + pa_context *context; +} _shared_data_1; + +static _shared_data_1 shared_data_1; + +// Structure to share data between get_alsa_name and its callback. +typedef struct { + const char *alsa_name; + const char *alsa_id; +} _shared_data_2; + +static _shared_data_2 shared_data_2 = {.alsa_name = NULL}; + + +// Structure to share data between get_available_output_devices and its callback. +typedef struct { + pa_sink_info **sinks; // An array of pointers to pa_sink_info + uint32_t count; +} _shared_data_3; + +static _shared_data_3 shared_data_3; + +// Structure to share data between get_available_input_devices and its callback. +static struct { + pa_source_info **sources; // Array of pointers to pa_source_info structures + uint32_t count; // Count of available sources + uint32_t allocated; // Allocated size of the sources array +} shared_data_sources = {NULL, 0, 0}; + +#define MAX_CHANNELS 32 // You can adjust this number based on expected maximum channels + +typedef struct channel_info_s { + char **channel_names; // Pointer to an array of string pointers + int num_channels; // Counter for the number of channels +} channel_info_t; + + +static void pulse_cleanup(void); +static bool is_pulse_initialized(void); +static void get_output_device_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata); +static void get_profile_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata); + +// Utility function to print all properties in the proplist +void print_proplist(const pa_proplist *p) { + void *state = NULL; + const char *key; + while ((key = pa_proplist_iterate(p, &state))) { + const char *value = pa_proplist_gets(p, key); + if (value) { + printf("%s = %s\n", key, value); + } else { + printf("%s = \n", key); + } + } +} + +/** + * @brief Iterates through operations in the pulseaudio threaded loop. + * + * @param loop Pointer to the threaded loop instance. + * @param op Pointer to the pa_operation instance. + */ +static void iterate(pa_operation *op) { + //fprintf(stderr, "[DEBUG] Entering %s\n", __FUNCTION__); // Debug statement for entry + + //Leaves if operation is invalid. + if (!op) { + fprintf(stderr, "[DEBUG] Operation is NULL\n"); // Debug statement for NULL operation + return; + } + + bool is_in_mainloop_thread = pa_threaded_mainloop_in_thread(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Is in mainloop thread: %d\n", is_in_mainloop_thread); // Debug statement for thread check + + // If we're not in the mainloop thread, lock it. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_lock(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Mainloop locked\n"); // Debug statement for mainloop locked + } + + //Wait for the operation to complete. + //The signaling to continue is performed inside the callback operation (op). + while (pa_operation_get_state(op) == PA_OPERATION_RUNNING) { + pa_threaded_mainloop_wait(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Waiting in mainloop...\n"); // Debug message while waiting + } + + //Debug code if needed. + #if 0 + // Check the operation state after waiting + switch (pa_operation_get_state(op)) { + case PA_OPERATION_DONE: + fprintf(stderr, "[DEBUG] Operation completed successfully\n"); // Debug message for successful completion + break; + case PA_OPERATION_CANCELLED: + fprintf(stderr, "[DEBUG] Operation was cancelled\n"); // Debug message for cancellation + break; + case PA_OPERATION_RUNNING: // This case should not be possible after the wait + default: + fprintf(stderr, "[DEBUG] Operation is in an unexpected state: %d\n", pa_operation_get_state(op)); // Debug message for unexpected state + break; + } + #endif + + //Cleaning up. + pa_operation_unref(op); + //fprintf(stderr, "[DEBUG] Operation unreferenced and cleaned up\n"); // Debug statement for cleanup + + // If we locked the mainloop earlier, unlock it now. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Mainloop unlocked\n"); // Debug statement for mainloop unlocked + } + + //fprintf(stderr, "[DEBUG] Exiting %s\n", __FUNCTION__); // Debug statement for exit +} + + +/** + * @brief Callback function to handle changes in PulseAudio context state. + * + * This function is triggered whenever the state of the PulseAudio context changes. + * It signals the mainloop to continue execution whenever the context is in a READY, FAILED, + * or TERMINATED state. + * + * @param c Pointer to the PulseAudio context. + * @param userdata Pointer to the data shared with the main function, which contains the mainloop. + */ +static void context_state_cb(pa_context *c, void *userdata) { + (void) userdata; + pa_context_state_t state = pa_context_get_state(c); + + // If the context is in a READY, FAILED, or TERMINATED state, signal the mainloop to continue. + if (state == PA_CONTEXT_READY || state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } +} + +/** + * @brief Utility function to check if PulseAudio is initialized and in a READY state. + * + * This function checks the state of the PulseAudio context and other key PulseAudio resources + * to determine if PulseAudio has been successfully initialized and is in a READY state. + * + * @return True if PulseAudio is initialized and in a READY state, false otherwise. + */ +static bool is_pulse_initialized(void) { + + + // Check if the main components of PulseAudio (mainloop, mainloop_api, and context) are initialized. + if (shared_data_1.mainloop && shared_data_1.mainloop_api && shared_data_1.context) { + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + + // If the context is in a READY state, PulseAudio is initialized. + if (state == PA_CONTEXT_READY) { + return true; + } + } + return false; +} + +/** + * @brief Initializes the PulseAudio mainloop and context for querying audio information. + * + * This function sets up the necessary PulseAudio components for subsequent queries + * to the audio subsystem. It creates a new threaded mainloop, obtains the mainloop API, + * and creates a new context with a specified name. It also starts the mainloop and + * connects the context to the PulseAudio server, waiting until the context is ready + * or an error occurs. + * + * @note If this function fails at any point, it ensures that all allocated resources are + * cleaned up before returning. + * + * @return true if the PulseAudio components were initialized successfully, false otherwise. + */ +bool initialize_pulse() { + shared_data_1.mainloop = pa_threaded_mainloop_new(); + if (!shared_data_1.mainloop) { + fprintf(stderr, "Failed to create mainloop.\n"); + return false; + } + + shared_data_1.mainloop_api = pa_threaded_mainloop_get_api(shared_data_1.mainloop); + if (!shared_data_1.mainloop_api) { + fprintf(stderr, "Failed to get mainloop API.\n"); + pa_threaded_mainloop_free(shared_data_1.mainloop); + return false; + } + + shared_data_1.context = pa_context_new(shared_data_1.mainloop_api, "Easypulse query API"); + if (!shared_data_1.context) { + fprintf(stderr, "Failed to create context.\n"); + pa_threaded_mainloop_free(shared_data_1.mainloop); + return false; + } + + + pa_context_set_state_callback(shared_data_1.context, context_state_cb, shared_data_1.mainloop); + + // Start the threaded mainloop + pa_threaded_mainloop_start(shared_data_1.mainloop); + + // Lock the mainloop and connect the context + pa_threaded_mainloop_lock(shared_data_1.mainloop); + if (pa_context_connect(shared_data_1.context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + pulse_cleanup(); + return false; + } + + // Wait for the context to be ready + while (true) { + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + if (state == PA_CONTEXT_READY) { + break; + } else if (state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + pulse_cleanup(); + return false; + } + pa_threaded_mainloop_wait(shared_data_1.mainloop); + } + + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + return true; +} + + +/** + * @brief Cleanup function to properly disconnect and free PulseAudio resources. + * + * This function ensures that all the PulseAudio resources are properly disconnected, + * dereferenced, and freed to avoid any resource leaks. It should be called whenever + * PulseAudio operations are done and the program wishes to terminate or release PulseAudio. + */ +static void pulse_cleanup(void) { + if (shared_data_1.context) { + // Check if the context is in a state where it can be disconnected + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + if (state == PA_CONTEXT_READY) { + pa_context_disconnect(shared_data_1.context); + } + pa_context_unref(shared_data_1.context); + shared_data_1.context = NULL; + } + if (shared_data_1.mainloop) { + pa_threaded_mainloop_free(shared_data_1.mainloop); + shared_data_1.mainloop = NULL; + } +} + +/** + * @brief Callback function used to retrieve the count of audio profiles for a specific card. + * + * This function is called by PulseAudio when querying for the list of profiles for a given card index. + * It sets the profile_count with the number of profiles available for the card. + * If there's an error or the list is exhausted, the function signals the mainloop to continue + * without further processing. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current card information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function, which contains the mainloop + * and the profile_count to be set. + */ +static void get_profile_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + + uint32_t *profile_count = (uint32_t *) userdata; + + // Handle errors in retrieving profile count. + if (eol < 0) { + fprintf(stderr, "Failed to get profile count.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // If we've reached the end of the list of profiles, signal the mainloop to continue. + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Set the profile_count with the number of profiles available for the card. + *profile_count = i->n_profiles; +} + + +/** + * @brief Retrieve the count of audio profiles for a specific card. + * + * This function queries PulseAudio to get a count of all available audio profiles + * for a specified card index. If PulseAudio is not initialized, the function attempts + * to initialize it. If there's an error in fetching the profile count or initializing + * PulseAudio, it returns UINT32_MAX. + * + * @param card_index The index of the card for which to retrieve the profile count. + * @return Count of audio profiles or UINT32_MAX on error. + */ +uint32_t get_profile_count(uint32_t card_index) { + uint32_t profile_count = 0; // Initialize profile count to zero. + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "get_profiles_count(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails. + } + } + + // Query PulseAudio for the list of audio profiles for the specified card. + // The callback get_profile_count_cb will populate the profile_count variable. + count_op = pa_context_get_card_info_by_index(shared_data_1.context, card_index, get_profile_count_cb, &profile_count); + + // Wait for the PulseAudio operation to complete. + iterate(count_op); + + return profile_count; // Return the total count of profiles. +} + +/** + * @brief Callback function used to populate the list of available audio sinks. + * + * This function is called for each audio sink found by PulseAudio when querying + * for the list of sinks. The function populates the `shared_sink_data` structure + * with `pa_sink_info` for each sink. When the list is exhausted or there's an error, + * the function exits without further processing. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio sink information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function. + */ +static void get_available_output_devices_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + (void) userdata; + + uint32_t *count = &shared_data_3.count; + + // Handle errors in retrieving sink information. + if (eol < 0) { + fprintf(stderr, "Failed to get sink info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // If we've reached the end of the list of sinks, mark the end and exit the callback. + if (eol > 0) { + shared_data_3.sinks[*count] = NULL; // Set the last element to NULL as sentinel + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Allocate memory for the pa_sink_info structure. + shared_data_3.sinks[*count] = malloc(sizeof(pa_sink_info)); + if (shared_data_3.sinks[*count] == NULL) { + fprintf(stderr, "Failed to allocate memory for sink info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Copy the pa_sink_info structure. + *(shared_data_3.sinks[*count]) = *i; + + // Duplicate the strings to ensure they remain valid. + if (i->name != NULL) { + shared_data_3.sinks[*count]->name = strdup(i->name); + } + if (i->description != NULL) { + shared_data_3.sinks[*count]->description = strdup(i->description); + } + + (*count)++; +} + +/** + * @brief Retrieve the list of available audio sinks for a specific card. + * + * This function queries PulseAudio to get a list of all available audio sinks + * for a specified card index. It dynamically allocates memory based on the count + * of sinks to store the list of sinks. + * If PulseAudio is not initialized, the function attempts to initialize it. + * + * @param card_index The index of the card for which to retrieve the sinks. + * @return Pointer to the first sink in the list or NULL on error. + */ +pa_sink_info **get_available_output_devices() { + pa_operation *op = NULL; + + // Using get_output_device_count() to obtain the number of sinks + uint32_t max_sinks = get_output_device_count(); + + // Allocate memory for pointers + shared_data_3.sinks = malloc((max_sinks + 1) * sizeof(pa_sink_info*)); + shared_data_3.count = 0; // Reset count + + // Check for successful memory allocation + if (!shared_data_3.sinks) { + fprintf(stderr, "Failed to allocate memory for sinks.\n"); + return NULL; + } + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_available_output_devices(): failed to initialize pulseaudio.\n"); + free(shared_data_3.sinks); + shared_data_3.sinks = NULL; + return NULL; + } + } + + + // Query PulseAudio for the list of available sinks for the specified card + op = pa_context_get_sink_info_list(shared_data_1.context, get_available_output_devices_cb, NULL); + + // Wait for the PulseAudio operation to complete + iterate(op); + + return shared_data_3.sinks; +} + +/** + * @brief Frees the memory allocated for an array of output devices (sinks). + * + * This function iterates over an array of `pa_sink_info` pointers, freeing the memory for + * each sink's name and description strings, followed by the sink structure itself. It concludes + * by freeing the memory for the array of pointers. + * + * @param sinks A pointer to the first element in an array of `pa_sink_info` pointers, which + * must be terminated with a NULL pointer. If NULL is passed, the function does nothing. + */ +void delete_output_devices(pa_sink_info **sinks) { + if (sinks == NULL) { + return; + } + + for (int i = 0; sinks[i] != NULL; ++i) { + if (sinks[i]->name) { + free((char*)sinks[i]->name); + } + if (sinks[i]->description) { + free((char*)sinks[i]->description); + } + free(sinks[i]); + } + + free(sinks); +} + +/** + * @brief Frees the memory allocated for an array of input devices (sources). + * + * This function iterates over an array of `pa_source_info` pointers, freeing the memory for + * each source's name and description strings, followed by the source structure itself. It concludes + * by freeing the memory for the array of pointers. + * + * @param sources A pointer to the first element in an array of `pa_source_info` pointers, which + * must be terminated with a NULL pointer. If NULL is passed, the function does nothing. + */ +void delete_input_devices(pa_source_info **sources) { + if (!sources) { + return; // Nothing to do if the pointer is NULL + } + + // Iterate through each source info and free its memory + for (int i = 0; sources[i] != NULL; i++) { + if (sources[i]->name) { + free((char*)sources[i]->name); + } + if (sources[i]->description) { + free((char*)sources[i]->description); + } + free(sources[i]); + } + + // Free the array of pointers itself + free(sources); +} + + +/** + * @brief Callback function used to count the available audio devices (cards). + * + * This function is called for each audio device found by PulseAudio when querying + * for the list of devices. The function increments the device_count for each device. + * When the list is exhausted or there's an error, it signals the mainloop to continue. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio device information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function. + */ +static void get_output_device_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + (void) i; + + uint32_t *device_count = (uint32_t *) userdata; + + if (eol < 0) { + // Handle error + //fprintf(stderr,"[DEBUG, get_output_device_count_cb()] Reached elo < 0. Signal triggered.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + if (eol > 0) { + // End of list + //fprintf(stderr,"[DEBUG, get_output_device_count_cb()] Reached elo > 0. Signal triggered.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + ++(*device_count); +} + + + +/** + * @brief Retrieve the count of audio devices in the system. + * + * This function queries PulseAudio to get a count of all available audio devices (cards). + * If PulseAudio is not initialized, the function attempts to initialize it. If the initialization + * fails or there's an error in fetching the device count, it returns UINT32_MAX. + * + * @return Count of audio devices or UINT32_MAX on error. + */ +uint32_t get_output_device_count(void) { + uint32_t device_count = 0; // Initialize device count to zero. + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "get_device_count(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails. + } + } + + // Check if context is valid after initialization attempt. + if (!shared_data_1.context) { + fprintf(stderr, "Context is NULL in get_device_count.\n"); + return UINT32_MAX; + } + + //fprintf(stderr,"[get_device_count()] context is, %p\n",&shared_data_1.context); + //fprintf(stderr,"[get_device_count()] mainloop is, %p\n",&shared_data_1.mainloop); + + // Query PulseAudio for the list of audio devices (cards). + // The callback get_device_count_cb will increment the device_count for each device found. + count_op = pa_context_get_card_info_list(shared_data_1.context, get_output_device_count_cb, &device_count); + + // Wait for the PulseAudio operation to complete. + iterate(count_op); + + return device_count; // Return the total count of devices. +} + +/** + * @brief Retrieves the minimum number of channels for the given ALSA device name. + * + * This function opens the specified ALSA device in capture mode, retrieves + * its hardware parameters, and then queries for the minimum number of channels + * supported by the device. + * + * @param alsa_name Name of the ALSA device. + * @return Minimum number of channels supported by the device or -1 on error. + */ +int get_min_input_channels(const char *alsa_id, const pa_source_info *source_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int min_channels = 0; + int err; + + if ((!alsa_id) && (!source_info)) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + //The input device was found, but there's no alsa information about it. + //Attempt to retrieve used channels instead. + else if((!alsa_id) && (source_info)) { + return source_info->sample_spec.channels; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK)) < 0) { + fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return source_info->sample_spec.channels; // Return channels from PulseAudio if ALSA fails + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return source_info->sample_spec.channels; + } + + if ((err = snd_pcm_hw_params_get_channels_min(params, &min_channels)) < 0) { + fprintf(stderr, "Error getting min channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return source_info->sample_spec.channels; + } + + snd_pcm_close(handle); + return min_channels; +} + + +/** + * @brief Retrieves the maximum number of channels for the given ALSA device name. + * + * This function opens the specified ALSA device in capture mode, retrieves + * its hardware parameters, and then queries for the maximum number of channels + * supported by the device. If ALSA fails, it will fall back to using the + * information from PulseAudio. + * + * @param alsa_name Name of the ALSA device. + * @param source_info Information about the PulseAudio source. + * @return Maximum number of channels supported by the device or -1 on error. + */ +int get_max_input_channels(const char *alsa_id, const pa_source_info *source_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int max_channels = 0; + int err; + + if ((!alsa_id) && (!source_info)) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + //The input device was found, but there's no alsa information about it. + //Attempt to retrieve used channels instead. + else if((!alsa_id) && (source_info)) { + return source_info->sample_spec.channels; + } + + // Try to open the ALSA device in capture mode + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK)) < 0) { + fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + // ALSA failed, fall back to PulseAudio information + return source_info->sample_spec.channels; + } + + // Allocate hardware parameters object + snd_pcm_hw_params_alloca(¶ms); + + // Fill it in with default values + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return source_info->sample_spec.channels; + } + + // Get the maximum number of channels + if ((err = snd_pcm_hw_params_get_channels_max(params, &max_channels)) < 0) { + fprintf(stderr, "Error getting max channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return source_info->sample_spec.channels; + } + + // Close the device + snd_pcm_close(handle); + + return max_channels; +} + +/** + * @brief Retrieves the maximum number of channels for the given ALSA device name. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the maximum number of channels + * supported by the device. + * + * @param alsa_name Name of the ALSA device. + * @return Maximum number of channels supported by the device or -1 on error. + */ +int get_max_output_channels(const char *alsa_id, const pa_sink_info *sink_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int max_channels = 0; + int err; + + if ((!alsa_id) && (!sink_info)) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + //The input device was found, but there's no alsa information about it. + //Attempt to retrieve used channels instead. + else if((!alsa_id) && (sink_info)) { + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { + //fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return sink_info->sample_spec.channels; // Return channels from PulseAudio if ALSA fails + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + //fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_hw_params_get_channels_max(params, &max_channels)) < 0) { + //fprintf(stderr, "Error getting max channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + //fprintf(stderr, "[DEBUG, get_max_channels()] sink_info->sample_spec.channels is %i\n", sink_info->sample_spec.channels); + return sink_info->sample_spec.channels; + } + + snd_pcm_close(handle); + return max_channels; +} + +/** + * @brief Retrieves the minimum number of channels for the given ALSA device id. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the minimum number of channels + * supported by the device. + * + * @param alsa_name Name of the ALSA device. + * @return Minimum number of channels supported by the device or -1 on error. + */ +int get_min_output_channels(const char *alsa_id, const pa_sink_info *sink_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int min_channels = 0; + int err; + + //fprintf(stderr, "[DEBUG, get_min_output_channels()] sink_info->sample_spec.channels is %i\n", sink_info->sample_spec.channels); + + if ((!alsa_id) && (!sink_info)) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + //The input device was found, but there's no alsa information about it. + //Attempt to retrieve used channels instead. + else if((!alsa_id) && (sink_info)) { + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { + //fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return sink_info->sample_spec.channels; + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + //fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_hw_params_get_channels_min(params, &min_channels)) < 0) { + //fprintf(stderr, "Error getting min channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.channels; + } + + snd_pcm_close(handle); + return min_channels; +} + +/** + * @brief Callback function for retrieving the ALSA card name of a PulseAudio source. + * + * This callback is called by the PulseAudio context during the operation to retrieve + * information about each available source. It is registered with the + * pa_context_get_source_info_by_name() function call. + * + * @param c The PulseAudio context. + * @param i The source information structure containing details about the source. + * @param eol End of list indicator. If non-zero, indicates no more data to process. + * @param userdata User data provided when registering the callback. In this case, it is + * expected to be the name of the source for which we want the ALSA card name. + * + * @note This function is intended to be used internally and should not be called directly. + * + * @warning This function uses global shared data (shared_data_2.alsa_name) to store the + * retrieved ALSA name, and signals the main loop to stop waiting. Ensure that + * the main loop and shared data are properly managed. + */ +static void get_alsa_input_name_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; + + if (eol < 0 || !i) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; // Handle error or invalid source info + } + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; // End of list + } + + // Check if this source is the one we're interested in + if (userdata && strcmp(i->name, (const char *)userdata) == 0) { + const char *prop_alsa_card_name = pa_proplist_gets(i->proplist, "alsa.card_name"); + if (prop_alsa_card_name) { + shared_data_2.alsa_name = strdup(prop_alsa_card_name); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); // Signal to stop the loop + } + } +} + +/** + * @brief Retrieves the ALSA name of a given PulseAudio source. + * + * @param source_name The name of the source for which to retrieve the ALSA name. + * @return The ALSA name of the source or NULL if not found or on error. + */ +const char* get_alsa_input_name(const char *source_name) { + if (!source_name) { + fprintf(stderr, "get_alsa_input_name(): Invalid source name.\n"); + return NULL; + } + + shared_data_2.alsa_name = NULL; // Ensure alsa_name is initialized to NULL + + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "get_alsa_input_name(): PulseAudio initialization failed.\n"); + return NULL; + } + + pa_operation *name_op = pa_context_get_source_info_by_name(shared_data_1.context, source_name, get_alsa_input_name_cb, (void*)source_name); + iterate(name_op); + + return shared_data_2.alsa_name; +} + + +/** + * @brief Callback function to retrieve the ALSA name from the card info. + * + * This callback checks for the "alsa.card_name" property in the card's + * proplist. If the property is found, it assigns the property's value + * to the shared data structure for further use. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the card info structure. + * @param eol Flag indicating end of list. + * @param userdata User-defined data pointer (unused in this callback). + */ +static void get_alsa_output_name_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + + if (eol) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + const char *target_sink_name = userdata; + if (target_sink_name && strcmp(target_sink_name, i->name) != 0) { + return; // Skip this sink, as it does not match the specified name + } + + const char *alsa_name = pa_proplist_gets(i->proplist, "alsa.card_name"); + if (alsa_name) { + shared_data_2.alsa_name = strdup(alsa_name); + if (!shared_data_2.alsa_name) { + fprintf(stderr, "Failed to allocate memory for ALSA name.\n"); + } + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } +} + + + +/** + * @brief Retrieves the ALSA name of the first audio device encountered. + * + * This function initializes PulseAudio (if not already initialized), then + * queries PulseAudio for the list of audio devices. It waits for the + * retrieval operation to complete and then returns the ALSA name + * of the first device it finds with the "alsa.card_name" property. + * + * @return ALSA name of the device or NULL if not found or on error. + */ +const char* get_alsa_output_name(const char *sink_name) { + pa_operation *name_op; + + shared_data_2.alsa_name = NULL; // Ensure alsa_name is initialized to NULL + + + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "get_alsa_name(): PulseAudio initialization failed.\n"); + return NULL; + } + + name_op = pa_context_get_sink_info_list(shared_data_1.context, get_alsa_output_name_cb, (void*)sink_name); + iterate(name_op); + + return shared_data_2.alsa_name; +} + +/** + * @brief Callback function to retrieve the ALSA device string based on PulseAudio source information. + * + * This function is called for each available PulseAudio source. It checks if the source's name matches + * the target source name provided in the userdata. If a match is found, it retrieves the "alsa.card" and + * "alsa.device" properties from the source's proplist, constructs the ALSA device string in the format + * "hw:,", and stores it in shared data for later retrieval. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the source information structure. + * @param eol End of list flag. If non-zero, indicates the end of the source list. + * @param userdata User-defined data pointer. In this case, it points to the target source name string. + */ +static void get_alsa_input_id_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; // Unused parameter + + // Check for end of list + if (eol) { + // Signal the main loop to unblock the iterate function + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + free(userdata); + return; + } + + // Retrieve the target source name from userdata + const char *target_source_name = (const char *)userdata; + + // Skip this source if it does not match the specified target name + if (target_source_name && strcmp(target_source_name, i->name) != 0) { + return; + } + + // Attempt to retrieve the "alsa.card" and "alsa.device" properties + const char *alsa_card = pa_proplist_gets(i->proplist, "alsa.card"); + const char *alsa_device = pa_proplist_gets(i->proplist, "alsa.device"); + + //print_proplist(i->proplist); + //printf("[DEBUG, get_alsa_input_id_cb] alsa_card is %s\n", alsa_card); + //printf("[DEBUG, get_alsa_input_id_cb] alsa_device is %s\n", alsa_device); + + // Construct the ALSA device string if both properties are available + if (alsa_card && alsa_device && isdigit((unsigned char)alsa_device[0])) { + char alsa_device_string[128]; + snprintf(alsa_device_string, sizeof(alsa_device_string), "hw:%s,%s", alsa_card, alsa_device); + + // Store the ALSA device string in shared data + shared_data_2.alsa_id = strdup(alsa_device_string); + if (!shared_data_2.alsa_id) { + fprintf(stderr, "Failed to allocate memory for ALSA device id.\n"); + } + } else { + // Log an error if ALSA properties are not found or are invalid + //fprintf(stderr, " - ALSA properties not found or invalid for source.\n"); + shared_data_2.alsa_id = NULL; + } + + // Signal the main loop to unblock the iterate function + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + +/** + * @brief Retrieves the ALSA device string for a given PulseAudio source name. + * + * This function initializes PulseAudio (if not already initialized), then queries PulseAudio for the + * information of a specific source by its name. It waits for the retrieval operation to complete and then + * returns the constructed ALSA device string based on the "alsa.card" and "alsa.device" properties of + * the source. + * + * @param source_name The name of the PulseAudio source. + * @return ALSA device string in the format "hw:," or NULL if not found or on error. + */ +const char* get_alsa_input_id(const char *source_name) { + // Operation object for asynchronous PulseAudio calls + pa_operation *op; + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_alsa_input_id(): PulseAudio initialization failed.\n"); + return NULL; + } + } + + // Duplicate the source name to ensure it remains valid throughout the operation + char *source_name_copy = strdup(source_name); + if (!source_name_copy) { + fprintf(stderr, "get_alsa_input_id(): Failed to allocate memory for source name.\n"); + return NULL; + } + + // Start querying PulseAudio for the specified source information + op = pa_context_get_source_info_by_name(shared_data_1.context, source_name_copy, get_alsa_input_id_cb, source_name_copy); + + // Block and wait for the operation to complete + iterate(op); + + // After the callback has been called with the source information, the ALSA device ID will be stored + // Return the stored ALSA device ID + return shared_data_2.alsa_id; +} + + + +/** + * @brief Callback function to retrieve the ALSA device string based on the PulseAudio sink information. + * + * This function is called for each available PulseAudio sink. It checks if the sink's name matches the + * target sink name provided in the userdata. If a match is found, it retrieves the "alsa.card" and + * "alsa.device" properties from the sink's proplist, constructs the ALSA device string in the format + * "hw:,", and stores it in shared data for later retrieval. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the sink information structure. + * @param eol End of list flag. If non-zero, indicates the end of the sink list. + * @param userdata User-defined data pointer. In this case, it points to the target sink name string. + */ +static void get_alsa_output_id_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; // Unused parameter + + // Check for end of list + if (eol) { + // Signal the main loop to unblock the iterate function + //fprintf(stderr,"[DEBUG, get_alsa_id_cb()] End of function reached.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + free(userdata); + return; + } + + // Retrieve the target sink name from userdata + const char *target_sink_name = userdata; + + // If a target sink name is provided, check if it matches the current sink's name + if (target_sink_name && strcmp(target_sink_name, i->name) != 0) { + return; // Skip this sink, as it does not match the specified name + } + + // Attempt to retrieve the "alsa.card" and "alsa.device" properties + const char *alsa_card = pa_proplist_gets(i->proplist, "alsa.card"); + const char *alsa_device = pa_proplist_gets(i->proplist, "alsa.device"); + + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()], alsa.card is %s\n", alsa_card); + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()], alsa.device is %s\n", alsa_device); + + // Check if both properties are available and alsa.device is a digit + if (alsa_card && alsa_device && isdigit((unsigned char)alsa_device[0])) { + // Construct the ALSA device string + char alsa_device_string[128]; + snprintf(alsa_device_string, sizeof(alsa_device_string), "hw:%s,%s", alsa_card, alsa_device); + + // Store the ALSA device string in shared data + shared_data_2.alsa_id = strdup(alsa_device_string); + if (!shared_data_2.alsa_id) { + fprintf(stderr, "Failed to allocate memory for ALSA device id.\n"); + } + } else { + shared_data_2.alsa_id = NULL; + //fprintf(stderr, " - ALSA properties not found or invalid for sink.\n"); + } + + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()] alsa ID is %s\n", shared_data_2.alsa_id); + + // Signal the main loop to unblock the iterate function + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + + +/** + * @brief Retrieves the ALSA device string for a given PulseAudio sink name. + * + * This function initializes PulseAudio (if not already initialized), then queries PulseAudio for the + * information of a specific sink by its name. It waits for the retrieval operation to complete and then + * returns the constructed ALSA device string based on the "alsa.card" and "alsa.device" properties of + * the sink. + * + * @param sink_name The name of the PulseAudio sink. + * @return ALSA device string in the format "hw:," or NULL if not found or on error. + */ +const char* get_alsa_output_id(const char *sink_name) { + pa_operation *op; + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_alsa_id(): PulseAudio initialization failed.\n"); + return NULL; + } + } + + // Make a copy of the sink name to ensure it remains valid + char *sink_name_copy = strdup(sink_name); + if (!sink_name_copy) { + fprintf(stderr, "get_alsa_id(): Failed to allocate memory for sink name.\n"); + return NULL; + } + + // Query PulseAudio for the information of the specified sink + //fprintf(stderr,"[DEBUG, get_alsa_id()] sink name is: %s\n", sink_name_copy); + op = pa_context_get_sink_info_by_name(shared_data_1.context, sink_name_copy, get_alsa_output_id_cb, sink_name_copy); + + // Wait for the PulseAudio operation to complete + iterate(op); + + // Return the ALSA device string retrieved by the callback function + return shared_data_2.alsa_id; +} + +static void get_input_sample_rate_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; + if (eol < 0) { + // An error occurred + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + if (eol > 0) { + // No more entries + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Extract the sample rate and store it in the user data + uint32_t *sample_rate = userdata; + *sample_rate = i->sample_spec.rate; +} + +uint32_t get_input_sample_rate(const char *source_name) { + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "PulseAudio is not initialized.\n"); + return 0; + } + + uint32_t sample_rate = 0; + pa_operation *op = NULL; + + + // Get the source info, passing the address of sample_rate as user data + op = pa_context_get_source_info_by_name(shared_data_1.context, source_name, get_input_sample_rate_cb, &sample_rate); + iterate(op); + + return sample_rate; +} + +/** + * @brief Retrieves the sample rate of the given ALSA device. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the sample rate. + * + * @param alsa_id Name of the ALSA device. + * @param sink_info Pointer to a PulseAudio sink_info structure. + * @return Sample rate of the device or -1 on error. + */ +int get_output_sample_rate(const char *alsa_id, const pa_sink_info *sink_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int sample_rate; + int err; + + if (!alsa_id || !sink_info) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { + fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return sink_info->sample_spec.rate; // Return sample rate from PulseAudio if ALSA fails + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.rate; + } + + if ((err = snd_pcm_hw_params_get_rate(params, &sample_rate, 0)) < 0) { + //fprintf(stderr, "Error getting sample rate for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.rate; + } + + snd_pcm_close(handle); + return sample_rate; +} + +// Callback for source information to get ports +void get_source_ports(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; + + pa_source_info_list *info_list = (pa_source_info_list *)userdata; + if (eol > 0) { + info_list->done = 1; + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + info_list->ports = realloc(info_list->ports, (info_list->num_ports + 1) * sizeof(pa_port_info)); + pa_port_info *port = &info_list->ports[info_list->num_ports]; + port->name = strdup(i->name); + port->description = strdup(i->description); + port->is_active = 0; // Will be set in the active port callback + + info_list->num_ports++; +} + +// Callback for source information to get the active port +void get_active_port(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; + pa_source_info_list *info_list = (pa_source_info_list *)userdata; + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (i->active_port) { + for (int j = 0; j < info_list->num_ports; ++j) { + if (strcmp(info_list->ports[j].name, i->active_port->name) == 0) { + info_list->ports[j].is_active = 1; + break; + } + } + } +} + +// Function to collect source port information and return it +pa_source_info_list* get_source_port_info() { + pa_source_info_list* info_list = malloc(sizeof(pa_source_info_list)); + if (!info_list) { + // Handle malloc failure + return NULL; + } + memset(info_list, 0, sizeof(pa_source_info_list)); + + // Call the function to get the list of sources + pa_operation *op = pa_context_get_source_info_list(shared_data_1.context, get_source_ports, info_list); + iterate(op); + + // Now iterate over the collected sources and get detailed info for each one + for (int i = 0; i < info_list->num_ports; ++i) { + op = pa_context_get_source_info_by_name(shared_data_1.context, info_list->ports[i].name, get_active_port, info_list); + + iterate(op); + } + + // The info_list now contains all the ports and their active status + return info_list; +} + + +/** + * @brief Retrieves the volume of a given channel from a PulseAudio sink. + * + * This function takes a pointer to a pa_sink_info structure and a channel index + * and returns the volume of that channel. The volume is given as a pa_volume_t, + * which is an unsigned 32-bit integer. The function checks if the channel index + * is within the valid range for the sink. + * + * @param sink_info A pointer to a pa_sink_info structure containing the sink details. + * @param channel_index The index of the channel for which to retrieve the volume. + * @return The volume of the specified channel as a pa_volume_t, or PA_VOLUME_INVALID on error. + */ +pa_volume_t get_channel_volume(const pa_sink_info *sink_info, unsigned int channel_index) { + // Check if the sink_info is NULL + if (sink_info == NULL) { + return PA_VOLUME_INVALID; // Return invalid volume if sink_info is NULL + } + + // Check if the provided channel index is valid + if (channel_index >= sink_info->channel_map.channels) { + return PA_VOLUME_INVALID; // Return invalid volume if the channel_index is out of range + } + + // Retrieve the volume of the given channel + return sink_info->volume.values[channel_index]; +} + + + +/** + * @brief Callback function for processing each available audio input device (source) found. + * + * This function is called by the PulseAudio context as part of the operation initiated by + * `get_available_input_devices`. It is invoked for each source found, and is responsible for + * storing the details of each source into a dynamically allocated array. The function handles + * memory allocation for the array of `pa_source_info` structures, as well as for the strings + * within them. It also handles error conditions and signals the mainloop to terminate the wait + * when the end of the source list is reached or an error occurs. + * + * @param c The PulseAudio context. + * @param i The `pa_source_info` structure containing details about the current source. + * @param eol End-Of-List indicator. If positive, indicates the end of the list; if negative, indicates an error. + * @param userdata User data pointer provided during the context operation setup; unused in this callback. + */ +static void get_available_input_devices_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void)c; // Unused parameter + //fprintf(stderr, "[DEBUG] %s called with eol=%d\n", __FUNCTION__, eol); // Debug statement for entry + (void)userdata; // Unused parameter + //fprintf(stderr, "[DEBUG] %s called with eol=%d\n", __FUNCTION__, eol); // Debug statement for entry + + // Error or end of list + if (eol < 0) { + //fprintf(stderr, "Failed to get source info.\n"); + //fprintf(stderr, "[DEBUG] Signaling main loop to continue.\n"); // Debug statement before signaling + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // If we've reached the end of the list, signal the main loop to stop waiting + if (eol > 0) { + shared_data_sources.sources[shared_data_sources.count] = NULL; // Sentinel value + //fprintf(stderr, "[DEBUG] Signaling main loop to continue.\n"); // Debug statement before signaling + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Allocate or resize the sources array as needed + if (shared_data_sources.count >= shared_data_sources.allocated) { + uint32_t new_size = (shared_data_sources.allocated + 8) * sizeof(pa_source_info *); + pa_source_info **temp = realloc(shared_data_sources.sources, new_size); + if (!temp) { + //fprintf(stderr, "Out of memory.\n"); + //fprintf(stderr, "[DEBUG] Signaling main loop to continue.\n"); // Debug statement before signaling + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + shared_data_sources.sources = temp; + shared_data_sources.allocated += 8; + } + + // Allocate memory for a new pa_source_info structure + shared_data_sources.sources[shared_data_sources.count] = malloc(sizeof(pa_source_info)); + if (!shared_data_sources.sources[shared_data_sources.count]) { + fprintf(stderr, "Failed to allocate memory for source info.\n"); + fprintf(stderr, "[DEBUG] Signaling main loop to continue.\n"); // Debug statement before signaling + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Copy the information from the callback + *(shared_data_sources.sources[shared_data_sources.count]) = *i; + + // Duplicate the strings to ensure they will remain valid + if (i->name) { + shared_data_sources.sources[shared_data_sources.count]->name = strdup(i->name); + } + if (i->description) { + shared_data_sources.sources[shared_data_sources.count]->description = strdup(i->description); + } + + // Increase the count of found sources + shared_data_sources.count++; +} + +/** + * @brief Retrieves an array of available audio input devices (sources). + * + * This function queries the PulseAudio server for a list of all audio input devices + * currently available. It ensures that PulseAudio is initialized before making the query + * and locks the main loop to provide thread safety during the operation. + * + * Each call to this function should be followed by a call to `delete_input_devices` + * to free the allocated memory for the returned array of `pa_source_info` pointers. + * + * @note The array is terminated with a NULL pointer as the last element. + * + * @return On success, a pointer to an array of `pa_source_info` pointers, each representing + * an audio input device. On failure, or if PulseAudio is not initialized, NULL is returned. + */ +pa_source_info **get_available_input_devices() { + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "PulseAudio is not initialized.\\n"); + return NULL; + } + + shared_data_sources.sources = NULL; + shared_data_sources.count = 0; + + // Prepare the PulseAudio operation to list the sources + pa_operation *op = pa_context_get_source_info_list(shared_data_1.context, get_available_input_devices_cb, NULL); + + // Wait for the operation to complete + iterate(op); + // Allocate one extra pointer to NULL at the end as a sentinel + shared_data_sources.sources = realloc(shared_data_sources.sources, (shared_data_sources.count + 1) * sizeof(pa_source_info *)); + shared_data_sources.sources[shared_data_sources.count] = NULL; + + return shared_data_sources.sources; +} + +/** + * @brief Callback function used to count the available audio input devices (sources). + * + * This function is called for each audio input device found by PulseAudio when querying + * for the list of sources. The function increments the device_count for each device. + * When the list is exhausted or there's an error, it signals the mainloop to continue. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio input device information. + * @param eol End-Of-List indicator. If positive, indicates the end of the list; if negative, indicates an error. + * @param userdata Pointer to the user data, which in this case is expected to be a pointer to the device_count. + */ +static void get_input_device_count_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; // Suppress unused parameter warning + (void) i; // Suppress unused parameter warning + + uint32_t *device_count = (uint32_t *) userdata; + + if (eol < 0) { + // Handle error + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + if (eol > 0) { + // End of list + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + ++(*device_count); +} + + +/** + * @brief Retrieve the count of audio input devices in the system. + * + * This function queries PulseAudio to get a count of all available audio input devices (sources). + * If PulseAudio is not initialized, the function attempts to initialize it. If the initialization + * fails or there's an error in fetching the device count, it returns UINT32_MAX. + * + * @return Count of audio input devices or UINT32_MAX on error. + */ +uint32_t get_input_device_count(void) { + uint32_t device_count = 0; // Initialize device count to zero + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_input_device_count(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails + } + } + + // Check if context is valid after initialization attempt + if (!shared_data_1.context) { + fprintf(stderr, "Context is NULL in get_input_device_count.\n"); + return UINT32_MAX; + } + + // Query PulseAudio for the list of audio input devices (sources) + count_op = pa_context_get_source_info_list(shared_data_1.context, get_input_device_count_cb, &device_count); + + // Wait for the PulseAudio operation to complete + iterate(count_op); + + return device_count; // Return the total count of input devices +} + + +/** + * @brief Get the channel names for a specific sink identified by its name. + * + * This function retrieves the channel names for a given sink using its unique name. + * It allocates an array of strings where each entry corresponds to a channel name + * of the sink. The caller is responsible for freeing the memory allocated for the + * array of channel names and the strings themselves. + * + * @param sink_name The name of the sink whose channel names are to be retrieved. + * @param num_channels Number of channels of the sink. + * @return A pointer to an array of strings containing the channel names, or NULL if + * the sink is not found or in case of an error. + */ +char** get_output_channel_names(const char *alsa_id, int num_channels) { + // Validate input parameters + if (!alsa_id) { + return NULL; // Return NULL if the sink name is not provided + } + + // Retrieve the sink information for the specified sink name + pa_sink_info *device_info = get_output_device_by_name(alsa_id); + + // Check if the sink was found + if (!device_info) { + return NULL; // Return NULL if the sink is not found or in case of an error + } + + char **channel_names = calloc(num_channels, sizeof(char*)); + + if (!channel_names) { + free((char *)device_info->description); // Free the description if allocated + free(device_info); // Free the device_info structure + return NULL; // Return NULL if memory allocation fails + } + + // Copy the channel names into the array + for (int i = 0; i < num_channels; ++i) { + channel_names[i] = strdup(pa_channel_position_to_pretty_string(device_info->channel_map.map[i])); + if (!channel_names[i]) { + // Handle allocation failure for a channel name + // Free all previously allocated names and the array itself + while (i--) free(channel_names[i]); + free(channel_names); + free((char *)device_info->description); // Free the description if allocated + free(device_info); // Free the device_info structure + return NULL; // Return NULL if memory allocation fails + } + } + + // Free the sink_info structure and its description field + if (device_info->description) { + free((char *)device_info->description); // Corrected free statement + } + free(device_info); + + // Return the array of channel names + return channel_names; +} + +/** + * @brief Get the channel names for a specific source identified by its name. + * + * This function retrieves the channel names for a given source using its unique name. + * It allocates an array of strings where each entry corresponds to a channel name + * of the source. The caller is responsible for freeing the memory allocated for the + * array of channel names and the strings themselves. + * + * @param source_name The name of the source whose channel names are to be retrieved. + * @param num_channels Number of channels of the source. + * @return A pointer to an array of strings containing the channel names, or NULL if + * the source is not found or in case of an error. + */ +char** get_input_channel_names(const char *alsa_id, int num_channels) { + // Validate input parameters + if (!alsa_id) { + return NULL; // Return NULL if the source name is not provided + } + + // Retrieve the source information for the specified source name + pa_source_info *device_info = get_input_device_by_name(alsa_id); + + // Check if the source was found + if (!device_info) { + return NULL; // Return NULL if the source is not found or in case of an error + } + + char **channel_names = calloc(num_channels, sizeof(char*)); + if (!channel_names) { + free((char *)device_info->description); // Free the description if allocated + free(device_info); // Free the device_info structure + return NULL; // Return NULL if memory allocation fails + } + + // Copy the channel names into the array + for (int i = 0; i < num_channels; ++i) { + channel_names[i] = strdup(pa_channel_position_to_pretty_string(device_info->channel_map.map[i])); + if (!channel_names[i]) { + // Handle allocation failure for a channel name + while (i--) free(channel_names[i]); // Free all previously allocated names + free(channel_names); // Free the array itself + free((char *)device_info->description); // Free the description if allocated + free(device_info); // Free the device_info structure + return NULL; // Return NULL if memory allocation fails + } + } + + // Free the source_info structure and its description field + if (device_info->description) { + free((char *)device_info->description); + } + free(device_info); + + // Return the array of channel names + return channel_names; +} + +/** + * @brief Retrieve a source (input device) information by its name. + * + * This function searches for an audio source with the given name and returns its information + * if found. The caller is responsible for freeing the memory allocated for the source info + * and its description. + * + * @param source_name The name of the source to be retrieved. + * @return A pointer to a pa_source_info structure containing the source information, + * or NULL if the source is not found or in case of an error. + */ +pa_source_info *get_input_device_by_name(const char *source_name) { + if (!source_name) { + return NULL; // Handle null pointer argument + } + + // Retrieve the list of available input devices (sources) + pa_source_info **available_sources = get_available_input_devices(); + if (!available_sources) { + return NULL; // Handle error in retrieving sources + } + + pa_source_info *input_device_info = NULL; + + // Iterate over the list of sources to find the one with the matching name + for (int i = 0; available_sources[i] != NULL; ++i) { + if (strcmp(available_sources[i]->name, source_name) == 0) { + // Found the matching source, make a copy of the source_info structure + input_device_info = malloc(sizeof(pa_source_info)); + if (input_device_info) { + memcpy(input_device_info, available_sources[i], sizeof(pa_source_info)); + + // If the source has a description, also copy that string + if (available_sources[i]->description) { + input_device_info->description = strdup(available_sources[i]->description); + } + } + break; // Exit the loop after finding the matching source + } + } + + // Clean up the source information now that we're done with it + // Assuming there's a function to delete input devices similar to delete_output_devices + delete_input_devices(available_sources); + + return input_device_info; // Return the found source or NULL if not found +} + + + +/** + * @brief Retrieve a copy of the sink information for a given sink name. + * + * This function searches through the available output devices and returns a copy of the + * pa_sink_info structure for the sink that matches the provided name. It uses the + * get_available_output_devices function to obtain the list of all sinks and then + * iterates through them to find the sink with the given name. + * + * @param sink_name The name of the sink to search for. Must not be NULL. + * @return A pointer to a newly allocated pa_sink_info structure containing the sink + * information, or NULL if the sink is not found or if an error occurs. The + * caller is responsible for freeing the returned structure and its description + * field (if not NULL) when no longer needed. + * + * @note The function allocates memory for the returned pa_sink_info structure and its + * description field. It is the responsibility of the caller to free this memory + * using free(). If the sink has other dynamically allocated fields, these must + * also be freed by the caller. + * + * @warning The function returns NULL if the sink_name argument is NULL, or if the + * get_available_output_devices function fails to retrieve the sinks. + * + * Usage Example: + * @code + * pa_sink_info *sink_info = get_sink_by_name("alsa_output.pci-0000_00_1b.0.analog-stereo"); + * if (sink_info) { + * // Use the sink information + * ... + * // Free the memory allocated for the description + * if (sink_info->description) { + * free(sink_info->description); + * } + * // Free the memory allocated for the sink_info structure + * free(sink_info); + * } + * @endcode + */ +pa_sink_info *get_output_device_by_name(const char *sink_name) { + if (!sink_name) { + return NULL; // Handle null pointer argument + } + + // Retrieve the list of available output devices (sinks) + pa_sink_info **available_sinks = get_available_output_devices(); + if (!available_sinks) { + return NULL; // Handle error in retrieving sinks + } + + pa_sink_info *output_device_to_return = NULL; + + // Iterate over the list of sinks to find the one with the matching name + for (int i = 0; available_sinks[i] != NULL; ++i) { + if (strcmp(available_sinks[i]->name, sink_name) == 0) { + // Found the matching output_device, make a copy of the sink_info structure + output_device_to_return = malloc(sizeof(pa_sink_info)); + if (output_device_to_return) { + memcpy(output_device_to_return, available_sinks[i], sizeof(pa_sink_info)); + + // If the sink has a description, also copy that string + if (available_sinks[i]->description) { + output_device_to_return->description = strdup(available_sinks[i]->description); + } + } + break; // Exit the loop after finding the matching sink + } + } + + // Clean up the sink information now that we're done with it + delete_output_devices(available_sinks); + + return output_device_to_return; // Return the found sink or NULL if not found +} diff --git a/v-0.07/system_query.h b/v-0.07/system_query.h new file mode 100644 index 0000000..93fa8d3 --- /dev/null +++ b/v-0.07/system_query.h @@ -0,0 +1,65 @@ +//Header definition files to query about sound card properties (number of sinks, profiles...) +#ifndef SYSTEM_QUERY_H +#define SYSTEM_QUERY_H + +#include +#include +#include +#include + +//Structures to get source port information (e.g, line in, microphone...) +//Used by get_source_port_info, get_active_port, and get_source_ports. +typedef struct pa_port_info { + char *name; // Port name + char *description; // Port description + bool is_active; // Is this the active port +} pa_port_info; + +typedef struct pa_source_info_list { + pa_port_info *ports; // Array of ports + int num_ports; // Number of ports + bool done; // Indicates if the callback has been called +} pa_source_info_list; + +void print_proplist(const pa_proplist *p); // Utility function to print all properties in the proplist +uint32_t get_output_device_count(void); //Gets the number of output devices in the system. +uint32_t get_input_device_count(void); //Gets the number of input devices in the system. +uint32_t get_profile_count(uint32_t card_index); //Gets the number of profiles for a given soundcard. +pa_sink_info **get_available_output_devices(); //Gets the total available sinks (output devices) for this system. +pa_source_info **get_available_input_devices(); //Gets the total available sources (input devices) for this system. +const char* get_alsa_output_name(const char *sink_name); //Gets the corresponding alsa name of a pulseaudio sink (output device). +pa_source_info *get_input_device_by_name(const char *source_name); //Gets the corresponding alsa name of a pulseaudio source (input device). +pa_source_info_list* get_source_port_info(); //Returns which ports in the source are available (mic, line in...). +const char* get_alsa_input_name(const char *source_name); //Gets the corresponding alsa name of a pulseaudio source (input device). +char** get_input_channel_names(const char *alsa_id, int num_channels); //Returns the channel names of an input device. +char** get_output_channel_names(const char *sink_name, int num_channels); //Returns the channel names of an output device. + +int get_min_input_channels(const char *alsa_id, +const pa_source_info *source_info); //Gets the maximum output channels an ALSA card supports. + +int get_max_input_channels(const char *alsa_id, +const pa_source_info *source_info); //Gets the maximum output channels an ALSA card supports. + +int get_max_output_channels(const char *alsa_id, +const pa_sink_info *sink_info); //Gets the maximum output channels an ALSA card supports. + +int get_min_output_channels(const char *alsa_id, +const pa_sink_info *sink_info); //Gets the maximum output channels an ALSA card supports. + +const char* get_alsa_input_id(const char *source_name); //Gets the alsa input id based on the pulseaudio channel name. + +const char* get_alsa_output_id(const char *sink_name); //Gets the alsa output id based on the pulseaudio channel name. + +int get_output_sample_rate(const char *alsa_id, +const pa_sink_info *sink_info); //Gets the sample rate of a pulseaudio sink (output device). + +uint32_t get_input_sample_rate(const char *source_name); //Gets the sample rate of a pulseaudio source (input device). +pa_sink_info *get_output_device_by_name(const char *sink_name); //Gets output device by name. + +void delete_output_devices(pa_sink_info **sinks); //Releases memory for allocated output devices. +void delete_input_devices(pa_source_info **sources); //Releases memory for allocated input devices. +pa_volume_t get_channel_volume(const pa_sink_info *sink_info, +unsigned int channel_index); //Retrieves the volume of a given channel. + + +#endif From 231e7aa67af6b018fe4a7b84506d96acf730a2fd Mon Sep 17 00:00:00 2001 From: NMagic Date: Thu, 9 Nov 2023 19:29:25 -0300 Subject: [PATCH 11/20] ... More querying functions added, manager implemented, muting functionality implemented for output devices. --- v-0.08/Makefile | 20 + .../pa_context -- interface overview.docx | Bin 0 -> 33970 bytes .../pavucontrol sink update flow.txt | 41 + .../pulseaudio/introspect.c summary | 79 + .../pulseaudio/mainloop code flow.txt | 17 + v-0.08/easypulse_core.c | 458 ++++ v-0.08/easypulse_core.h | 86 + v-0.08/examples/Makefile | 19 + v-0.08/examples/alsa-mapper_pulseaudio-api | Bin 0 -> 97488 bytes v-0.08/examples/alsa-mapper_pulseaudio-api.c | 91 + v-0.08/examples/change-speaker-mode | Bin 0 -> 91352 bytes v-0.08/examples/change-speaker-mode.c | 94 + v-0.08/examples/error.txt | 103 + .../examples/get-card-profiles-pulseaudio_api | Bin 0 -> 94936 bytes .../get-card-profiles-pulseaudio_api.c | 63 + v-0.08/examples/mute_output_demo | Bin 0 -> 93576 bytes v-0.08/examples/mute_output_demo.c | 89 + v-0.08/examples/print-input-sources | Bin 0 -> 94744 bytes v-0.08/examples/print-input-sources.c | 92 + v-0.08/examples/print_volume_output_devices | Bin 0 -> 94256 bytes v-0.08/examples/print_volume_output_devices.c | 72 + v-0.08/examples/switch-sink | Bin 0 -> 91432 bytes v-0.08/examples/switch-sink-pulseaudio | Bin 0 -> 96544 bytes v-0.08/examples/switch-sink-pulseaudio.c | 62 + v-0.08/examples/switch-sink.c | 67 + v-0.08/examples/volume-change | Bin 0 -> 93408 bytes v-0.08/examples/volume-change-pulseaudio | Bin 0 -> 96384 bytes v-0.08/examples/volume-change-pulseaudio.c | 101 + v-0.08/examples/volume-change.c | 67 + v-0.08/libeasypulse_core.a | Bin 0 -> 33048 bytes v-0.08/system_query.c | 2211 +++++++++++++++++ v-0.08/system_query.h | 85 + 32 files changed, 3917 insertions(+) create mode 100644 v-0.08/Makefile create mode 100644 v-0.08/documentation/pa_context -- interface overview.docx create mode 100644 v-0.08/documentation/pavucontrol/pavucontrol sink update flow.txt create mode 100644 v-0.08/documentation/pulseaudio/introspect.c summary create mode 100644 v-0.08/documentation/pulseaudio/mainloop code flow.txt create mode 100644 v-0.08/easypulse_core.c create mode 100644 v-0.08/easypulse_core.h create mode 100644 v-0.08/examples/Makefile create mode 100755 v-0.08/examples/alsa-mapper_pulseaudio-api create mode 100644 v-0.08/examples/alsa-mapper_pulseaudio-api.c create mode 100755 v-0.08/examples/change-speaker-mode create mode 100644 v-0.08/examples/change-speaker-mode.c create mode 100644 v-0.08/examples/error.txt create mode 100755 v-0.08/examples/get-card-profiles-pulseaudio_api create mode 100644 v-0.08/examples/get-card-profiles-pulseaudio_api.c create mode 100755 v-0.08/examples/mute_output_demo create mode 100644 v-0.08/examples/mute_output_demo.c create mode 100755 v-0.08/examples/print-input-sources create mode 100644 v-0.08/examples/print-input-sources.c create mode 100755 v-0.08/examples/print_volume_output_devices create mode 100644 v-0.08/examples/print_volume_output_devices.c create mode 100755 v-0.08/examples/switch-sink create mode 100755 v-0.08/examples/switch-sink-pulseaudio create mode 100644 v-0.08/examples/switch-sink-pulseaudio.c create mode 100644 v-0.08/examples/switch-sink.c create mode 100755 v-0.08/examples/volume-change create mode 100755 v-0.08/examples/volume-change-pulseaudio create mode 100644 v-0.08/examples/volume-change-pulseaudio.c create mode 100644 v-0.08/examples/volume-change.c create mode 100644 v-0.08/libeasypulse_core.a create mode 100644 v-0.08/system_query.c create mode 100644 v-0.08/system_query.h diff --git a/v-0.08/Makefile b/v-0.08/Makefile new file mode 100644 index 0000000..b1c5107 --- /dev/null +++ b/v-0.08/Makefile @@ -0,0 +1,20 @@ +CC = gcc +CFLAGS = -Wall -g -Wextra + +LIB_NAME = easypulse_core +LIB_SRC = easypulse_core.c +LIB_OBJ = easypulse_core.o +LIB_OUT = lib$(LIB_NAME).a + +all: $(LIB_OUT) + +$(LIB_OUT): $(LIB_OBJ) + ar rcs $(LIB_OUT) $(LIB_OBJ) + +$(LIB_OBJ): $(LIB_SRC) + $(CC) $(CFLAGS) -c $(LIB_SRC) -o $(LIB_OBJ) + +clean: + rm -f $(LIB_OBJ) $(LIB_OUT) + +.PHONY: all clean diff --git a/v-0.08/documentation/pa_context -- interface overview.docx b/v-0.08/documentation/pa_context -- interface overview.docx new file mode 100644 index 0000000000000000000000000000000000000000..6cbe2d09c38dfcab843409c88d5b9d8666c90192 GIT binary patch literal 33970 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 literal 0 HcmV?d00001 diff --git a/v-0.08/documentation/pavucontrol/pavucontrol sink update flow.txt b/v-0.08/documentation/pavucontrol/pavucontrol sink update flow.txt new file mode 100644 index 0000000..9428de8 --- /dev/null +++ b/v-0.08/documentation/pavucontrol/pavucontrol sink update flow.txt @@ -0,0 +1,41 @@ ++----------------+ +| pavucontrol | +| (initial file)| ++----------------+ + | + | Callback function triggered when there's info/change related to a sink + V ++----------------+ +| sink_cb | +| (pavucontrol.cc)| ++----------------+ + | + | - If error, show error and return + | - If end-of-list (eol) is reached, decrease outstanding tasks count and return + | - Update GUI representation of a sink using w->updateSink() + V ++---------------------------+ +| MainWindow::updateSink | +| (mainwindow.cc & .h) | ++---------------------------+ + | + | - Retrieve or create SinkWidget for the sink + | - Update SinkWidget properties (e.g., volume, mute state, active port, etc.) + | - Prepare context menu for the sink + | - Ensure the sink is displayed correctly via updateDeviceVisibility + V ++-------------------------------------+ +| MainWindow::updateDeviceVisibility | +| (mainwindow.cc & .h) | ++-------------------------------------+ + | + | - If idle source/callback is already queued, return + | - Schedule the idle_cb function to be called when the app is idle + V ++----------------+ +| idle_cb | +| (mainwindow.cc)| ++----------------+ + | + V + ... (Specific steps and logic for updating device visibility) diff --git a/v-0.08/documentation/pulseaudio/introspect.c summary b/v-0.08/documentation/pulseaudio/introspect.c summary new file mode 100644 index 0000000..d9616f2 --- /dev/null +++ b/v-0.08/documentation/pulseaudio/introspect.c summary @@ -0,0 +1,79 @@ +* !pa_tagstruct_eof (context_string_callback): this function seems to be a callback function for processing string responses from the server. It examines the incoming command and checks for errors. If there's an error or if the command isn't a reply, it sets the success flag to 0 and prepares an empty response string. If the command is a reply, it extracts the response string from the tag structure. If there's any issue with extracting the string or if there's unexpected data in the tag structure, it flags a protocol error. + +* pa_context_stat: this function sends a simple command to request statistics. It leverages another function pa_context_send_simple_command and provides the context_stat_callback as the callback function to handle the response. It's used to retrieve statistical information. + +* pa_context_get_server_info: similar to the previous function, this function sends a command to get server information. It again uses pa_context_send_simple_command, but this time with a different callback, context_get_server_info_callback, to process the server information response. + +* context_get_sink_info_callback: this function is a callback that processes information about a sink. It first ensures that the operation and context are valid. If the received command is not a reply, it handles the error. If it is a reply, it starts parsing the sink information from the tag structure, extracting details like the sink's name, description, sample specification, channel map, owner module, volume, mute status, monitor source, latency, and more. The function seems to account for different versions of the context and extracts varying levels of information based on that. + +* pa_tagstruct_getu32: this function seems to be a snippet or part of another function and is possibly not a standalone function. It attempts to retrieve a 32-bit unsigned integer from a tag structure. If unsuccessful, it returns an error indicating a protocol issue. + +* pa_context_get_sink_info_list: this function sends a command to retrieve a list of sink information. It utilizes the pa_context_send_simple_command function and provides the context_get_sink_info_callback as the callback to process the list of sinks. + +* pa_context_get_sink_info_by_index: this function requests information about a specific sink identified by its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SINK_INFO) with the specified sink index and sends it to the server. The response from the server is expected to be handled by the context_get_sink_info_callback. + +* pa_context_get_sink_info_by_name: similar to the previous function, this one requests information about a sink, but it identifies the sink by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SINK_INFO) with the specified sink name to the server. The server's response will be processed by the context_get_sink_info_callback. + +* pa_context_set_sink_port_by_index: this function is designed to set the port for a specific sink identified by its index. After some validity checks, it builds a command (PA_COMMAND_SET_SINK_PORT) with the given sink index and port information, then sends this command to the server. The acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_sink_port_by_name: this function sets the port of a sink based on its name. It first performs some validation checks, then constructs a command with the sink's name and desired port. This command is sent to the PulseAudio server, and the response will be handled by a generic acknowledgment callback. + +* context_get_source_info_callback: this callback function processes information about a source. It starts by performing some initializations and checks. If the received command is a reply, it begins parsing the source information from the tag structure. This includes extracting details like the source's name, description, sample specification, volume, mute status, latency, and more. It appears to accommodate different versions of the context, extracting varying levels of information based on that. + +* pa_context_get_source_info_list: this function sends a command to retrieve a list of source information. It employs the pa_context_send_simple_command function, providing the context_get_source_info_callback as the callback to process the list of sources. + +* pa_context_get_source_info_by_index: this function retrieves information about a specific audio source based on its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source index and sends it to the server. The response from the server is expected to be handled by the context_get_source_info_callback. + +* pa_context_get_source_info_by_name: similar to the previous function, this one retrieves information about a source but identifies the source by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source name to the server. The server's response is again expected to be processed by the context_get_source_info_callback. + +* pa_context_set_source_port_by_index: this function sets the port of a specific source based on its index. After performing some validity checks and ensuring that the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source index. This command is sent to the server, and the acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_source_port_by_name: this function is designed to set the port of a specific audio source based on its name. It constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source name and sends this command to the PulseAudio server. The server's response will be handled by a generic acknowledgment callback. + +* context_get_client_info_callback: This callback function processes client-related information. It first performs checks to ensure the received command is a reply. If it is, the function begins parsing the client information, extracting details like client index, name, owner module, and driver. The function appears to be prepared to handle multiple client records in the same response and will loop through them until the end of the tag structure. + +* pa_context_get_client_info: this function requests information about a specific client based on its index. It constructs and sends a command (PA_COMMAND_GET_CLIENT_INFO) with the specified client index to the server. The server's response is expected to be processed by the context_get_client_info_callback. + +* pa_context_get_client_info_list: this function requests a list of client information from the PulseAudio server. It utilizes the pa_context_send_simple_command function and specifies the PA_COMMAND_GET_CLIENT_INFO_LIST command. The response from the server is expected to be handled by the context_get_client_info_callback. + + +* card_info_free: this is a utility function designed to free the memory associated with a pa_card_info structure. It releases memory for various properties and profiles associated with the card, such as its property list (proplist), profiles (profiles), and extended profile information (profiles2). + +* fill_card_port_info: this function populates the port information for a given card. It starts by extracting the number of ports (n_ports) for the card from a tag structure. If the card has ports, it then proceeds to fill in details about each port. If there's a protocol error while fetching the details, it returns an error. + +* fill_card_profile_info: this function is responsible for populating the profile information of a given card. It begins by allocating memory for the profiles and then proceeds to iterate through each profile, extracting details like name, description, number of sinks, number of sources, and priority. It also accounts for different versions of the context, fetching additional details if the version is >= 29. + + +* context_get_card_info_callback: this callback function processes card-related information. It starts by performing initialization checks and then examines the received command. If the command is a reply, the function starts parsing card details like index, name, owner module, driver, and the number of profiles. It then calls the fill_card_profile_info function to populate the profiles for the card. If there are any protocol errors during this process, the function handles them accordingly. + + +* pa_tagstruct_get_proplist: This function seems to be a snippet or a partial representation of a larger function. Its purpose appears to be to extract a property list (proplist) from a tag structure. If there's any issue during this extraction, it flags an error. + + +* pa_context_get_card_info_by_index: this function requests information about a specific card based on its index. After performing several validity checks, it constructs a command (PA_COMMAND_GET_CARD_INFO) with the specified card index and sends it to the server. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_by_name: similar to the previous function, this one requests information about a card, but it identifies the card by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_CARD_INFO) with the specified card name to the server. Again, the server's response is expected to be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_list: this function requests a list of all card information from the PulseAudio server. It employs the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_CARD_INFO_LIST command. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_set_card_profile_by_index: this function sets the profile of a specific card based on its index. After checking the validity of the context and ensuring the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the specified card index and desired profile. This command is sent to the server, and the response is handled by a generic acknowledgment callback. + +* pa_context_set_card_profile_by_name: this function sets the profile of a card identified by its name. Like the previous function, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the card name and desired profile, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_module_info_callback: this callback function processes module-related information. It checks if the received command is a reply and, if so, starts parsing the module details. This includes extracting details like the module's index, name, argument, and usage count. If there's an error or unexpected end of file in the tag structure, it flags a protocol error. + +* pa_context_get_module_info: this function retrieves information about a specific module based on its index. After conducting various validity checks, it constructs a command (PA_COMMAND_GET_MODULE_INFO) with the specified module index and sends it to the server. The response from the server will be processed by the context_get_module_info_callback. + +* pa_context_get_module_info_list: this function requests a list of all module information from the PulseAudio server. It uses the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_MODULE_INFO_LIST command. The server's response will be processed by the context_get_module_info_callback. + +* context_get_sink_input_info_callback: this callback function processes information related to sink inputs. It checks if the received command is a reply and, if so, starts parsing the sink input details. This includes extracting details like the sink input's index, name, owner module, client, sink, sample specification, channel map, volume, buffer usec, sink usec, resample method, driver, and more. It also accounts for different versions of the context, extracting varying levels of information based on that. + +* pa_context_set_source_output_volume: this function sets the volume of a specific source output based on its index. It starts by performing various checks, including verifying the validity of the provided volume. It then constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_VOLUME) with the specified source output index and volume and sends it to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_set_source_output_mute: this function mutes or unmutes a specific source output based on its index. It constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_MUTE) with the desired mute status and the source output index, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_sample_info_callback: this callback function processes sample-related information. It checks if the received command is a reply and, if so, begins parsing the sample details, extracting attributes like the sample's index, name, volume, mute status, proplist, and more. The function also handles possible protocol errors and is prepared to process multiple sample records in the same response. + +* pa_context_suspend_source_by_index: this function suspends or resumes a specific source based on its index. It verifies the server version, constructs a command (PA_COMMAND_SUSPEND_SOURCE) with the desired suspend status and source index, and then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_send_message_to_object: this function sends a message to a specific object within the PulseAudio server. After checking the server version and other conditions, it constructs a command (PA_COMMAND_SEND_OBJECT_MESSAGE) with the object's path, the message, and any additional parameters. The server's response will be processed by a callback function. diff --git a/v-0.08/documentation/pulseaudio/mainloop code flow.txt b/v-0.08/documentation/pulseaudio/mainloop code flow.txt new file mode 100644 index 0000000..f4c8b96 --- /dev/null +++ b/v-0.08/documentation/pulseaudio/mainloop code flow.txt @@ -0,0 +1,17 @@ ++---------------------------------------------+ +| Mainloop | +| | +| +--------------+ +-------------------+ | +| | I/O Events | | Timers | | +| +--------------+ +-------------------+ | +| | +| +--------------+ +-------------------+ | +| | Signals | | Deferred Callbacks| | +| +--------------+ +-------------------+ | +| | +| +---------------------+ | +| | Other Asynchronous | | +| | Tasks | | +| +---------------------+ | +| | ++---------------------------------------------+ diff --git a/v-0.08/easypulse_core.c b/v-0.08/easypulse_core.c new file mode 100644 index 0000000..6351b7c --- /dev/null +++ b/v-0.08/easypulse_core.c @@ -0,0 +1,458 @@ +/** + * @file easypulse_core.c + * @brief Implementation of the easypulse core functions. + * + * This file provides the core functionality to interact with PulseAudio, + * allowing operations like setting the default device and adjusting volume. + */ + +#include "easypulse_core.h" +#include "system_query.h" +#include +#include +#include +#include + +static bool manager_initialize(pulseaudio_manager *self); +static void iterate(pulseaudio_manager *manager, pa_operation *op); + +/** + * @brief Creates a new pulseaudio_manager instance. + * + * This function allocates memory for a new pulseaudio_manager instance and initializes it. + * It allocates memory for the output and input devices based on the current system state, + * and initializes the PulseAudio context and mainloop. It also sets the active output and + * input devices. + * + * If any memory allocation or initialization operation fails, the function cleans up any + * resources that were successfully allocated or initialized, and returns NULL. + * + * @return A pointer to the newly created pulseaudio_manager instance, or NULL if the + * creation failed. + */ +pulseaudio_manager *manager_create(void) { + pulseaudio_manager *self = malloc(sizeof(pulseaudio_manager)); + if (!self) { + fprintf(stderr, "Failed to allocate memory for pulseaudio_manager.\n"); + return NULL; + } + + // Zero-initialize the structure to set sensible defaults + memset(self, 0, sizeof(pulseaudio_manager)); + + // Initialize manager's PulseAudio main loop and context + if (!manager_initialize(self)) { + fprintf(stderr, "Failed to initialize pulseaudio_manager.\n"); + free(self); + return NULL; + } + + // Get the count of output and input devices + self->output_count = get_output_device_count(); + self->input_count = get_input_device_count(); + + // Allocate memory for outputs + if (self->output_count > 0) { + self->outputs = calloc(self->output_count, sizeof(pulseaudio_device)); + if (!self->outputs) { + fprintf(stderr, "Failed to allocate memory for outputs.\n"); + manager_cleanup(self); + return NULL; + } + // Retrieve and populate output devices + pa_sink_info **output_devices = get_available_output_devices(); + + for (uint32_t i = 0; i < self->output_count; ++i) { + self->outputs[i].index = output_devices[i]->index; + self->outputs[i].name = strdup(output_devices[i]->description); + self->outputs[i].code = strdup(output_devices[i]->name); + self->outputs[i].sample_rate = get_output_sample_rate(get_alsa_output_id(output_devices[i]->name), output_devices[i]); + self->outputs[i].max_channels = get_max_output_channels(get_alsa_output_id(output_devices[i]->name), output_devices[i]); + self->outputs[i].min_channels = get_min_output_channels(get_alsa_output_id(output_devices[i]->name), output_devices[i]); + self->outputs[i].channel_names = get_output_channel_names(output_devices[i]->name, self->outputs[i].max_channels); + // Add any additional fields to populate + } + free(output_devices); + } + + // Allocate memory for inputs + if (self->input_count > 0) { + self->inputs = calloc(self->input_count, sizeof(pulseaudio_device)); + if (!self->inputs) { + fprintf(stderr, "Failed to allocate memory for inputs.\n"); + manager_cleanup(self); + return NULL; + } + // Retrieve and populate input devices + pa_source_info **input_devices = get_available_input_devices(); + + for (uint32_t i = 0; i < self->input_count; ++i) { + self->inputs[i].index = input_devices[i]->index; + self->inputs[i].name = strdup(input_devices[i]->description); + self->inputs[i].code = strdup(input_devices[i]->name); + self->inputs[i].sample_rate = get_input_sample_rate(get_alsa_input_id(input_devices[i]->name), input_devices[i]); + self->inputs[i].max_channels = get_max_input_channels(get_alsa_input_id(input_devices[i]->name), input_devices[i]); + self->inputs[i].min_channels = get_min_input_channels(get_alsa_input_id(input_devices[i]->name), input_devices[i]); + self->inputs[i].channel_names = get_input_channel_names(input_devices[i]->name, self->inputs[i].max_channels); + // Add any additional fields to populate + } + free(input_devices); + } + + // Set the default output and input devices + self->active_output_device = strdup(get_default_output(self->context)); + self->active_input_device = strdup(get_default_input(self->context)); + + // Check that the active devices were set + if (!self->active_output_device || !self->active_input_device) { + fprintf(stderr, "Failed to set the active output or input device.\n"); + manager_cleanup(self); + return NULL; + } + + // Don't forget to clean up the temporary lists of devices after you're done with them + + return self; +} + + +/** + * @brief Callback function for handling PulseAudio context state changes. + * + * This callback is invoked by the PulseAudio mainloop when the context state changes. + * It updates the `pa_ready` flag in the pulseaudio_manager structure based on the + * context's state. The `pa_ready` flag is set to 1 when the context is ready, and + * to 2 when the context has failed or terminated. This callback will signal the + * mainloop to continue its operations whenever the state changes to either READY, + * FAILED, or TERMINATED. + * + * @param c Pointer to the PulseAudio context. + * @param userdata User-provided pointer to the pulseaudio_manager structure. + */ +static void manager_initialize_cb(pa_context *c, void *userdata) { + pa_context_state_t state; + pulseaudio_manager *manager = (pulseaudio_manager *) userdata; + int *pa_ready = &(manager->pa_ready); + pa_threaded_mainloop *m = manager->mainloop; + + state = pa_context_get_state(c); + switch (state) { + // There are other states you can handle, but these are the important ones + case PA_CONTEXT_CONNECTING: + case PA_CONTEXT_AUTHORIZING: + case PA_CONTEXT_SETTING_NAME: + default: + break; + case PA_CONTEXT_READY: + *pa_ready = 1; + pa_threaded_mainloop_signal(m, 0); + break; + case PA_CONTEXT_FAILED: + case PA_CONTEXT_TERMINATED: + *pa_ready = 2; + pa_threaded_mainloop_signal(m, 0); + break; + } +} + + +/** + * @brief Initializes the PulseAudio manager. + * + * This function sets up the PulseAudio threaded mainloop and context for the given manager. + * It creates the mainloop, context, and connects to the PulseAudio server, then starts + * the mainloop and waits for the context to be ready. It also sets up a state callback + * to handle the context state changes. + * + * @param self Pointer to the pulseaudio_manager structure to be initialized. + * @return Returns true if initialization is successful, false otherwise. + * + * @note The function will clean up allocated resources and return false if any step + * of the initialization fails. + */ +static bool manager_initialize(pulseaudio_manager *self) { + // 1. Create the threaded mainloop + self->mainloop = pa_threaded_mainloop_new(); + if (!self->mainloop) { + return false; + } + + // Get the mainloop API + pa_mainloop_api *mlapi = pa_threaded_mainloop_get_api(self->mainloop); + + // Create the context + self->context = pa_context_new(mlapi, "PulseAudio Manager"); + if (!self->context) { + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // Set the state callback + pa_context_set_state_callback(self->context, manager_initialize_cb, self); + + // Lock the mainloop and connect the context + pa_threaded_mainloop_lock(self->mainloop); + + if (pa_context_connect(self->context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) { + pa_threaded_mainloop_unlock(self->mainloop); + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // 2. Start the threaded mainloop + pa_threaded_mainloop_start(self->mainloop); + + // 4. Wait for the context to be ready + while (self->pa_ready == 0) { + pa_threaded_mainloop_wait(self->mainloop); + } + + pa_threaded_mainloop_unlock(self->mainloop); + + if (self->pa_ready == 2) { + return false; + } + + return true; +} + +/** + * Cleans up and frees all resources associated with a pulseaudio_manager object. + * This function ensures that all memory allocated for output and input devices + * within the manager is released. It includes freeing of all associated strings, + * channel names, and profile data. Additionally, it shuts down and frees the + * PulseAudio context and mainloop, if they have been initialized. + * + * @param manager A pointer to the pulseaudio_manager object to be cleaned up. + * If the pointer is NULL, the function does nothing. + */ +void manager_cleanup(pulseaudio_manager *manager) { + if (manager) { + // Free output devices + if (manager->outputs) { + for (uint32_t i = 0; i < manager->output_count; ++i) { + free(manager->outputs[i].code); + free(manager->outputs[i].name); + free(manager->outputs[i].alsa_id); + if (manager->outputs[i].channel_names) { + for (int j = 0; j < manager->outputs[i].max_channels; ++j) { + free(manager->outputs[i].channel_names[j]); + } + free(manager->outputs[i].channel_names); + } + if (manager->outputs[i].profiles) { + for (uint32_t j = 0; j < manager->outputs[i].profile_count; ++j) { + free((char*)manager->outputs[i].profiles[j].name); + free((char*)manager->outputs[i].profiles[j].description); + } + free(manager->outputs[i].profiles); + } + } + free(manager->outputs); // Finally free the array itself + } + + // Free input devices + if (manager->inputs) { + for (uint32_t i = 0; i < manager->input_count; ++i) { + free(manager->inputs[i].code); + free(manager->inputs[i].name); + free(manager->inputs[i].alsa_id); + if (manager->inputs[i].channel_names) { + for (int j = 0; j < manager->inputs[i].max_channels; ++j) { + free(manager->inputs[i].channel_names[j]); + } + free(manager->inputs[i].channel_names); + } + if (manager->inputs[i].profiles) { + for (uint32_t j = 0; j < manager->inputs[i].profile_count; ++j) { + free((char*)manager->inputs[i].profiles[j].name); + free((char*)manager->inputs[i].profiles[j].description); + } + free(manager->inputs[i].profiles); + } + } + free(manager->inputs); // Finally free the array itself + } + + // Free the names of active output and input devices + free(manager->active_output_device); + free(manager->active_input_device); + + // Disconnect and unreference the context if it's there + if (manager->context) { + // Check if the context is in a state that can be disconnected + if (pa_context_get_state(manager->context) == PA_CONTEXT_READY) { + pa_context_disconnect(manager->context); + } + pa_context_unref(manager->context); + } + + // Stop and free the mainloop if it's there + if (manager->mainloop) { + pa_threaded_mainloop_stop(manager->mainloop); + pa_threaded_mainloop_free(manager->mainloop); + } + + // Free the manager itself + free(manager); + } +} + + + + +/** + * @brief Iterates through operations in the pulseaudio_manager. + * + * @param manager Pointer to the pulseaudio_manager instance. + * @param op Pointer to the pa_operation instance. + */ +static void iterate(pulseaudio_manager *manager, pa_operation *op) { + //Leaves if operation is invalid. + if (!op) return; + + bool is_in_mainloop_thread = pa_threaded_mainloop_in_thread(manager->mainloop); + + // If we're not in the mainloop thread, lock it. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_lock(manager->mainloop); + } + + //Wait for the operation to complete. + //The signaling to continue is performed inside the callback operation (op). + pa_threaded_mainloop_wait(manager->mainloop); + + //Cleaning up. + pa_operation_unref(op); + + // If we locked the mainloop earlier, unlock it now. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_unlock(manager->mainloop); + } +} + +/** + * @brief Callback function for setting master volume on a device. + * + * This function is called when the asynchronous operation to set the volume + * for a sink completes. It will signal the mainloop to stop waiting. + * + * @param c The PulseAudio context. + * @param success Non-zero if the operation succeeded, zero if it failed. + * @param userdata The userdata passed to the function, a pointer to the pulseaudio_manager. + */ +void manager_set_master_volume_cb(pa_context *c, int success, void *userdata) { + (void) c; + + pulseaudio_manager *manager = (pulseaudio_manager *)userdata; + + // Check if the operation was successful + if (success) { + printf("Volume set successfully.\n"); + } else { + printf("Failed to set volume.\n"); + } + + // Signal the mainloop to stop waiting + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + +/** + * @brief Sets the master volume of a given device. + * + * This function sets the master volume of a device specified by its PulseAudio ID. + * + * @param manager Pointer to the pulseaudio_manager instance. + * @param device_id The PulseAudio ID of the device. + * @param volume The new volume level to set. This should be a value between 0 (mute) and 100 (maximum volume). + * @return 0 if the operation was successful, or a non-zero error code if the operation failed. + */ +/** + * @brief Sets the master volume of a given device. + * + * This function sets the master volume of a device specified by its PulseAudio ID. + * + * @param manager Pointer to the pulseaudio_manager instance. + * @param device_id The PulseAudio ID of the device. + * @param volume The new volume level to set. This should be a value between 0 (mute) and 100 (maximum volume). + * @return 0 if the operation was successful, or a non-zero error code if the operation failed. + */ +int manager_set_master_volume(pulseaudio_manager *manager, uint32_t device_id, int volume) { + if (!manager) { + fprintf(stderr, "Manager is NULL\n"); + return -1; + } + + if(volume < 0 || volume > 100) { + fprintf(stderr, "[manager_set_master_volume] The volume specified is out of range (0-100).\n"); + return -1; + } + + // Fetch the sink information for the device ID + const pa_sink_info *sink_info = get_output_device_by_index(device_id); + if (!sink_info) { + fprintf(stderr, "Could not retrieve sink info for device ID %u\n", device_id); + return -1; + } + + // Calculate the PA volume from the provided percentage + pa_volume_t pa_volume = (pa_volume_t) ((double) volume / 100.0 * PA_VOLUME_NORM); + + // Initialize a pa_cvolume structure and set the volume for all channels + pa_cvolume cvolume; + pa_cvolume_set(&cvolume, sink_info->channel_map.channels, pa_volume); + + // Start the asynchronous operation to set the sink volume + pa_operation *op = pa_context_set_sink_volume_by_index(manager->context, device_id, &cvolume, manager_set_master_volume_cb, manager); + if (!op) { + fprintf(stderr, "Failed to start volume set operation\n"); + return -1; + } + + // Wait for the operation to complete + iterate(manager, op); + + return 0; +} + +// Callback function to handle mute toggling completion +static void manager_toggle_output_mute_cb(pa_context *c, int success, void *userdata) { + (void) c; + + pulseaudio_manager *manager = (pulseaudio_manager *) userdata; + if (!success) { + fprintf(stderr, "Failed to toggle mute state.\n"); + } + + // Signal the mainloop to continue + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + + +/** + * Toggle the mute state of a given output device. + * + * @param manager A pointer to the initialized pulseaudio_manager instance. + * @param index The index of the output device to toggle mute state. + * @param state The desired mute state (1 for ON/mute, 0 for OFF/unmute). + * @return Returns 0 on success, -1 on failure. + */ +int manager_toggle_output_mute(pulseaudio_manager *manager, uint32_t index, int state) { + + if (!manager || !manager->context) { + fprintf(stderr, "Invalid PulseAudio manager or context.\n"); + return -1; + } + + if (index >= manager->output_count) { + fprintf(stderr, "Output device index out of range.\n"); + return -1; + } + + pa_operation *op = pa_context_set_sink_mute_by_index(manager->context, + index, state, manager_toggle_output_mute_cb, manager); + + iterate(manager, op); + + return 0; +} diff --git a/v-0.08/easypulse_core.h b/v-0.08/easypulse_core.h new file mode 100644 index 0000000..c9b9bcf --- /dev/null +++ b/v-0.08/easypulse_core.h @@ -0,0 +1,86 @@ +/** + * @file core.h + * @brief EasyPulse Library Header. + * + * EasyPulse is a library designed to provide pseudo-object oriented programming + * functions to simplify access to PulseAudio. + */ + +#ifndef EASPYPULSE_CORE_H +#define EASPYPULSE_CORE_H +#include +#define DEBUG_MODE 0 // Debug mode flag + +#include +#include "system_query.h" +#include +#include +#include + +// Forward declarations +typedef struct pulseaudio_manager pulseaudio_manager; +typedef struct pulseaudio_device pulseaudio_device; +typedef struct pulseaudio_volume pulseaudio_volume; + + +typedef struct { + char *name; // Name of the profile + char *description; // Description of the profile + uint32_t channels; // Number of channels this profile has +} pulseaudio_profile; + +//Internal volume information. +typedef struct _internal_volume { + uint32_t index; + char *code; //Pulseaudio name of the volume. + pa_cvolume *volume; //Volume representation. + pa_channel_map *cmap; //Channel map representation. + +} internal_volume; + +/** + * @brief Represents a PulseAudio device. + */ +struct pulseaudio_device { + uint32_t index; // Index of the device. + char *code; // Pulseaudio name of the device. + char *name; // Pulseaudio description of the device. + char *alsa_id; // Alsa ID of the device. + int sample_rate; // Current sample rate of the device. + pa_card_profile_info *active_profile; // Active alsa profile of this device. + char **channel_names; // Public channel names. + int master_volume; // Average volume of all channels (in percentage). + int *channel_volume; // Volume of each individual channel (in percentage). + bool mute; // Mute status of the devices (true for muted, false for unmuted). + int min_channels; // The minimum number of channels of the device. + int max_channels; // The maximum number of channels of the device. + pa_card_profile_info *profiles; // Array of available profiles for the device + uint32_t profile_count; // Number of available profiles +}; + +/** + * @brief Represents the main manager for PulseAudio operations. + */ +struct pulseaudio_manager { + pa_threaded_mainloop *mainloop; // Mainloop for PulseAudio operations. + pa_context *context; // PulseAudio context. + pulseaudio_device *outputs; // Array of available output devices. + pulseaudio_device *inputs; // Array of available input devices. + int pa_ready; // Indicates if PulseAudio is ready (1 for ready, 2 for error). + int devices_loaded; // Indicates if devices are loaded (0 for not loaded, 1 for loaded successfully, 2 for error). + char *active_output_device; // Pointer to active output device. + char *active_input_device; // Pointer to active input device. + uint32_t output_count; // Number of pulseaudio sinks (outputs). + uint32_t input_count; // Number of pulseaudio sources (inputs). +}; + +pulseaudio_manager *manager_create(void); +void manager_cleanup(pulseaudio_manager *manager); //Cleans up the manager. + +int manager_set_master_volume(pulseaudio_manager *manager, +uint32_t device_id, int volume); //Sets the master volume of a given volume. + +int manager_toggle_output_mute(pulseaudio_manager *manager, +uint32_t index, int state); //Toggles the volume to muted / unmuted. + +#endif // CORE_H diff --git a/v-0.08/examples/Makefile b/v-0.08/examples/Makefile new file mode 100644 index 0000000..6f11288 --- /dev/null +++ b/v-0.08/examples/Makefile @@ -0,0 +1,19 @@ +CC = gcc +CFLAGS = -Wall -Wextra -g -O0 + +LIB_DIR = ../ +LIB_SRC = $(LIB_DIR)*.c + +EXAMPLES_DIR = . +EXAMPLES_SRC = $(wildcard $(EXAMPLES_DIR)/*.c) +EXAMPLES_OUT = $(patsubst $(EXAMPLES_DIR)/%.c,$(EXAMPLES_DIR)/%,$(EXAMPLES_SRC)) + +all: $(EXAMPLES_OUT) + +$(EXAMPLES_DIR)/%: $(EXAMPLES_DIR)/%.c + $(CC) $(CFLAGS) $< $(LIB_SRC) -o $@ -lpulse -lasound + +clean: + rm -f $(EXAMPLES_DIR)/*~ $(EXAMPLES_OUT) + +.PHONY: all clean diff --git a/v-0.08/examples/alsa-mapper_pulseaudio-api b/v-0.08/examples/alsa-mapper_pulseaudio-api new file mode 100755 index 0000000000000000000000000000000000000000..a26390471ec967944d010d2986678f8a1f125b74 GIT binary patch literal 97488 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 B88rX^ literal 0 HcmV?d00001 diff --git a/v-0.08/examples/alsa-mapper_pulseaudio-api.c b/v-0.08/examples/alsa-mapper_pulseaudio-api.c new file mode 100644 index 0000000..47eb39b --- /dev/null +++ b/v-0.08/examples/alsa-mapper_pulseaudio-api.c @@ -0,0 +1,91 @@ +/** + * @file pulseaudio_alsa_mapper.c + * @brief Demonstrates how to map PulseAudio sinks to their corresponding ALSA device names. + */ + +#include +#include +#include +#include + +static const char* get_alsa_friendly_name(int card_num) { + snd_ctl_t *ctl; + char name[128]; + snprintf(name, sizeof(name), "hw:%d", card_num); + + if (snd_ctl_open(&ctl, name, 0) < 0) { + return NULL; + } + + snd_ctl_card_info_t *info; + snd_ctl_card_info_alloca(&info); + if (snd_ctl_card_info(ctl, info) < 0) { + snd_ctl_close(ctl); + return NULL; + } + + const char *friendly_name = strdup(snd_ctl_card_info_get_name(info)); + snd_ctl_close(ctl); + return friendly_name; +} + +static void sink_info_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) userdata; + + if (eol > 0) { + pa_context_disconnect(c); + return; + } + + const char *udev_description = pa_proplist_gets(info->proplist, "device.description"); + const char *card_str = pa_proplist_gets(info->proplist, "alsa.card"); + const char *device_str = pa_proplist_gets(info->proplist, "alsa.device"); + + int card_num = card_str ? atoi(card_str) : -1; + const char *friendly_name = card_num != -1 ? get_alsa_friendly_name(card_num) : NULL; + + if (udev_description && card_str && device_str) { + printf("Sink: %s, UDEV description: %s, ALSA name: hw:%s,%s", info->name, udev_description, card_str, device_str); + if (friendly_name) { + printf(", Friendly ALSA name: %s", friendly_name); + free((void*)friendly_name); + } + printf("\n"); + } else if (udev_description) { + printf("Sink: %s, UDEV description: %s, Incomplete ALSA name information.\n", info->name, udev_description); + } +} + +static void context_state_cb(pa_context *c, void *userdata) { + switch (pa_context_get_state(c)) { + case PA_CONTEXT_READY: + pa_context_get_sink_info_list(c, sink_info_cb, NULL); + break; + case PA_CONTEXT_FAILED: + case PA_CONTEXT_TERMINATED: + pa_mainloop_quit((pa_mainloop*)userdata, 0); + break; + default: + break; + } +} + +int main(void) { + pa_mainloop *mainloop; + pa_mainloop_api *mainloop_api; + pa_context *context; + + mainloop = pa_mainloop_new(); + mainloop_api = pa_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "udev_description_fetcher"); + + pa_context_set_state_callback(context, context_state_cb, mainloop); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + + pa_mainloop_run(mainloop, NULL); + + pa_context_unref(context); + pa_mainloop_free(mainloop); + + return 0; +} diff --git a/v-0.08/examples/change-speaker-mode b/v-0.08/examples/change-speaker-mode new file mode 100755 index 0000000000000000000000000000000000000000..f51724e8f7c3c5928a0e11b0aedc2600abd618ff GIT binary patch literal 91352 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 literal 0 HcmV?d00001 diff --git a/v-0.08/examples/change-speaker-mode.c b/v-0.08/examples/change-speaker-mode.c new file mode 100644 index 0000000..9bfc03d --- /dev/null +++ b/v-0.08/examples/change-speaker-mode.c @@ -0,0 +1,94 @@ +/** + * @file sample_program.c + * @brief PulseAudio Mode Selector + * + * This program is designed to manage the audio mode of the active PulseAudio sink. + * + * The program performs the following tasks: + * - Initializes the PulseAudio manager. + * - Detects and displays the current mode of the active device. + * - Lists audio modes supported by the active device based on its number of channels. + * - Prompts the user to select a desired mode from the list. + * - Sets the active device to the mode selected by the user. + * + * The available modes include: mono, stereo, 4.0, 5.0, 5.1, and 7.1. The program lists + * modes dynamically, ensuring that only those supported by the active device are presented. + * + * @date 10-15-2023 (creation date) + */ + +#if 0 +#include "../easypulse_core.h" +#include + +int main(void) { + // Initialize the pulseaudio_manager + pulseaudio_manager *manager = new_manager(); + //pulseaudio_manager *self = manager; + + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudio manager.\n"); + return 1; + } + + + // Detect the current mode of the active device + const char* current_mode = manager->get_device_mode_by_code(manager, manager->active_device->code); + printf("Current mode of the active device (%s): %s\n", manager->active_device->code, current_mode); + + // List available modes based on the number of channels of the active device + printf("\nAvailable modes:\n"); + printf("1. mono\n"); + printf("2. stereo\n"); + + int max_choice = 2; // To keep track of the maximum mode choice number + uint32_t channels = manager->active_device->number_of_channels; + + if (channels >= 4) { + printf("3. 4.0\n"); + max_choice = 3; + } + if (channels >= 5) { + printf("4. 5.0\n"); + max_choice = 4; + } + if (channels >= 6) { + printf("5. 5.1\n"); + max_choice = 5; + } + if (channels >= 8) { + printf("6. 7.1\n"); + max_choice = 6; + } + + // Prompt the user to select a mode + printf("\nEnter the number corresponding to the desired mode: "); + int choice; + scanf("%d", &choice); + + if (choice < 1 || choice > max_choice) { + printf("Invalid choice.\n"); + manager->destroy(self); + return 1; + } + + const char* mode_choices[] = {"mono", "stereo", "4.0", "5.0", "5.1", "7.1"}; + const char* mode_to_set = mode_choices[choice - 1]; + + // Set the mode of the active device + if (manager->set_device_mode_by_code(manager, manager->active_device->code, mode_to_set)) { + printf("Mode set to %s successfully!\n", mode_to_set); + } else { + fprintf(stderr, "Failed to set the mode.\n"); + } + + // Cleanup + manager->destroy(self); + return 0; + +} +#endif + +int main(void) { + return 0; +} diff --git a/v-0.08/examples/error.txt b/v-0.08/examples/error.txt new file mode 100644 index 0000000..edb3387 --- /dev/null +++ b/v-0.08/examples/error.txt @@ -0,0 +1,103 @@ +Operation state at cycle 0: 0 +Operation state at cycle 1: 0 +Operation state at cycle 2: 0 +Operation state at cycle 3: 0 +Operation state at cycle 4: 0 +Operation state at cycle 5: 0 +Operation state at cycle 6: 0 +Operation state at cycle 7: 0 +Operation state at cycle 8: 0 +Operation state at cycle 9: 0 +Operation state at cycle 10: 0 +Operation state at cycle 11: 0 +Operation state at cycle 12: 0 +Operation state at cycle 13: 0 +Operation state at cycle 14: 0 +Operation state at cycle 15: 0 +Operation state at cycle 16: 0 +Operation state at cycle 17: 0 +Operation state at cycle 18: 0 +Operation state at cycle 19: 0 +Operation state at cycle 20: 0 +Operation state at cycle 21: 1 +Operation state at cycle 0: 0 +Operation state at cycle 1: 0 +Operation state at cycle 2: 0 +Operation state at cycle 3: 0 +Operation state at cycle 4: 0 +Operation state at cycle 5: 0 +Operation state at cycle 6: 0 +Operation state at cycle 7: 0 +Operation state at cycle 8: 0 +Operation state at cycle 9: 0 +Operation state at cycle 10: 0 +Operation state at cycle 11: 0 +Operation state at cycle 12: 0 +Operation state at cycle 13: 0 +Operation state at cycle 14: 0 +Operation state at cycle 15: 0 +Operation state at cycle 16: 0 +Operation state at cycle 17: 0 +Operation state at cycle 18: 0 +Operation state at cycle 19: 0 +Operation state at cycle 20: 0 +Operation state at cycle 21: 0 +Operation state at cycle 22: 0 +Operation state at cycle 23: 0 +Operation state at cycle 24: 0 +Operation state at cycle 25: 0 +Operation state at cycle 26: 0 +Operation state at cycle 27: 0 +Operation state at cycle 28: 0 +Operation state at cycle 29: 0 +Operation state at cycle 30: 0 +Operation state at cycle 31: 0 +Operation state at cycle 32: 0 +Operation state at cycle 33: 0 +Operation state at cycle 34: 0 +Operation state at cycle 35: 0 +Operation state at cycle 36: 0 +Operation state at cycle 37: 0 +Operation state at cycle 38: 0 +Operation state at cycle 39: 0 +Operation state at cycle 40: 0 +Operation state at cycle 41: 0 +Operation state at cycle 42: 0 +Operation state at cycle 43: 0 +Operation state at cycle 44: 0 +Operation state at cycle 45: 0 +Operation state at cycle 46: 0 +Operation state at cycle 47: 0 +Operation state at cycle 48: 0 +Operation state at cycle 49: 0 +Operation state at cycle 50: 0 +Operation state at cycle 51: 0 +Operation state at cycle 52: 0 +Operation state at cycle 53: 0 +Operation state at cycle 54: 0 +Operation state at cycle 55: 0 +Operation state at cycle 56: 0 +Operation state at cycle 57: 0 +Operation state at cycle 58: 0 +Operation state at cycle 59: 0 +Operation state at cycle 60: 0 +Operation state at cycle 61: 1 +Operation state at cycle 0: 0 +Operation state at cycle 1: 0 +Operation state at cycle 2: 0 +Operation state at cycle 3: 0 +Operation state at cycle 4: 0 +Operation state at cycle 5: 0 +Operation state at cycle 6: 0 +Operation state at cycle 7: 0 +Operation state at cycle 8: 0 +Operation state at cycle 9: 0 +Operation state at cycle 10: 0 +Operation state at cycle 11: 0 +Operation state at cycle 12: 0 +Operation state at cycle 13: 0 +Operation state at cycle 14: 0 +Operation state at cycle 15: 0 +Operation state at cycle 16: 0 +Operation state at cycle 17: 0 +Assertion '!m->thread || !pa_thread_is_running(m->thread) || !in_worker(m) || pa_atomic_load(&m->in_once_unlocked)' failed at ../pulseaudio/src/pulse/thread-mainloop.c:179, function pa_threaded_mainloop_lock(). Aborting. diff --git a/v-0.08/examples/get-card-profiles-pulseaudio_api b/v-0.08/examples/get-card-profiles-pulseaudio_api new file mode 100755 index 0000000000000000000000000000000000000000..d1089d1dafa1695eea0c4bd9ca442dad757faf4b GIT binary patch literal 94936 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 +#include "../easypulse_core.h" + +int main(void) { + // Query the total number of PulseAudio devices + uint32_t total_devices = get_output_device_count(); + + printf("Total sound devices in this computer:%lu\n", (unsigned long) total_devices); + printf("Available PulseAudio sound devices:\n"); + + pa_sink_info **sink_info = get_available_output_devices(); + if (!sink_info) { + fprintf(stderr, "Error: Could not retrieve sound device information.\n"); + return 1; + } + + for (uint32_t i = 0; i < total_devices; i++) { + if (!sink_info[i]) { + fprintf(stderr, "Error: sound device information at index %u is NULL.\n", i); + continue; + } + + // Display sink name + printf("\n- Sound device name: %s\n", sink_info[i]->name ? sink_info[i]->name : "NULL"); + printf("\n- Sound device description: %s\n", sink_info[i]->description ? sink_info[i]->description : "NULL"); + + // Query and display the number of profiles + uint32_t profile_count = get_profile_count(i); + printf(" - Number of profiles: %u\n", profile_count); + + // Get and display the ALSA name + const char *alsa_name = get_alsa_output_name(sink_info[i]->name); + const char *alsa_id = get_alsa_output_id(sink_info[i]->name); + int sample_rate = get_output_sample_rate(alsa_id, sink_info[i]); + + printf(" - Sample rate: %i\n", sample_rate); + printf("\n- Alsa ID is: %s\n", alsa_id ? alsa_id : "NULL"); + + if (alsa_name) { + printf(" - ALSA name: %s\n", alsa_name); + } else { + printf(" - No corresponding ALSA name found.\n"); + } + // Get and display the minimum and maximum channels + int min_channels = get_min_output_channels(alsa_id, sink_info[i]); + int max_channels = get_max_output_channels(alsa_id, sink_info[i]); + + if(min_channels > 0) printf(" - Minimum channels: %d\n", min_channels); + if(max_channels > 0) printf(" - Maximum channels: %d\n", max_channels); + free((char *)alsa_name); // Free the memory allocated for alsa_name + } + + delete_output_devices(sink_info); + return 0; +} diff --git a/v-0.08/examples/mute_output_demo b/v-0.08/examples/mute_output_demo new file mode 100755 index 0000000000000000000000000000000000000000..1c8e3054255236523ed1c683d1309209626905d0 GIT binary patch literal 93576 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 literal 0 HcmV?d00001 diff --git a/v-0.08/examples/mute_output_demo.c b/v-0.08/examples/mute_output_demo.c new file mode 100644 index 0000000..1d427ed --- /dev/null +++ b/v-0.08/examples/mute_output_demo.c @@ -0,0 +1,89 @@ +/** + * @file main.c + * @brief Demonstration program using PulseAudio to list output devices and toggle mute state. + * + * This program lists all available output devices (sinks) managed by PulseAudio, checks + * if they are currently muted, and allows the user to select a device to toggle its mute state. + * The program uses the `easypulse_core` library to interact with the PulseAudio server. + * + * Usage: + * Run the program, and it will display a list of available output devices along with their + * mute status. The user can then input the index of the device they wish to toggle. The program + * will then change the mute state of the selected device. + * + * @note This program is a simple demonstration and does not handle all edge cases and errors + * that could arise in a full-featured application. + * + * Example Output: + * ``` + * Available output devices: + * 0: Device 1 (Muted: No) + * 1: Device 2 (Muted: Yes) + * Enter the index of the device you want to toggle the mute state for: + * ``` + * + * @author Mbyte2 + * @date 09-11-2023 + */ +#include +#include +#include "../easypulse_core.h" +#include "../system_query.h" + +// Forward declaration of the toggle_output_mute function +int toggle_output_mute(pulseaudio_manager *manager, uint32_t index, int state); + +int main() { + // Initialize the PulseAudio manager + pulseaudio_manager *manager = manager_create(); + if (!manager) { + fprintf(stderr, "Failed to create the PulseAudio manager.\n"); + return 1; + } + + // Display available output devices + printf("\n***TOGGLING MUTE / UNMUTE DEMO***\n\nAvailable output devices:\n"); + for (uint32_t i = 0; i < manager->output_count; i++) { + const char *device_name = manager->outputs[i].name; + int is_muted = get_muted_output_status(manager->outputs[i].code); + printf("%d: %s (muted: %s)\n", (i+1), device_name, is_muted == 1 ? "yes" : "no"); + } + + // Ask the user for the device index to toggle mute state + printf("\nEnter the index of the device you want to toggle the mute state for: "); + uint32_t index; + if (scanf("%u", &index) != 1) { + fprintf(stderr, "Invalid input.\n"); + manager_cleanup(manager); + return 1; + } + + // Check if the index is within range + if (index >= manager->output_count) { + fprintf(stderr, "Index out of range.\n"); + manager_cleanup(manager); + return 1; + } + + // Get the current mute state + int current_mute_state = get_muted_output_status(manager->outputs[index-1].code); + if (current_mute_state == -1) { + fprintf(stderr, "Error getting the current mute state.\n"); + manager_cleanup(manager); + return 1; + } + + // Toggle the mute state of the selected sink + int new_mute_state = !current_mute_state; + if (manager_toggle_output_mute(manager, (index-1), new_mute_state) != 0) { + fprintf(stderr, "Failed to toggle the mute state.\n"); + manager_cleanup(manager); + return 1; + } + + printf("The mute state of '%s' has been %s.\n", manager->outputs[index-1].name, new_mute_state ? "muted" : "unmuted"); + + // Clean up + manager_cleanup(manager); + return 0; +} diff --git a/v-0.08/examples/print-input-sources b/v-0.08/examples/print-input-sources new file mode 100755 index 0000000000000000000000000000000000000000..ca0f955bd366e93e8af8126f76a1d51d7d563d3e GIT binary patch literal 94744 zcmeEvd3;pW`S(3@=O&Y7GLwB{8CC-bhD8i08kXQdL4yLKs1P6_QApB|uv9=4u*4Vz zs}{FkajCV|g{oD=EhrkaYEjYRQcGRhiBOwbYpGT9e!u6Odvhmb6z%(a|9C%)=AQE` z=Xsv=DASKc;c2A))>XQ>+R5D?53LjUvNu6dMDK{ze?=Ui{g7 zUCaF*5b?1~p8^dNCEMk&(oNYzp$)sVwXyc$N=b}MzeuH_`nZs{Lt~TD@_?lBxxxN1d=_(a1DC&%htu&h|^1t>T%p$6fK8m$&`v zwM;_@PR=h@E;wItm;!AH@J?7IUdl~@~{YgXz z(xOoknv83A_`6_mcle#q+a3Os7;^4|;ob2+A4ATgG4y(3$f5JPlm9mGeY@#zSq%Qv z82+h_VNahJ_^KFk_Ql{gW8k;O@Ml&GKeWf_*Y9HR|09Op_hXF9)ENExQw%v9W8lkT z$j^x(e@+bi{22b38AESM4F8Od!OzLpU0k)rz#kU_|7r|7Ju&*VECzo<4F0cT@DGf^ z|7nbP7#;(^H3t6C82ud^L+^+f_>*J!e{l@Gt7F6u*Uu3Cx_-9C;GZ1B{uwd!4vAs^ zZ87BhBZl5_G4Mbep{~XQK0XHiQQ*6a&y6wcpAp0U-ZAX?O7<(o_;-J06y@?W5pq(E zT*G)!!S?>bm^W|n(wgdd%j(PO>gUZf=1rM7ecqz-y7I+U%j(PPW=@~Dq^7!jX4!%z z<%-rVrM7HdePvyF*`o4A^OlxXRWGTjshzi^X5qyKC^fa^b!GKcP|{FcS6)HX!pgGh z>hdM?YHOBNNlJaqyxO|*`ubHcq^_!ZF`15(SXHf&-IJHq*VJ}TSzKN}udKF8s;;T7 zFJDMX0)YjG1(%^Xz zwM>fER>Eq64!sIPURGb;y*wErvbA<04O>>zP`9wWd!H<-TDGtT5NBrj~uD?7#}%E6?Nq?oTS6* z$R;bws-zn_XT#C;tE9TnYz_Nu4%a<*4h)`AS z01l_bIFVxuTDYWUS^1I7m=ixLuc_#c!0Di-ai>N{2_tQu3?*AZCyAC;)YL64tM5iE z+u35Vl&tKArL1~YH`wTgRn=J77OpItS5bx8ggzKc5o|RJfyKdLpd%yID9@HjNp@WTZ%LYxh|`vAPr3jX&qE$#E$&IY|MQ%d zk@!eFPisHbxK+okz#YzO{2VYplu)Z_A;7hl+y=-r?sw>x(X8p@�>M8?gEjjZ2rX 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 literal 0 HcmV?d00001 diff --git a/v-0.08/examples/print-input-sources.c b/v-0.08/examples/print-input-sources.c new file mode 100644 index 0000000..09fedfa --- /dev/null +++ b/v-0.08/examples/print-input-sources.c @@ -0,0 +1,92 @@ +#include +#include "../system_query.h" + +int main() { + + char *alsa_name = NULL; + int min_channels = 0; + int max_channels = 0; + char *alsa_id = NULL; + + // Get all available input devices + pa_source_info **input_devices = get_available_input_devices(); + if (input_devices == NULL) { + fprintf(stderr, "Failed to get input devices\n"); + // Normally we would clean up here, but no cleanup function is available + return 1; + } + + // Output the number of input devices + uint32_t input_device_count = get_input_device_count(); + printf("Number of input devices: %u\n", input_device_count); + + // Iterate over each input device, print its name and sample rate + for (uint32_t i = 0; input_devices[i] != NULL; ++i) { + + + pa_source_info *source_info = input_devices[i]; + alsa_id = get_alsa_input_id(source_info->name); + + //printf("[DEBUG, main()] alsa_id is, %s\n", alsa_id); + + min_channels = get_min_input_channels(alsa_id, source_info); + max_channels = get_max_input_channels(alsa_id, source_info); + alsa_name = get_alsa_input_name(source_info->name); + + printf(" - Input Device %u:\n", (i +1)); + printf(" - Pulseaudio ID: %s\n", source_info->name); + printf(" - Pulseaudio name: %s\n", source_info->description); + + uint32_t sample_rate = get_input_sample_rate(alsa_id, source_info); + printf(" - Sample Rate: %u Hz\n", sample_rate); + + if ((alsa_name) && (alsa_id)) { + printf(" - Alsa name: %s\n", alsa_name); + printf(" - Alsa id: %s\n", alsa_id); + free(alsa_name); + free(alsa_id); + } + else { + printf(" [!] Unable to find an alsa name and ID.\n"); + printf(" [!] This is probably a pulseaudio-only virtual device.\n"); + } + + if(min_channels > 0) printf(" - Minimum channels: %i\n", min_channels); + if(max_channels > 0) printf(" - Maximum channels: %i\n\n", max_channels); + + //Reset channels for now. + min_channels = 0; + max_channels = 0; + } + + // Clean up all input devices + delete_input_devices(input_devices); + + + #if 0 + // Using the get_source_port_info function to get port information + pa_source_info_list* source_ports_info = get_source_port_info(); + + if (source_ports_info == NULL) { + fprintf(stderr, "Failed to get source port information\n"); + // Cleanup would go here + return 1; + } + + // Iterate over the source ports and print information about active and available ports + printf("Available source ports:\n"); + for (int i = 0; i < source_ports_info->num_ports; ++i) { + pa_port_info *port_info = &source_ports_info->ports[i]; + printf(" Port name: %s\n", port_info->name); + printf(" Port description: %s\n", port_info->description); + printf(" Port status: %s\n", port_info->is_active ? "active" : "inactive"); + } + + // Remember to free the source_ports_info structure after use + // Note: This assumes that the 'ports' array and its contents are dynamically allocated + free(source_ports_info->ports); + free(source_ports_info); + #endif + + return 0; +} diff --git a/v-0.08/examples/print_volume_output_devices b/v-0.08/examples/print_volume_output_devices new file mode 100755 index 0000000000000000000000000000000000000000..4f11b2fcf1e00df6515e3bf0c2b38e703e1be061 GIT binary patch literal 94256 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

G6zIKH|) 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≤8y*P9oab!dU94e{o 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 Bd+z`M literal 0 HcmV?d00001 diff --git a/v-0.08/examples/print_volume_output_devices.c b/v-0.08/examples/print_volume_output_devices.c new file mode 100644 index 0000000..bfa1b9b --- /dev/null +++ b/v-0.08/examples/print_volume_output_devices.c @@ -0,0 +1,72 @@ +/** + * @file print_volume_output_devices.c + * @brief This file contains the main function to demonstrate the retrieval + * of volume % of each individual audio channel of an output device with the PulseAudio API. + * + * volume-demo.c lists the available audio sinks, their ALSA IDs, sample rates, and + * channel volumes. This file assumes the presence of a system_query.h header + * file and related implementations for interacting with the PulseAudio system. + */ + +#include "../system_query.h" +#include + +/** + * @brief Main function which queries and displays audio device information. + * + * The function initializes necessary structures for PulseAudio (done in system_query.c), + * retrieves the count of available devices, and iterates through each device + * to display its details, including the ALSA ID, sample rate, and channel volumes. + * + * @return int Returns 0 on successful execution, 1 on failure (e.g., no sinks available). + */ +int main() { + // Initialize any necessary PulseAudio structures + + // Get the count of available devices + uint32_t device_count = get_output_device_count(); + printf("Total devices: %u\n", device_count); + + // Get all available sinks + pa_sink_info **sinks = get_available_output_devices(); + if (sinks == NULL) { + printf("No sinks available.\n"); + return 1; + } + + + // Iterate through each sink + for (uint32_t i = 0; i < device_count; ++i) { + if (sinks[i] == NULL) { + continue; + } + + char **channel_names = NULL; + + printf(" Device %u: %s\n", i, sinks[i]->description); + + // Get the ALSA ID for the sink + const char *alsa_id = get_alsa_output_id(sinks[i]->name); + printf("\tALSA ID: %s\n", alsa_id); + + // Get the sample rate for the sink + int sample_rate = get_output_sample_rate(alsa_id, sinks[i]); + printf("\tSample Rate: %d Hz\n", sample_rate); + + channel_names = get_output_channel_names(sinks[i]->name, sinks[i]->channel_map.channels); + + // Iterate through each channel + for (uint8_t ch = 0; ch < sinks[i]->channel_map.channels; ++ch) { + pa_volume_t volume = get_channel_volume(sinks[i], ch); + float volume_percent = (float)volume / PA_VOLUME_NORM * 100; + printf("\tChannel %u name: %s, volume: %.2f%%\n", (ch + 1), channel_names[ch], volume_percent); + free(channel_names[ch]); + } + free(channel_names); + } + + // Cleanup + delete_output_devices(sinks); + + return 0; +} diff --git a/v-0.08/examples/switch-sink b/v-0.08/examples/switch-sink new file mode 100755 index 0000000000000000000000000000000000000000..3f9b4eecbbf12285ded509b4f151143b561372ef GIT binary patch literal 91432 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¼*7UA6p!Uw!O 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 I!S~hrf8T-Swg3PC literal 0 HcmV?d00001 diff --git a/v-0.08/examples/switch-sink-pulseaudio.c b/v-0.08/examples/switch-sink-pulseaudio.c new file mode 100644 index 0000000..0a0c85a --- /dev/null +++ b/v-0.08/examples/switch-sink-pulseaudio.c @@ -0,0 +1,62 @@ +#include +#include +#include +#include + +static pa_threaded_mainloop *mainloop; +static pa_context *context; +static int sink_count = 0; +static char **sink_names = NULL; + +void sink_list_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + (void) userdata; + if (eol > 0) { + int chosen; + printf("Enter the number of the sink to set as default: "); + scanf("%d", &chosen); + + if (chosen >= 0 && chosen < sink_count) { + pa_context_set_default_sink(c, sink_names[chosen], NULL, NULL); + } + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + sink_names = realloc(sink_names, sizeof(char*) * (sink_count + 1)); + sink_names[sink_count] = strdup(info->name); + printf("%d: %s (%s)\n", sink_count++, info->name, info->description); +} + +void context_state_cb(pa_context *c, void *userdata) { + (void) userdata; + + if (pa_context_get_state(c) == PA_CONTEXT_READY) { + pa_operation_unref(pa_context_get_sink_info_list(c, sink_list_cb, NULL)); + } +} + +int main(void) { + mainloop = pa_threaded_mainloop_new(); + pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "sink_switcher_threaded"); + + pa_context_set_state_callback(context, context_state_cb, NULL); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + pa_threaded_mainloop_start(mainloop); + + pa_threaded_mainloop_lock(mainloop); + pa_threaded_mainloop_wait(mainloop); // Wait until sink_list_cb signals completion + + for (int i = 0; i < sink_count; i++) { + free(sink_names[i]); + } + free(sink_names); + + pa_context_disconnect(context); + pa_context_unref(context); + pa_threaded_mainloop_unlock(mainloop); + pa_threaded_mainloop_stop(mainloop); + pa_threaded_mainloop_free(mainloop); + return 0; +} diff --git a/v-0.08/examples/switch-sink.c b/v-0.08/examples/switch-sink.c new file mode 100644 index 0000000..6f4111b --- /dev/null +++ b/v-0.08/examples/switch-sink.c @@ -0,0 +1,67 @@ +/** + * Demo Code: PulseAudio Sink Switcher + * + * This demonstration code showcases the functionality of switching audio sinks + * using the PulseAudio API. It initializes the PulseAudio manager, loads available + * audio sinks, prompts the user to select a sink, and then switches to the chosen sink. + * + * Note: Ensure the PulseAudio server is running and in a good state before executing. + */ +#include "../easypulse_core.h" +#include +#include + +#if 0 +int main() { + // Initialize the PulseAudio Manager + pulseaudio_manager *manager = new_manager(); + pulseaudio_manager *self = manager; + + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudioManager.\n"); + manager->destroy(self); + return 1; + } + + // Display available devices to the user + printf("Available Sinks:\n"); + for (uint32_t i = 0; i < manager->device_count; i++) { + printf("%d. %s - %s\n", i + 1, manager->devices[i].code, manager->devices[i].description); + } + + // Prompt the user to select a device + printf("Enter the number of the sink you want to switch to: "); + uint32_t choice; + scanf("%d", &choice); + + + // Validate the user's choice + if (choice < 1 || choice > manager->device_count) { + fprintf(stderr, "Invalid choice.\n"); + manager->destroy(self); + return 1; + } + + + // Switch to the selected device + if (manager->switch_device(manager, choice - 1)) { + printf("Successfully switched to the selected device.\n"); + + // Debug code to print the default device after the switch + fprintf(stderr, "[DEBUG]: Default device after switch: %s\n", manager->active_device->code); + } + else { + fprintf(stderr, "Failed to switch to the selected device.\n"); + return 1; + } + + // Cleanup + manager->destroy(self); + + return 0; +} +#endif + +int main(void) { + return 0; +} diff --git a/v-0.08/examples/volume-change b/v-0.08/examples/volume-change new file mode 100755 index 0000000000000000000000000000000000000000..90656331ec212efe6c319ba0d7d8d61adfc8992e GIT binary patch literal 93408 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 NRVB{_Dg-XA{|i5ADSQ9` literal 0 HcmV?d00001 diff --git a/v-0.08/examples/volume-change-pulseaudio b/v-0.08/examples/volume-change-pulseaudio new file mode 100755 index 0000000000000000000000000000000000000000..8c984c092df5d95a40c4843b9d3c22df34e9dfc0 GIT binary patch literal 96384 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�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 Tbd#(9H>PFFQ@#$qkH-H42xC~( literal 0 HcmV?d00001 diff --git a/v-0.08/examples/volume-change-pulseaudio.c b/v-0.08/examples/volume-change-pulseaudio.c new file mode 100644 index 0000000..aa629ab --- /dev/null +++ b/v-0.08/examples/volume-change-pulseaudio.c @@ -0,0 +1,101 @@ +/** + * @file volume-change-pulseaudio.c + * @brief Change the volume of the default PulseAudio sink. + * + * This program prompts the user for a desired volume level, displays the current volume + * of the default sink, sets the volume of the default sink to the user's input, and then + * displays the volume after the change. + */ + +#include +#include +#include + +static pa_threaded_mainloop *mainloop; +static pa_context *context; + +/** + * @brief Callback function to set the volume of the default sink. + * + * This function fetches the current volume of the default sink, displays it, + * then prompts the user for a desired volume level, sets the volume, and finally + * displays the volume after the change. + * + * @param c The PulseAudio context. + * @param info Information about the current sink. + * @param eol End-of-list flag. + * @param userdata User data (unused). + */ +void set_volume_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + (void) userdata; + + if (eol > 0) { + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + // Prompt the user for the desired volume level first + int volume_percentage; + printf("Enter the desired volume (0-100): "); + scanf("%d", &volume_percentage); + + // Display the current volume percentage + int volume_percentage_before = (int)(100.0f * pa_cvolume_avg(&info->volume) / PA_VOLUME_NORM + 0.5); + printf("Volume before change: %d%%\n", volume_percentage_before); + + // Set the volume based on user input + pa_cvolume volume; + pa_cvolume_set(&volume, info->channel_map.channels, (volume_percentage * PA_VOLUME_NORM) / 100); + pa_context_set_sink_volume_by_index(c, info->index, &volume, NULL, NULL); + + // Display the volume after the change + int volume_percentage_after = (int)(100.0f * pa_cvolume_avg(&volume) / PA_VOLUME_NORM + 0.5); + printf("Volume after change: %d%%\n", volume_percentage_after); + + pa_threaded_mainloop_signal(mainloop, 0); +} + +/** + * @brief Callback function for context state changes. + * + * This function checks if the context is ready and then triggers the retrieval + * of the default sink's information. + * + * @param c The PulseAudio context. + * @param userdata User data (unused). + */ +void context_state_cb(pa_context *c, void *userdata) { + (void) c; + (void) userdata; + + if (pa_context_get_state(c) == PA_CONTEXT_READY) { + pa_operation_unref(pa_context_get_sink_info_by_name(c, "@DEFAULT_SINK@", set_volume_cb, NULL)); + } +} + +int main(void) { + // Initialize PulseAudio threaded mainloop and context + mainloop = pa_threaded_mainloop_new(); + pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "volume_changer_threaded"); + + // Set context state callback and connect the context + pa_context_set_state_callback(context, context_state_cb, NULL); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + + // Start the threaded mainloop + pa_threaded_mainloop_start(mainloop); + + // Lock the mainloop and wait for operations to complete + pa_threaded_mainloop_lock(mainloop); + pa_threaded_mainloop_wait(mainloop); + + // Cleanup and free resources + pa_context_disconnect(context); + pa_context_unref(context); + pa_threaded_mainloop_unlock(mainloop); + pa_threaded_mainloop_stop(mainloop); + pa_threaded_mainloop_free(mainloop); + return 0; +} diff --git a/v-0.08/examples/volume-change.c b/v-0.08/examples/volume-change.c new file mode 100644 index 0000000..013d39d --- /dev/null +++ b/v-0.08/examples/volume-change.c @@ -0,0 +1,67 @@ +/** + * @file volume-change.c + * @brief PulseAudio Manager demo program + * + * This program demonstrates the usage of the PulseAudio Manager API. + * It creates a manager instance, lists the available output devices, + * asks the user to select one of the output devices and to enter a master volume. + * It then sets the master volume of the selected output device to the given value. + * + * @author mbyte-2 + * @date 11-07-2023 + */ +#include +#include "../easypulse_core.h" // Assuming this is the header file where your API is defined + +int main() { + // Create a manager instance + pulseaudio_manager *manager = manager_create(); + if (!manager) { + fprintf(stderr, "Failed to create manager.\n"); + return 1; + } + + // List the outputs + printf("Available output devices:\n"); + for (uint32_t i = 0; i < get_output_device_count(); ++i) { + printf("%d: %s\n", (i+1), manager->outputs[i].name); + } + + // Ask the user to select one of the outputs + uint32_t selected_output; + printf("Please enter the number of the output device you want to use: "); + scanf("%u", &selected_output); + + // Check if the selected output is valid + if ((selected_output - 1) >= get_output_device_count()) { + fprintf(stderr, "Invalid output device number.\n"); + manager_cleanup(manager); + return 1; + } + + // Ask the user to type a master volume + int master_volume; + printf("Please enter the master volume (0-100): "); + scanf("%d", &master_volume); + + // Check if the master volume is valid + if (master_volume < 0 || master_volume > 100) { + fprintf(stderr, "Invalid master volume. It should be between 0 and 100.\n"); + manager_cleanup(manager); + return 1; + } + + // Set the master volume to the given value + if (manager_set_master_volume(manager, (selected_output -1), master_volume) != 0) { + fprintf(stderr, "Failed to set master volume.\n"); + manager_cleanup(manager); + return 1; + } + + printf("Master volume for output device '%s' has been set to %d.\n", manager->outputs[(selected_output-1)].name, master_volume); + + // Clean up + manager_cleanup(manager); + + return 0; +} diff --git a/v-0.08/libeasypulse_core.a b/v-0.08/libeasypulse_core.a new file mode 100644 index 0000000000000000000000000000000000000000..90cb2add42d026d0945ea3313760d717527a13c9 GIT binary patch literal 33048 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 literal 0 HcmV?d00001 diff --git a/v-0.08/system_query.c b/v-0.08/system_query.c new file mode 100644 index 0000000..e9b842e --- /dev/null +++ b/v-0.08/system_query.c @@ -0,0 +1,2211 @@ +#include "system_query.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include // Include this for the isdigit() function + +// Since pulseaudio uses callbacks, we need something that will allow us to share data +// between functions. +typedef struct { + pa_threaded_mainloop *mainloop; + pa_mainloop_api *mainloop_api; + pa_context *context; +} _shared_data_1; + +static _shared_data_1 shared_data_1; + +// Structure to share data between get_alsa_name and its callback. +typedef struct { + char *alsa_name; + char *alsa_id; +} _shared_data_2; + +static _shared_data_2 shared_data_2 = {.alsa_name = NULL}; + + +// Structure to share data between get_available_output_devices and its callback. +typedef struct { + pa_sink_info **sinks; // An array of pointers to pa_sink_info + uint32_t count; +} _shared_data_3; + +static _shared_data_3 shared_data_3; + +// Structure to share data between get_profiles and its callback. +typedef struct { + pa_card_profile_info *profiles; + int num_profiles; +} _shared_data_4; + +_shared_data_4 shared_data_4 = {NULL, 0}; + +// Structure to share data between get_available_input_devices and its callback. +static struct { + pa_source_info **sources; // Array of pointers to pa_source_info structures + uint32_t count; // Count of available sources + uint32_t allocated; // Allocated size of the sources array +} shared_data_sources = {NULL, 0, 0}; + + +static void pulse_cleanup(void); +static bool is_pulse_initialized(void); +static void get_output_device_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata); +static void get_profile_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata); + +// Utility function to print all properties in the proplist +void print_proplist(const pa_proplist *p) { + void *state = NULL; + const char *key; + while ((key = pa_proplist_iterate(p, &state))) { + const char *value = pa_proplist_gets(p, key); + if (value) { + printf("%s = %s\n", key, value); + } else { + printf("%s = \n", key); + } + } +} + +/** + * @brief Iterates through operations in the pulseaudio threaded loop. + * + * @param loop Pointer to the threaded loop instance. + * @param op Pointer to the pa_operation instance. + */ +static void iterate(pa_operation *op) { + //fprintf(stderr, "[DEBUG] Entering %s\n", __FUNCTION__); // Debug statement for entry + + //Leaves if operation is invalid. + if (!op) { + fprintf(stderr, "[DEBUG] Operation is NULL\n"); // Debug statement for NULL operation + return; + } + + bool is_in_mainloop_thread = pa_threaded_mainloop_in_thread(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Is in mainloop thread: %d\n", is_in_mainloop_thread); // Debug statement for thread check + + // If we're not in the mainloop thread, lock it. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_lock(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Mainloop locked\n"); // Debug statement for mainloop locked + } + + //Wait for the operation to complete. + //The signaling to continue is performed inside the callback operation (op). + while (pa_operation_get_state(op) == PA_OPERATION_RUNNING) { + pa_threaded_mainloop_wait(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Waiting in mainloop...\n"); // Debug message while waiting + } + + //Debug code if needed. + #if 0 + // Check the operation state after waiting + switch (pa_operation_get_state(op)) { + case PA_OPERATION_DONE: + fprintf(stderr, "[DEBUG] Operation completed successfully\n"); // Debug message for successful completion + break; + case PA_OPERATION_CANCELLED: + fprintf(stderr, "[DEBUG] Operation was cancelled\n"); // Debug message for cancellation + break; + case PA_OPERATION_RUNNING: // This case should not be possible after the wait + default: + fprintf(stderr, "[DEBUG] Operation is in an unexpected state: %d\n", pa_operation_get_state(op)); // Debug message for unexpected state + break; + } + #endif + + //Cleaning up. + pa_operation_unref(op); + //fprintf(stderr, "[DEBUG] Operation unreferenced and cleaned up\n"); // Debug statement for cleanup + + // If we locked the mainloop earlier, unlock it now. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Mainloop unlocked\n"); // Debug statement for mainloop unlocked + } + + //fprintf(stderr, "[DEBUG] Exiting %s\n", __FUNCTION__); // Debug statement for exit +} + + +/** + * @brief Callback function to handle changes in PulseAudio context state. + * + * This function is triggered whenever the state of the PulseAudio context changes. + * It signals the mainloop to continue execution whenever the context is in a READY, FAILED, + * or TERMINATED state. + * + * @param c Pointer to the PulseAudio context. + * @param userdata Pointer to the data shared with the main function, which contains the mainloop. + */ +static void context_state_cb(pa_context *c, void *userdata) { + (void) userdata; + pa_context_state_t state = pa_context_get_state(c); + + // If the context is in a READY, FAILED, or TERMINATED state, signal the mainloop to continue. + if (state == PA_CONTEXT_READY || state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } +} + +/** + * @brief Utility function to check if PulseAudio is initialized and in a READY state. + * + * This function checks the state of the PulseAudio context and other key PulseAudio resources + * to determine if PulseAudio has been successfully initialized and is in a READY state. + * + * @return True if PulseAudio is initialized and in a READY state, false otherwise. + */ +static bool is_pulse_initialized(void) { + + + // Check if the main components of PulseAudio (mainloop, mainloop_api, and context) are initialized. + if (shared_data_1.mainloop && shared_data_1.mainloop_api && shared_data_1.context) { + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + + // If the context is in a READY state, PulseAudio is initialized. + if (state == PA_CONTEXT_READY) { + return true; + } + } + return false; +} + +/** + * @brief Initializes the PulseAudio mainloop and context for querying audio information. + * + * This function sets up the necessary PulseAudio components for subsequent queries + * to the audio subsystem. It creates a new threaded mainloop, obtains the mainloop API, + * and creates a new context with a specified name. It also starts the mainloop and + * connects the context to the PulseAudio server, waiting until the context is ready + * or an error occurs. + * + * @note If this function fails at any point, it ensures that all allocated resources are + * cleaned up before returning. + * + * @return true if the PulseAudio components were initialized successfully, false otherwise. + */ +bool initialize_pulse() { + shared_data_1.mainloop = pa_threaded_mainloop_new(); + if (!shared_data_1.mainloop) { + fprintf(stderr, "Failed to create mainloop.\n"); + return false; + } + + shared_data_1.mainloop_api = pa_threaded_mainloop_get_api(shared_data_1.mainloop); + if (!shared_data_1.mainloop_api) { + fprintf(stderr, "Failed to get mainloop API.\n"); + pa_threaded_mainloop_free(shared_data_1.mainloop); + return false; + } + + shared_data_1.context = pa_context_new(shared_data_1.mainloop_api, "Easypulse query API"); + if (!shared_data_1.context) { + fprintf(stderr, "Failed to create context.\n"); + pa_threaded_mainloop_free(shared_data_1.mainloop); + return false; + } + + + pa_context_set_state_callback(shared_data_1.context, context_state_cb, shared_data_1.mainloop); + + // Start the threaded mainloop + pa_threaded_mainloop_start(shared_data_1.mainloop); + + // Lock the mainloop and connect the context + pa_threaded_mainloop_lock(shared_data_1.mainloop); + if (pa_context_connect(shared_data_1.context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + pulse_cleanup(); + return false; + } + + // Wait for the context to be ready + while (true) { + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + if (state == PA_CONTEXT_READY) { + break; + } else if (state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + pulse_cleanup(); + return false; + } + pa_threaded_mainloop_wait(shared_data_1.mainloop); + } + + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + return true; +} + + +/** + * @brief Cleanup function to properly disconnect and free PulseAudio resources. + * + * This function ensures that all the PulseAudio resources are properly disconnected, + * dereferenced, and freed to avoid any resource leaks. It should be called whenever + * PulseAudio operations are done and the program wishes to terminate or release PulseAudio. + */ +static void pulse_cleanup(void) { + if (shared_data_1.context) { + // Check if the context is in a state where it can be disconnected + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + if (state == PA_CONTEXT_READY) { + pa_context_disconnect(shared_data_1.context); + } + pa_context_unref(shared_data_1.context); + shared_data_1.context = NULL; + } + if (shared_data_1.mainloop) { + pa_threaded_mainloop_free(shared_data_1.mainloop); + shared_data_1.mainloop = NULL; + } +} + +/** + * @brief Callback function used to retrieve the count of audio profiles for a specific card. + * + * This function is called by PulseAudio when querying for the list of profiles for a given card index. + * It sets the profile_count with the number of profiles available for the card. + * If there's an error or the list is exhausted, the function signals the mainloop to continue + * without further processing. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current card information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function, which contains the mainloop + * and the profile_count to be set. + */ +static void get_profile_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + + uint32_t *profile_count = (uint32_t *) userdata; + + // Handle errors in retrieving profile count. + if (eol < 0) { + fprintf(stderr, "Failed to get profile count.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // If we've reached the end of the list of profiles, signal the mainloop to continue. + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Set the profile_count with the number of profiles available for the card. + *profile_count = i->n_profiles; +} + + +/** + * @brief Retrieve the count of audio profiles for a specific card. + * + * This function queries PulseAudio to get a count of all available audio profiles + * for a specified card index. If PulseAudio is not initialized, the function attempts + * to initialize it. If there's an error in fetching the profile count or initializing + * PulseAudio, it returns UINT32_MAX. + * + * @param card_index The index of the card for which to retrieve the profile count. + * @return Count of audio profiles or UINT32_MAX on error. + */ +uint32_t get_profile_count(uint32_t card_index) { + uint32_t profile_count = 0; // Initialize profile count to zero. + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "get_profiles_count(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails. + } + } + + // Query PulseAudio for the list of audio profiles for the specified card. + // The callback get_profile_count_cb will populate the profile_count variable. + count_op = pa_context_get_card_info_by_index(shared_data_1.context, card_index, get_profile_count_cb, &profile_count); + + // Wait for the PulseAudio operation to complete. + iterate(count_op); + + return profile_count; // Return the total count of profiles. +} + +/** + * @brief Callback function used to populate the list of available audio sinks. + * + * This function is called for each audio sink found by PulseAudio when querying + * for the list of sinks. The function populates the `shared_sink_data` structure + * with `pa_sink_info` for each sink. When the list is exhausted or there's an error, + * the function exits without further processing. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio sink information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function. + */ +static void get_available_output_devices_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + (void) userdata; + + uint32_t *count = &shared_data_3.count; + + // Handle errors in retrieving sink information. + if (eol < 0) { + fprintf(stderr, "Failed to get sink info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // If we've reached the end of the list of sinks, mark the end and exit the callback. + if (eol > 0) { + shared_data_3.sinks[*count] = NULL; // Set the last element to NULL as sentinel + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Allocate memory for the pa_sink_info structure. + shared_data_3.sinks[*count] = malloc(sizeof(pa_sink_info)); + if (shared_data_3.sinks[*count] == NULL) { + fprintf(stderr, "Failed to allocate memory for sink info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Copy the pa_sink_info structure. + *(shared_data_3.sinks[*count]) = *i; + + // Duplicate the strings to ensure they remain valid. + if (i->name != NULL) { + shared_data_3.sinks[*count]->name = strdup(i->name); + } + if (i->description != NULL) { + shared_data_3.sinks[*count]->description = strdup(i->description); + } + + (*count)++; +} + +/** + * @brief Retrieve the list of available audio sinks for a specific card. + * + * This function queries PulseAudio to get a list of all available audio sinks + * for a specified card index. It dynamically allocates memory based on the count + * of sinks to store the list of sinks. + * If PulseAudio is not initialized, the function attempts to initialize it. + * + * @param card_index The index of the card for which to retrieve the sinks. + * @return Pointer to the first sink in the list or NULL on error. + */ +pa_sink_info **get_available_output_devices() { + pa_operation *op = NULL; + + // Using get_output_device_count() to obtain the number of sinks + uint32_t max_sinks = get_output_device_count(); + + // Allocate memory for pointers + shared_data_3.sinks = malloc((max_sinks + 1) * sizeof(pa_sink_info*)); + shared_data_3.count = 0; // Reset count + + // Check for successful memory allocation + if (!shared_data_3.sinks) { + fprintf(stderr, "Failed to allocate memory for sinks.\n"); + return NULL; + } + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_available_output_devices(): failed to initialize pulseaudio.\n"); + free(shared_data_3.sinks); + shared_data_3.sinks = NULL; + return NULL; + } + } + + + // Query PulseAudio for the list of available sinks for the specified card + op = pa_context_get_sink_info_list(shared_data_1.context, get_available_output_devices_cb, NULL); + + // Wait for the PulseAudio operation to complete + iterate(op); + + return shared_data_3.sinks; +} + +/** + * @brief Frees the memory allocated for an array of output devices (sinks). + * + * This function iterates over an array of `pa_sink_info` pointers, freeing the memory for + * each sink's name and description strings, followed by the sink structure itself. It concludes + * by freeing the memory for the array of pointers. + * + * @param sinks A pointer to the first element in an array of `pa_sink_info` pointers, which + * must be terminated with a NULL pointer. If NULL is passed, the function does nothing. + */ +void delete_output_devices(pa_sink_info **sinks) { + if (sinks == NULL) { + return; + } + + for (int i = 0; sinks[i] != NULL; ++i) { + if (sinks[i]->name) { + free((char*)sinks[i]->name); + } + if (sinks[i]->description) { + free((char*)sinks[i]->description); + } + free(sinks[i]); + } + + free(sinks); +} + +/** + * @brief Frees the memory allocated for an array of input devices (sources). + * + * This function iterates over an array of `pa_source_info` pointers, freeing the memory for + * each source's name and description strings, followed by the source structure itself. It concludes + * by freeing the memory for the array of pointers. + * + * @param sources A pointer to the first element in an array of `pa_source_info` pointers, which + * must be terminated with a NULL pointer. If NULL is passed, the function does nothing. + */ +void delete_input_devices(pa_source_info **sources) { + if (!sources) { + return; // Nothing to do if the pointer is NULL + } + + // Iterate through each source info and free its memory + for (int i = 0; sources[i] != NULL; i++) { + if (sources[i]->name) { + free((char*)sources[i]->name); + } + if (sources[i]->description) { + free((char*)sources[i]->description); + } + free(sources[i]); + } + + // Free the array of pointers itself + free(sources); +} + + +/** + * @brief Callback function used to count the available audio devices (cards). + * + * This function is called for each audio device found by PulseAudio when querying + * for the list of devices. The function increments the device_count for each device. + * When the list is exhausted or there's an error, it signals the mainloop to continue. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio device information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function. + */ +static void get_output_device_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + (void) i; + + uint32_t *device_count = (uint32_t *) userdata; + + if (eol < 0) { + // Handle error + //fprintf(stderr,"[DEBUG, get_output_device_count_cb()] Reached elo < 0. Signal triggered.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + if (eol > 0) { + // End of list + //fprintf(stderr,"[DEBUG, get_output_device_count_cb()] Reached elo > 0. Signal triggered.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + ++(*device_count); +} + + + +/** + * @brief Retrieve the count of audio devices in the system. + * + * This function queries PulseAudio to get a count of all available audio devices (cards). + * If PulseAudio is not initialized, the function attempts to initialize it. If the initialization + * fails or there's an error in fetching the device count, it returns UINT32_MAX. + * + * @return Count of audio devices or UINT32_MAX on error. + */ +uint32_t get_output_device_count(void) { + uint32_t device_count = 0; // Initialize device count to zero. + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "get_device_count(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails. + } + } + + // Check if context is valid after initialization attempt. + if (!shared_data_1.context) { + fprintf(stderr, "Context is NULL in get_device_count.\n"); + return UINT32_MAX; + } + + //fprintf(stderr,"[get_device_count()] context is, %p\n",&shared_data_1.context); + //fprintf(stderr,"[get_device_count()] mainloop is, %p\n",&shared_data_1.mainloop); + + // Query PulseAudio for the list of audio devices (cards). + // The callback get_device_count_cb will increment the device_count for each device found. + count_op = pa_context_get_card_info_list(shared_data_1.context, get_output_device_count_cb, &device_count); + + // Wait for the PulseAudio operation to complete. + iterate(count_op); + + return device_count; // Return the total count of devices. +} + +/** + * @brief Retrieves the minimum number of channels for the given ALSA device name. + * + * This function opens the specified ALSA device in capture mode, retrieves + * its hardware parameters, and then queries for the minimum number of channels + * supported by the device. + * + * @param alsa_name Name of the ALSA device. + * @return Minimum number of channels supported by the device or -1 on error. + */ +int get_min_input_channels(const char *alsa_id, const pa_source_info *source_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int min_channels = 0; + int err; + + if ((!alsa_id) && (!source_info)) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + //The input device was found, but there's no alsa information about it. + //Attempt to retrieve used channels instead. + else if((!alsa_id) && (source_info)) { + return source_info->sample_spec.channels; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK)) < 0) { + fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return source_info->sample_spec.channels; // Return channels from PulseAudio if ALSA fails + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return source_info->sample_spec.channels; + } + + if ((err = snd_pcm_hw_params_get_channels_min(params, &min_channels)) < 0) { + fprintf(stderr, "Error getting min channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return source_info->sample_spec.channels; + } + + snd_pcm_close(handle); + return min_channels; +} + + +/** + * @brief Retrieves the maximum number of channels for the given ALSA device name. + * + * This function opens the specified ALSA device in capture mode, retrieves + * its hardware parameters, and then queries for the maximum number of channels + * supported by the device. If ALSA fails, it will fall back to using the + * information from PulseAudio. + * + * @param alsa_name Name of the ALSA device. + * @param source_info Information about the PulseAudio source. + * @return Maximum number of channels supported by the device or -1 on error. + */ +int get_max_input_channels(const char *alsa_id, const pa_source_info *source_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int max_channels = 0; + int err; + + if ((!alsa_id) && (!source_info)) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + //The input device was found, but there's no alsa information about it. + //Attempt to retrieve used channels instead. + else if((!alsa_id) && (source_info)) { + return source_info->sample_spec.channels; + } + + // Try to open the ALSA device in capture mode + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK)) < 0) { + fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + // ALSA failed, fall back to PulseAudio information + return source_info->sample_spec.channels; + } + + // Allocate hardware parameters object + snd_pcm_hw_params_alloca(¶ms); + + // Fill it in with default values + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return source_info->sample_spec.channels; + } + + // Get the maximum number of channels + if ((err = snd_pcm_hw_params_get_channels_max(params, &max_channels)) < 0) { + fprintf(stderr, "Error getting max channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return source_info->sample_spec.channels; + } + + // Close the device + snd_pcm_close(handle); + + return max_channels; +} + +/** + * @brief Retrieves the maximum number of channels for the given ALSA device name. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the maximum number of channels + * supported by the device. + * + * @param alsa_name Name of the ALSA device. + * @return Maximum number of channels supported by the device or -1 on error. + */ +int get_max_output_channels(const char *alsa_id, const pa_sink_info *sink_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int max_channels = 0; + int err; + + if ((!alsa_id) && (!sink_info)) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + //The input device was found, but there's no alsa information about it. + //Attempt to retrieve used channels instead. + else if((!alsa_id) && (sink_info)) { + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { + //fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return sink_info->sample_spec.channels; // Return channels from PulseAudio if ALSA fails + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + //fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_hw_params_get_channels_max(params, &max_channels)) < 0) { + //fprintf(stderr, "Error getting max channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + //fprintf(stderr, "[DEBUG, get_max_channels()] sink_info->sample_spec.channels is %i\n", sink_info->sample_spec.channels); + return sink_info->sample_spec.channels; + } + + snd_pcm_close(handle); + return max_channels; +} + +/** + * @brief Retrieves the minimum number of channels for the given ALSA device id. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the minimum number of channels + * supported by the device. + * + * @param alsa_name Name of the ALSA device. + * @return Minimum number of channels supported by the device or -1 on error. + */ +int get_min_output_channels(const char *alsa_id, const pa_sink_info *sink_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int min_channels = 0; + int err; + + //fprintf(stderr, "[DEBUG, get_min_output_channels()] sink_info->sample_spec.channels is %i\n", sink_info->sample_spec.channels); + + if ((!alsa_id) && (!sink_info)) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + //The input device was found, but there's no alsa information about it. + //Attempt to retrieve used channels instead. + else if((!alsa_id) && (sink_info)) { + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { + //fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return sink_info->sample_spec.channels; + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + //fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_hw_params_get_channels_min(params, &min_channels)) < 0) { + //fprintf(stderr, "Error getting min channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.channels; + } + + snd_pcm_close(handle); + return min_channels; +} + +/** + * @brief Callback function for retrieving the ALSA card name of a PulseAudio source. + * + * This callback is called by the PulseAudio context during the operation to retrieve + * information about each available source. It is registered with the + * pa_context_get_source_info_by_name() function call. + * + * @param c The PulseAudio context. + * @param i The source information structure containing details about the source. + * @param eol End of list indicator. If non-zero, indicates no more data to process. + * @param userdata User data provided when registering the callback. In this case, it is + * expected to be the name of the source for which we want the ALSA card name. + * + * @note This function is intended to be used internally and should not be called directly. + * + * @warning This function uses global shared data (shared_data_2.alsa_name) to store the + * retrieved ALSA name, and signals the main loop to stop waiting. Ensure that + * the main loop and shared data are properly managed. + */ +static void get_alsa_input_name_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; + + if (eol < 0 || !i) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; // Handle error or invalid source info + } + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; // End of list + } + + // Check if this source is the one we're interested in + if (userdata && strcmp(i->name, (const char *)userdata) == 0) { + const char *prop_alsa_card_name = pa_proplist_gets(i->proplist, "alsa.card_name"); + if (prop_alsa_card_name) { + shared_data_2.alsa_name = strdup(prop_alsa_card_name); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); // Signal to stop the loop + } + } +} + +/** + * @brief Retrieves the ALSA name of a given PulseAudio source. + * + * @param source_name The name of the source for which to retrieve the ALSA name. + * @return The ALSA name of the source or NULL if not found or on error. + */ +char* get_alsa_input_name(const char *source_name) { + if (!source_name) { + fprintf(stderr, "get_alsa_input_name(): Invalid source name.\n"); + return NULL; + } + + shared_data_2.alsa_name = NULL; // Ensure alsa_name is initialized to NULL + + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "get_alsa_input_name(): PulseAudio initialization failed.\n"); + return NULL; + } + + pa_operation *name_op = pa_context_get_source_info_by_name(shared_data_1.context, source_name, get_alsa_input_name_cb, (void*)source_name); + iterate(name_op); + + return shared_data_2.alsa_name; +} + + +/** + * @brief Callback function to retrieve the ALSA name from the card info. + * + * This callback checks for the "alsa.card_name" property in the card's + * proplist. If the property is found, it assigns the property's value + * to the shared data structure for further use. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the card info structure. + * @param eol Flag indicating end of list. + * @param userdata User-defined data pointer (unused in this callback). + */ +static void get_alsa_output_name_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + + if (eol) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + const char *target_sink_name = userdata; + if (target_sink_name && strcmp(target_sink_name, i->name) != 0) { + return; // Skip this sink, as it does not match the specified name + } + + const char *alsa_name = pa_proplist_gets(i->proplist, "alsa.card_name"); + if (alsa_name) { + shared_data_2.alsa_name = strdup(alsa_name); + if (!shared_data_2.alsa_name) { + fprintf(stderr, "Failed to allocate memory for ALSA name.\n"); + } + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } +} + + + +/** + * @brief Retrieves the ALSA name of the first audio device encountered. + * + * This function initializes PulseAudio (if not already initialized), then + * queries PulseAudio for the list of audio devices. It waits for the + * retrieval operation to complete and then returns the ALSA name + * of the first device it finds with the "alsa.card_name" property. + * + * @return ALSA name of the device or NULL if not found or on error. + */ +char* get_alsa_output_name(const char *sink_name) { + pa_operation *name_op; + + shared_data_2.alsa_name = NULL; // Ensure alsa_name is initialized to NULL + + + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "get_alsa_name(): PulseAudio initialization failed.\n"); + return NULL; + } + + name_op = pa_context_get_sink_info_list(shared_data_1.context, get_alsa_output_name_cb, (void*)sink_name); + iterate(name_op); + + return shared_data_2.alsa_name; +} + +/** + * @brief Callback function to retrieve the ALSA device string based on PulseAudio source information. + * + * This function is called for each available PulseAudio source. It checks if the source's name matches + * the target source name provided in the userdata. If a match is found, it retrieves the "alsa.card" and + * "alsa.device" properties from the source's proplist, constructs the ALSA device string in the format + * "hw:,", and stores it in shared data for later retrieval. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the source information structure. + * @param eol End of list flag. If non-zero, indicates the end of the source list. + * @param userdata User-defined data pointer. In this case, it points to the target source name string. + */ +static void get_alsa_input_id_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; // Unused parameter + + // Check for end of list + if (eol) { + // Signal the main loop to unblock the iterate function + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + free(userdata); + return; + } + + // Retrieve the target source name from userdata + const char *target_source_name = (const char *)userdata; + + // Skip this source if it does not match the specified target name + if (target_source_name && strcmp(target_source_name, i->name) != 0) { + return; + } + + // Attempt to retrieve the "alsa.card" and "alsa.device" properties + const char *alsa_card = pa_proplist_gets(i->proplist, "alsa.card"); + const char *alsa_device = pa_proplist_gets(i->proplist, "alsa.device"); + + //print_proplist(i->proplist); + //printf("[DEBUG, get_alsa_input_id_cb] alsa_card is %s\n", alsa_card); + //printf("[DEBUG, get_alsa_input_id_cb] alsa_device is %s\n", alsa_device); + + // Construct the ALSA device string if both properties are available + if (alsa_card && alsa_device && isdigit((unsigned char)alsa_device[0])) { + char alsa_device_string[128]; + snprintf(alsa_device_string, sizeof(alsa_device_string), "hw:%s,%s", alsa_card, alsa_device); + + // Store the ALSA device string in shared data + shared_data_2.alsa_id = strdup(alsa_device_string); + if (!shared_data_2.alsa_id) { + fprintf(stderr, "Failed to allocate memory for ALSA device id.\n"); + } + } else { + // Log an error if ALSA properties are not found or are invalid + //fprintf(stderr, " - ALSA properties not found or invalid for source.\n"); + shared_data_2.alsa_id = NULL; + } + + // Signal the main loop to unblock the iterate function + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + +/** + * @brief Retrieves the ALSA device string for a given PulseAudio source name. + * + * This function initializes PulseAudio (if not already initialized), then queries PulseAudio for the + * information of a specific source by its name. It waits for the retrieval operation to complete and then + * returns the constructed ALSA device string based on the "alsa.card" and "alsa.device" properties of + * the source. + * + * @param source_name The name of the PulseAudio source. + * @return ALSA device string in the format "hw:," or NULL if not found or on error. + */ +char* get_alsa_input_id(const char *source_name) { + // Operation object for asynchronous PulseAudio calls + pa_operation *op; + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_alsa_input_id(): PulseAudio initialization failed.\n"); + return NULL; + } + } + + // Duplicate the source name to ensure it remains valid throughout the operation + char *source_name_copy = strdup(source_name); + if (!source_name_copy) { + fprintf(stderr, "get_alsa_input_id(): Failed to allocate memory for source name.\n"); + return NULL; + } + + // Start querying PulseAudio for the specified source information + op = pa_context_get_source_info_by_name(shared_data_1.context, source_name_copy, get_alsa_input_id_cb, source_name_copy); + + // Block and wait for the operation to complete + iterate(op); + + // After the callback has been called with the source information, the ALSA device ID will be stored + // Return the stored ALSA device ID + return shared_data_2.alsa_id; +} + + + +/** + * @brief Callback function to retrieve the ALSA device string based on the PulseAudio sink information. + * + * This function is called for each available PulseAudio sink. It checks if the sink's name matches the + * target sink name provided in the userdata. If a match is found, it retrieves the "alsa.card" and + * "alsa.device" properties from the sink's proplist, constructs the ALSA device string in the format + * "hw:,", and stores it in shared data for later retrieval. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the sink information structure. + * @param eol End of list flag. If non-zero, indicates the end of the sink list. + * @param userdata User-defined data pointer. In this case, it points to the target sink name string. + */ +static void get_alsa_output_id_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; // Unused parameter + + // Check for end of list + if (eol) { + // Signal the main loop to unblock the iterate function + //fprintf(stderr,"[DEBUG, get_alsa_id_cb()] End of function reached.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + free(userdata); + return; + } + + // Retrieve the target sink name from userdata + const char *target_sink_name = userdata; + + // If a target sink name is provided, check if it matches the current sink's name + if (target_sink_name && strcmp(target_sink_name, i->name) != 0) { + return; // Skip this sink, as it does not match the specified name + } + + // Attempt to retrieve the "alsa.card" and "alsa.device" properties + const char *alsa_card = pa_proplist_gets(i->proplist, "alsa.card"); + const char *alsa_device = pa_proplist_gets(i->proplist, "alsa.device"); + + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()], alsa.card is %s\n", alsa_card); + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()], alsa.device is %s\n", alsa_device); + + // Check if both properties are available and alsa.device is a digit + if (alsa_card && alsa_device && isdigit((unsigned char)alsa_device[0])) { + // Construct the ALSA device string + char alsa_device_string[128]; + snprintf(alsa_device_string, sizeof(alsa_device_string), "hw:%s,%s", alsa_card, alsa_device); + + // Store the ALSA device string in shared data + shared_data_2.alsa_id = strdup(alsa_device_string); + if (!shared_data_2.alsa_id) { + fprintf(stderr, "Failed to allocate memory for ALSA device id.\n"); + } + } else { + shared_data_2.alsa_id = NULL; + //fprintf(stderr, " - ALSA properties not found or invalid for sink.\n"); + } + + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()] alsa ID is %s\n", shared_data_2.alsa_id); + + // Signal the main loop to unblock the iterate function + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + + +/** + * @brief Retrieves the ALSA device string for a given PulseAudio sink name. + * + * This function initializes PulseAudio (if not already initialized), then queries PulseAudio for the + * information of a specific sink by its name. It waits for the retrieval operation to complete and then + * returns the constructed ALSA device string based on the "alsa.card" and "alsa.device" properties of + * the sink. + * + * @param sink_name The name of the PulseAudio sink. + * @return ALSA device string in the format "hw:," or NULL if not found or on error. + */ +char* get_alsa_output_id(const char *sink_name) { + pa_operation *op; + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_alsa_id(): PulseAudio initialization failed.\n"); + return NULL; + } + } + + // Make a copy of the sink name to ensure it remains valid + char *sink_name_copy = strdup(sink_name); + if (!sink_name_copy) { + fprintf(stderr, "get_alsa_id(): Failed to allocate memory for sink name.\n"); + return NULL; + } + + // Query PulseAudio for the information of the specified sink + //fprintf(stderr,"[DEBUG, get_alsa_id()] sink name is: %s\n", sink_name_copy); + op = pa_context_get_sink_info_by_name(shared_data_1.context, sink_name_copy, get_alsa_output_id_cb, sink_name_copy); + + // Wait for the PulseAudio operation to complete + iterate(op); + + // Return the ALSA device string retrieved by the callback function + return shared_data_2.alsa_id; +} + + +/** + * @brief Retrieves the sample rate of the specified PulseAudio source by ALSA identifier. + * + * Attempts to open the ALSA device corresponding to the given PulseAudio source + * to query the sample rate. If the ALSA query fails, the function falls back to + * returning the sample rate as reported by the PulseAudio source information. + * + * @param alsa_id The ALSA device identifier corresponding to the PulseAudio source. + * @param source_info The PulseAudio source information structure. + * @return The sample rate of the source in Hz on success, or -1 on error. + */ +int get_input_sample_rate(const char *alsa_id, pa_source_info *source_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int sample_rate = 0; // Default to a known value + int err; + + // Output debug information to stderr + //fprintf(stderr, "[DEBUG, get_input_sample_rate()] called with alsa_id: '%s'\n", alsa_id); + + // If alsa_id is NULL, return the PulseAudio rate + if (!alsa_id && source_info) { + //fprintf(stderr, "alsa_id is NULL, returning PulseAudio sample rate: %u Hz\n", source_info->sample_spec.rate); + return source_info->sample_spec.rate; + } + + // Validate parameters + if (!alsa_id || !source_info) { + //fprintf(stderr, "Invalid parameters provided to get_input_sample_rate.\n"); + return -1; + } + + // Attempt to open the ALSA device + //fprintf(stderr, "[DEBUG, get_input_sample_rate()] Attempting to open ALSA device: '%s'\n", alsa_id); + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK)) < 0) { + fprintf(stderr, "Unable to open PCM device: '%s', error: %s\n", alsa_id, snd_strerror(err)); + return source_info->sample_spec.rate; + } + + // ALSA device successfully opened + //fprintf(stderr, "ALSA device: '%s' successfully opened.\n", alsa_id); + snd_pcm_hw_params_alloca(¶ms); + + // Initialize hardware parameters + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the access type for the hardware parameters + if ((err = snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { + fprintf(stderr, "Cannot set access type: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the sample format for the hardware parameters + if ((err = snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE)) < 0) { + fprintf(stderr, "Cannot set sample format: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the channel count for the hardware parameters + if ((err = snd_pcm_hw_params_set_channels(handle, params, source_info->sample_spec.channels)) < 0) { + fprintf(stderr, "Cannot set channel count: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Apply the hardware parameters to the device + if ((err = snd_pcm_hw_params(handle, params)) < 0) { + fprintf(stderr, "Cannot set hardware parameters: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Now try to get the sample rate + if ((err = snd_pcm_hw_params_get_rate(params, &sample_rate, 0)) < 0) { + fprintf(stderr, "Error getting sample rate for device: '%s', error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Sample rate successfully obtained + //fprintf(stderr, "Sample rate for ALSA device: '%s' is %u Hz\n", alsa_id, sample_rate); + snd_pcm_close(handle); + return sample_rate; // Successfully obtained sample rate +} + + + +/** + * @brief Retrieves the sample rate of the given ALSA device. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the sample rate. + * + * @param alsa_id Name of the ALSA device. + * @param sink_info Pointer to a PulseAudio sink_info structure. + * @return Sample rate of the device or -1 on error. + */ +/** + * @brief Retrieves the sample rate of the specified PulseAudio sink by ALSA identifier. + * + * Attempts to open the ALSA device corresponding to the given PulseAudio sink + * to query the sample rate. If the ALSA query fails, the function falls back to + * returning the sample rate as reported by the PulseAudio sink information. + * + * @param alsa_id The ALSA device identifier corresponding to the PulseAudio sink. + * @param sink_info The PulseAudio sink information structure. + * @return The sample rate of the sink in Hz on success, or -1 on error. + */ +int get_output_sample_rate(const char *alsa_id, const pa_sink_info *sink_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int sample_rate = 0; // Default to a known value + int err; + + //fprintf(stderr, "[DEBUG, get_output_sample_rate()] called with alsa_id: '%s'\n", alsa_id); + + if (!alsa_id && sink_info) { + //fprintf(stderr, "alsa_id is NULL, returning PulseAudio sample rate: %u Hz\n", sink_info->sample_spec.rate); + return sink_info->sample_spec.rate; + } + + if (!alsa_id || !sink_info) { + //fprintf(stderr, "Invalid parameters provided to get_output_sample_rate.\n"); + return -1; + } + + //fprintf(stderr, "Attempting to open ALSA device: '%s'\n", alsa_id); + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, 0)) < 0) { + fprintf(stderr, "Unable to open PCM device: '%s', error: %s\n", alsa_id, snd_strerror(err)); + return sink_info->sample_spec.rate; + } + + //fprintf(stderr, "ALSA device: '%s' successfully opened.\n", alsa_id); + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the access type for the hardware parameters + if ((err = snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { + fprintf(stderr, "Cannot set access type: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the sample format for the hardware parameters + if ((err = snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE)) < 0) { + fprintf(stderr, "Cannot set sample format: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the channel count for the hardware parameters + if ((err = snd_pcm_hw_params_set_channels(handle, params, sink_info->sample_spec.channels)) < 0) { + fprintf(stderr, "Cannot set channel count: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Apply the hardware parameters to the device + if ((err = snd_pcm_hw_params(handle, params)) < 0) { + fprintf(stderr, "Cannot set hardware parameters: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Now try to get the sample rate + if ((err = snd_pcm_hw_params_get_rate(params, &sample_rate, 0)) < 0) { + fprintf(stderr, "Error getting sample rate for device: '%s', error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + //fprintf(stderr, "Sample rate for ALSA device: '%s' is %u Hz\n", alsa_id, sample_rate); + snd_pcm_close(handle); + return sample_rate; // Successfully obtained sample rate +} + + +// Callback for source information to get ports +void get_source_ports(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; + + pa_source_info_list *info_list = (pa_source_info_list *)userdata; + if (eol > 0) { + info_list->done = 1; + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + info_list->ports = realloc(info_list->ports, (info_list->num_ports + 1) * sizeof(pa_port_info)); + pa_port_info *port = &info_list->ports[info_list->num_ports]; + port->name = strdup(i->name); + port->description = strdup(i->description); + port->is_active = 0; // Will be set in the active port callback + + info_list->num_ports++; +} + +// Callback for source information to get the active port +void get_active_port(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; + pa_source_info_list *info_list = (pa_source_info_list *)userdata; + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (i->active_port) { + for (int j = 0; j < info_list->num_ports; ++j) { + if (strcmp(info_list->ports[j].name, i->active_port->name) == 0) { + info_list->ports[j].is_active = 1; + break; + } + } + } +} + +// Function to collect source port information and return it +pa_source_info_list* get_source_port_info() { + pa_source_info_list* info_list = malloc(sizeof(pa_source_info_list)); + if (!info_list) { + // Handle malloc failure + return NULL; + } + memset(info_list, 0, sizeof(pa_source_info_list)); + + // Call the function to get the list of sources + pa_operation *op = pa_context_get_source_info_list(shared_data_1.context, get_source_ports, info_list); + iterate(op); + + // Now iterate over the collected sources and get detailed info for each one + for (int i = 0; i < info_list->num_ports; ++i) { + op = pa_context_get_source_info_by_name(shared_data_1.context, info_list->ports[i].name, get_active_port, info_list); + + iterate(op); + } + + // The info_list now contains all the ports and their active status + return info_list; +} + + +/** + * @brief Retrieves the volume of a given channel from a PulseAudio sink. + * + * This function takes a pointer to a pa_sink_info structure and a channel index + * and returns the volume of that channel. The volume is given as a pa_volume_t, + * which is an unsigned 32-bit integer. The function checks if the channel index + * is within the valid range for the sink. + * + * @param sink_info A pointer to a pa_sink_info structure containing the sink details. + * @param channel_index The index of the channel for which to retrieve the volume. + * @return The volume of the specified channel as a pa_volume_t, or PA_VOLUME_INVALID on error. + */ +pa_volume_t get_channel_volume(const pa_sink_info *sink_info, unsigned int channel_index) { + // Check if the sink_info is NULL + if (sink_info == NULL) { + return PA_VOLUME_INVALID; // Return invalid volume if sink_info is NULL + } + + // Check if the provided channel index is valid + if (channel_index >= sink_info->channel_map.channels) { + return PA_VOLUME_INVALID; // Return invalid volume if the channel_index is out of range + } + + // Retrieve the volume of the given channel + return sink_info->volume.values[channel_index]; +} + + + +/** + * @brief Callback function for processing each available audio input device (source) found. + * + * This function is called by the PulseAudio context as part of the operation initiated by + * `get_available_input_devices`. It is invoked for each source found, and is responsible for + * storing the details of each source into a dynamically allocated array. The function handles + * memory allocation for the array of `pa_source_info` structures, as well as for the strings + * within them. It also handles error conditions and signals the mainloop to terminate the wait + * when the end of the source list is reached or an error occurs. + * + * @param c The PulseAudio context. + * @param i The `pa_source_info` structure containing details about the current source. + * @param eol End-Of-List indicator. If positive, indicates the end of the list; if negative, indicates an error. + * @param userdata User data pointer provided during the context operation setup; unused in this callback. + */ +static void get_available_input_devices_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void)c; // Unused parameter + (void)userdata; // Unused parameter + + // Error or end of list + if (eol < 0) { + fprintf(stderr, "Error occurred while getting source info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (eol > 0) { + shared_data_sources.sources[shared_data_sources.count] = NULL; // Sentinel value + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (shared_data_sources.count >= shared_data_sources.allocated) { + size_t new_alloc = shared_data_sources.allocated + 8; + void *temp = realloc(shared_data_sources.sources, new_alloc * sizeof(pa_source_info *)); + if (!temp) { + fprintf(stderr, "Out of memory when reallocating sources array.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + shared_data_sources.sources = temp; + shared_data_sources.allocated = new_alloc; + } + + shared_data_sources.sources[shared_data_sources.count] = malloc(sizeof(pa_source_info)); + if (!shared_data_sources.sources[shared_data_sources.count]) { + fprintf(stderr, "Out of memory when allocating source info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + *(shared_data_sources.sources[shared_data_sources.count]) = *i; + + if (i->name) { + shared_data_sources.sources[shared_data_sources.count]->name = strdup(i->name); + if (!shared_data_sources.sources[shared_data_sources.count]->name) { + fprintf(stderr, "Out of memory when duplicating source name.\n"); + } + } + if (i->description) { + shared_data_sources.sources[shared_data_sources.count]->description = strdup(i->description); + if (!shared_data_sources.sources[shared_data_sources.count]->description) { + fprintf(stderr, "Out of memory when duplicating source description.\n"); + } + } + + shared_data_sources.count++; +} + + +/** + * @brief Retrieves an array of available audio input devices (sources). + * + * This function queries the PulseAudio server for a list of all audio input devices + * currently available. It ensures that PulseAudio is initialized before making the query + * and locks the main loop to provide thread safety during the operation. + * + * Each call to this function should be followed by a call to `delete_input_devices` + * to free the allocated memory for the returned array of `pa_source_info` pointers. + * + * @note The array is terminated with a NULL pointer as the last element. + * + * @return On success, a pointer to an array of `pa_source_info` pointers, each representing + * an audio input device. On failure, or if PulseAudio is not initialized, NULL is returned. + */ +pa_source_info **get_available_input_devices() { + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "Failed to initialize PulseAudio.\n"); + return NULL; + } + } + + // Initialize the data structure for storing the sources + shared_data_sources.sources = NULL; + shared_data_sources.count = 0; + shared_data_sources.allocated = 0; + + // Start the operation to get available input devices + pa_operation *op = pa_context_get_source_info_list(shared_data_1.context, get_available_input_devices_cb, NULL); + if (op) { + // iterate handles locking, waiting, and cleanup + iterate(op); + } else { + fprintf(stderr, "Failed to create the operation to get source info.\n"); + return NULL; + } + + // Allocate one extra pointer to NULL at the end as a sentinel + shared_data_sources.sources = realloc(shared_data_sources.sources, (shared_data_sources.count + 1) * sizeof(pa_source_info *)); + if (shared_data_sources.sources) { + shared_data_sources.sources[shared_data_sources.count] = NULL; // Set the sentinel value + } else { + fprintf(stderr, "Out of memory while allocating sources array.\n"); + } + + return shared_data_sources.sources; +} + + +/** + * @brief Callback function used to count the available audio input devices (sources). + * + * This function is called for each audio input device found by PulseAudio when querying + * for the list of sources. The function increments the device_count for each device. + * When the list is exhausted or there's an error, it signals the mainloop to continue. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio input device information. + * @param eol End-Of-List indicator. If positive, indicates the end of the list; if negative, indicates an error. + * @param userdata Pointer to the user data, which in this case is expected to be a pointer to the device_count. + */ +static void get_input_device_count_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; // Suppress unused parameter warning + (void) i; // Suppress unused parameter warning + + uint32_t *device_count = (uint32_t *) userdata; + + if (eol < 0) { + // Handle error + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + if (eol > 0) { + // End of list + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + ++(*device_count); +} + + +/** + * @brief Retrieve the count of audio input devices in the system. + * + * This function queries PulseAudio to get a count of all available audio input devices (sources). + * If PulseAudio is not initialized, the function attempts to initialize it. If the initialization + * fails or there's an error in fetching the device count, it returns UINT32_MAX. + * + * @return Count of audio input devices or UINT32_MAX on error. + */ +uint32_t get_input_device_count(void) { + uint32_t device_count = 0; // Initialize device count to zero + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_input_device_count(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails + } + } + + // Check if context is valid after initialization attempt + if (!shared_data_1.context) { + fprintf(stderr, "Context is NULL in get_input_device_count.\n"); + return UINT32_MAX; + } + + // Query PulseAudio for the list of audio input devices (sources) + count_op = pa_context_get_source_info_list(shared_data_1.context, get_input_device_count_cb, &device_count); + + // Wait for the PulseAudio operation to complete + iterate(count_op); + + return device_count; // Return the total count of input devices +} + + +/** + * @brief Get the channel names for a specific sink identified by its name. + * + * This function retrieves the channel names for a given sink using its unique name. + * It allocates an array of strings where each entry corresponds to a channel name + * of the sink. The caller is responsible for freeing the memory allocated for the + * array of channel names and the strings themselves. + * + * @param sink_name The name of the sink whose channel names are to be retrieved. + * @param num_channels Number of channels of the sink. + * @return A pointer to an array of strings containing the channel names, or NULL if + * the sink is not found or in case of an error. + */ +char** get_output_channel_names(const char *pulse_id, int num_channels) { + // Validate input parameters + if (!pulse_id) { + return NULL; // Return NULL if the sink name is not provided + } + + // Retrieve the sink information for the specified sink name + pa_sink_info *device_info = get_output_device_by_name(pulse_id); + + // Check if the sink was found + if (!device_info) { + return NULL; // Return NULL if the sink is not found or in case of an error + } + + char **channel_names = calloc(num_channels, sizeof(char*)); + + if (!channel_names) { + free((char *)device_info->description); // Free the description if allocated + free(device_info); // Free the device_info structure + return NULL; // Return NULL if memory allocation fails + } + + // Copy the channel names into the array + for (int i = 0; i < num_channels; ++i) { + channel_names[i] = strdup(pa_channel_position_to_pretty_string(device_info->channel_map.map[i])); + if (!channel_names[i]) { + // Handle allocation failure for a channel name + // Free all previously allocated names and the array itself + while (i--) free(channel_names[i]); + free(channel_names); + free((char *)device_info->description); // Free the description if allocated + free(device_info); // Free the device_info structure + return NULL; // Return NULL if memory allocation fails + } + } + + // Free the sink_info structure and its description field + if (device_info->description) { + free((char *)device_info->description); // Corrected free statement + } + free(device_info); + + // Return the array of channel names + return channel_names; +} + +/** + * @brief Get the channel names for a specific source identified by its name. + * + * This function retrieves the channel names for a given source using its unique name. + * It allocates an array of strings where each entry corresponds to a channel name + * of the source. The caller is responsible for freeing the memory allocated for the + * array of channel names and the strings themselves. + * + * @param source_name The name of the source whose channel names are to be retrieved. + * @param num_channels Number of channels of the source. + * @return A pointer to an array of strings containing the channel names, or NULL if + * the source is not found or in case of an error. + */ +char** get_input_channel_names(const char *pulse_code, int num_channels) { + // Validate input parameters + if (!pulse_code) { + return NULL; // Return NULL if the source name is not provided + } + + // Retrieve the source information for the specified source name + pa_source_info *device_info = get_input_device_by_name(pulse_code); + + // Check if the source was found + if (!device_info) { + return NULL; // Return NULL if the source is not found or in case of an error + } + + char **channel_names = calloc(num_channels, sizeof(char*)); + if (!channel_names) { + free((char *)device_info->description); // Free the description if allocated + free(device_info); // Free the device_info structure + return NULL; // Return NULL if memory allocation fails + } + + // Copy the channel names into the array + for (int i = 0; i < num_channels; ++i) { + channel_names[i] = strdup(pa_channel_position_to_pretty_string(device_info->channel_map.map[i])); + if (!channel_names[i]) { + // Handle allocation failure for a channel name + while (i--) free(channel_names[i]); // Free all previously allocated names + free(channel_names); // Free the array itself + free((char *)device_info->description); // Free the description if allocated + free(device_info); // Free the device_info structure + return NULL; // Return NULL if memory allocation fails + } + } + + // Free the source_info structure and its description field + if (device_info->description) { + free((char *)device_info->description); + } + free(device_info); + + // Return the array of channel names + return channel_names; +} + +/** + * @brief Retrieve a source (input device) information by its name. + * + * This function searches for an audio source with the given name and returns its information + * if found. The caller is responsible for freeing the memory allocated for the source info + * and its description. + * + * @param source_name The name of the source to be retrieved. + * @return A pointer to a pa_source_info structure containing the source information, + * or NULL if the source is not found or in case of an error. + */ +pa_source_info *get_input_device_by_name(const char *source_name) { + if (!source_name) { + return NULL; // Handle null pointer argument + } + + // Retrieve the list of available input devices (sources) + pa_source_info **available_sources = get_available_input_devices(); + if (!available_sources) { + return NULL; // Handle error in retrieving sources + } + + pa_source_info *input_device_info = NULL; + + // Iterate over the list of sources to find the one with the matching name + for (int i = 0; available_sources[i] != NULL; ++i) { + if (strcmp(available_sources[i]->name, source_name) == 0) { + // Found the matching source, make a copy of the source_info structure + input_device_info = malloc(sizeof(pa_source_info)); + if (input_device_info) { + memcpy(input_device_info, available_sources[i], sizeof(pa_source_info)); + + // If the source has a description, also copy that string + if (available_sources[i]->description) { + input_device_info->description = strdup(available_sources[i]->description); + } + } + break; // Exit the loop after finding the matching source + } + } + + // Clean up the source information now that we're done with it + // Assuming there's a function to delete input devices similar to delete_output_devices + delete_input_devices(available_sources); + + return input_device_info; // Return the found source or NULL if not found +} + + + +/** + * @brief Retrieve a copy of the sink information for a given sink name. + * + * This function searches through the available output devices and returns a copy of the + * pa_sink_info structure for the sink that matches the provided name. It uses the + * get_available_output_devices function to obtain the list of all sinks and then + * iterates through them to find the sink with the given name. + * + * @param sink_name The name of the sink to search for. Must not be NULL. + * @return A pointer to a newly allocated pa_sink_info structure containing the sink + * information, or NULL if the sink is not found or if an error occurs. The + * caller is responsible for freeing the returned structure and its description + * field (if not NULL) when no longer needed. + * + * @note The function allocates memory for the returned pa_sink_info structure and its + * description field. It is the responsibility of the caller to free this memory + * using free(). If the sink has other dynamically allocated fields, these must + * also be freed by the caller. + * + * @warning The function returns NULL if the sink_name argument is NULL, or if the + * get_available_output_devices function fails to retrieve the sinks. + * + * Usage Example: + * @code + * pa_sink_info *sink_info = get_sink_by_name("alsa_output.pci-0000_00_1b.0.analog-stereo"); + * if (sink_info) { + * // Use the sink information + * ... + * // Free the memory allocated for the description + * if (sink_info->description) { + * free(sink_info->description); + * } + * // Free the memory allocated for the sink_info structure + * free(sink_info); + * } + * @endcode + */ +pa_sink_info *get_output_device_by_name(const char *sink_name) { + if (!sink_name) { + return NULL; // Handle null pointer argument + } + + // Retrieve the list of available output devices (sinks) + pa_sink_info **available_sinks = get_available_output_devices(); + if (!available_sinks) { + return NULL; // Handle error in retrieving sinks + } + + pa_sink_info *output_device_to_return = NULL; + + // Iterate over the list of sinks to find the one with the matching name + for (int i = 0; available_sinks[i] != NULL; ++i) { + if (strcmp(available_sinks[i]->name, sink_name) == 0) { + // Found the matching output_device, make a copy of the sink_info structure + output_device_to_return = malloc(sizeof(pa_sink_info)); + if (output_device_to_return) { + memcpy(output_device_to_return, available_sinks[i], sizeof(pa_sink_info)); + + // If the sink has a description, also copy that string + if (available_sinks[i]->description) { + output_device_to_return->description = strdup(available_sinks[i]->description); + } + } + break; // Exit the loop after finding the matching sink + } + } + + // Clean up the sink information now that we're done with it + delete_output_devices(available_sinks); + + return output_device_to_return; // Return the found sink or NULL if not found +} + +/** + * @brief Callback for handling the result of the sink information fetch operation. + * + * This callback is called by the PulseAudio library when sink information is ready to be + * retrieved, or when the iteration over sinks has finished. The function will copy the sink + * information to the provided user data structure if available, or signal the main loop to + * continue if the end of the list is reached or if an error occurs. + * + * @param c The PulseAudio context. + * @param i The sink information structure provided by PulseAudio. + * @param eol End of list indicator. If positive, indicates the end of the list; if negative, + * indicates failure to retrieve sink information. + * @param userdata User data pointer provided to the pa_context_get_sink_info_by_index function, + * expected to be a pointer to a pa_sink_info structure. + */ +static void get_output_device_by_index_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + + pa_sink_info *sink_info = userdata; + + if (eol < 0 || eol > 0 || !i) { + // Either an error occurred, or we've reached the end of the list without finding the sink + // Signal main loop to continue in case of end of list + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } + return; + } + + // Copy the sink information to the allocated structure + *sink_info = *i; // Shallow copy first + + // Now duplicate any strings + if (i->name) { + sink_info->name = strdup(i->name); + } + if (i->description) { + sink_info->description = strdup(i->description); + } + + // Signal the main loop that the data is ready + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + +/** + * @brief Retrieve the sink information for a given output device by its index. + * + * This function initiates an asynchronous operation to fetch the sink information + * for the specified device index. The operation is handled synchronously within this + * function using a threaded mainloop to wait for completion. + * + * @param index The index of the sink for which information is to be retrieved. + * @param sink_info A pointer to a pa_sink_info structure where the sink information will be stored. + * @return int Returns 1 on success or 0 if the operation fails. + * + */ +pa_sink_info* get_output_device_by_index(uint32_t index) { + if (!shared_data_1.context || !shared_data_1.mainloop) { + fprintf(stderr, "Invalid shared data context or mainloop.\n"); + return NULL; + } + + // Allocate memory for sink_info + pa_sink_info *sink_info = malloc(sizeof(pa_sink_info)); + if (!sink_info) { + fprintf(stderr, "Memory allocation for sink_info failed.\n"); + return NULL; + } + + // Start the operation to get the sink information + pa_operation *op = pa_context_get_sink_info_by_index(shared_data_1.context, index, get_output_device_by_index_cb, sink_info); + iterate(op); + + // Check if the operation was successful + if (sink_info->name == NULL) { + // The operation was not successful, free the allocated memory. + free(sink_info); + return NULL; + } + + return sink_info; // Return the allocated sink_info +} + + + +/** + * @brief Callback function for getting the default output device from the PulseAudio server. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the server information structure. + * @param userdata The user data passed to the callback function, which is a pointer to a char*. + */ +static void get_default_output_cb(pa_context *c, const pa_server_info *i, void *userdata) { + //fprintf(stderr, "[DEBUG, get_default_output()] Callback reached.\n"); + + (void)c; // Unused parameter + + char **default_sink_name = (char**)userdata; + + // Always signal the mainloop to unblock the iterate function, even if i is NULL + if (!i) { + fprintf(stderr, "Failed to get default sink information.\n"); + } else if (i->default_sink_name) { + // Duplicate the name string to our output variable + *default_sink_name = strdup(i->default_sink_name); + } + + // Signal the mainloop to unblock the iterate function, regardless of the outcome + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + + +/** + * @brief Retrieves the name of the default sink (output device) in the system. + * + * This function checks if PulseAudio is initialized and if not, tries to initialize it. + * Then, it queries the PulseAudio server for the default output device and waits for + * the operation to complete. + * + * @param mainloop A pointer to the mainloop structure. + * @param context A pointer to the PulseAudio context. + * @return A dynamically allocated string containing the default sink name, or NULL on error. + * The caller is responsible for freeing this string. + */ +char* get_default_output(pa_context *context) { + + //fprintf(stderr,"[DEBUG, get_default_output()] Function reached.\n"); + + // Check if PulseAudio is initialized, and if not, initialize it + if (!is_pulse_initialized()) { + if (!initialize_pulse()) { + fprintf(stderr, "Failed to initialize PulseAudio.\n"); + return NULL; + } + } + + char *default_sink_name = NULL; + + // Start the operation to get the default sink + pa_operation *op = pa_context_get_server_info(context, get_default_output_cb, &default_sink_name); + + if (op) { + // Wait for the operation to complete using the iterate function + iterate(op); // This function should handle the waiting and signaling + // pa_operation_unref(op); is called inside iterate, no need to call here + } else { + fprintf(stderr, "Failed to create the operation to get server info.\n"); + } + + return default_sink_name; // Caller must free this string +} +/** + * @brief Callback function for getting the default input device from the PulseAudio server. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the server information structure. + * @param userdata The user data passed to the callback function, which is a pointer to a char*. + */ +static void get_default_input_cb(pa_context *c, const pa_server_info *i, void *userdata) { + (void)c; // Unused parameter + + char **default_source_name = (char**)userdata; + + //fprintf(stderr, "[DEBUG, get_default_input_cb()] callback reached.\n"); + + if (!i) { + fprintf(stderr, "Failed to get default source information.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (i->default_source_name) { + // Duplicate the name string to our output variable + *default_source_name = strdup(i->default_source_name); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); // Signal to stop the loop + } +} + + +/** + * @brief Retrieves the name of the default source (input device) in the system. + * + * This function queries the PulseAudio server for all available input devices + * and iterates through them to find the one that is in the RUNNING state, + * which typically indicates that it is the default source being used by the system. + * The name of the default source is then returned. + * + * @note The caller is responsible for freeing the memory allocated for the + * returned source name using the standard free() function to avoid memory leaks. + * + * @return A pointer to a dynamically allocated string containing the name of + * the default source. If no active default source is found or in case of an error, + * NULL is returned. + */ +char* get_default_input(pa_context *context) { + + //fprintf(stderr, "[DEBUG, get_default_input()] Function reached.\n"); + + // Check if PulseAudio is initialized, and if not, initialize it + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "Failed to initialize PulseAudio.\n"); + return NULL; + } + + char *default_source_name = NULL; + + // Start the operation to get the default source + pa_operation *op = pa_context_get_server_info(context, get_default_input_cb, &default_source_name); + iterate(op); + + return default_source_name; // Caller must free this string +} + +/** + * @brief Fetches all profiles associated with a given sound card. + * + * This function queries the PulseAudio server for all profiles associated with the sound card + * specified by the card_index. It blocks until all profiles are fetched or an error occurs. + * + * @param pa_ctx A pointer to the initialized pa_context representing the connection to the PulseAudio server. + * @param card_index The index of the sound card for which to fetch profiles. + * @param num_profiles A pointer to an integer where the number of fetched profiles will be stored. + * @return A pointer to an array of pa_card_profile_info2 structures containing the profile info. + * This pointer must be freed by the caller. NULL is returned if an error occurs. + */ +void get_profiles_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + (void) userdata; + + if (eol < 0) { + fprintf(stderr, "Failed to fetch profiles.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (eol > 0) { + // All profiles have been fetched, the operation is complete + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Reallocate memory for profiles array to add new profiles + shared_data_4.profiles = realloc(shared_data_4.profiles, sizeof(pa_card_profile_info2) * (shared_data_4.num_profiles + i->n_profiles)); + + // Now copy the profiles from the PulseAudio provided array + for (unsigned int j = 0; j < i->n_profiles; ++j) { + shared_data_4.profiles[shared_data_4.num_profiles + j] = i->profiles[j]; + } + + // Update the number of profiles fetched + shared_data_4.num_profiles += i->n_profiles; +} + + + +/** + * @brief Fetches all profiles associated with a given sound card. + * + * This function queries the PulseAudio server for all profiles associated with the sound card + * specified by the card_index. It blocks until all profiles are fetched or an error occurs. + * + * @param pa_ctx A pointer to the initialized pa_context representing the connection to the PulseAudio server. + * @param card_index The index of the sound card for which to fetch profiles. + * @param num_profiles A pointer to an integer where the number of fetched profiles will be stored. + * @return A pointer to an array of pa_card_profile_info2 structures containing the profile info. + * This pointer must be freed by the caller. NULL is returned if an error occurs. + */ +pa_card_profile_info *get_profiles(pa_context *pa_ctx, uint32_t card_index) { + // Reset the static global variable before use + free(shared_data_4.profiles); + shared_data_4.profiles = NULL; + shared_data_4.num_profiles = 0; + + // Start the operation to fetch the profiles + pa_operation *op = pa_context_get_card_info_by_index(pa_ctx, card_index, get_profiles_cb, NULL); + + // Wait for the operation to complete + iterate(op); + + return shared_data_4.profiles; // Return the static global profiles array +} + +/** + * Callback function for retrieving the mute status of a sink. + * + * This callback is provided to the PulseAudio context as part of a request + * to obtain information about a particular sink. It will be called by the + * PulseAudio main loop when the sink information is available. The end of list + * (eol) parameter indicates whether the data received is the last in the list. + * + * @param c A pointer to the PulseAudio context. + * @param i A pointer to the sink information structure. + * @param eol An end-of-list flag that is positive if there is no more data to process. + * @param userdata A pointer to user data, expected to be a pointer to an integer that + * will be set to the mute status of the sink. + * + * @note The function sets the integer pointed to by `userdata` to the mute state + * of the sink. The mute state is non-zero when the sink is muted and zero + * when it is not muted. This function is not intended to be called directly + * by the user but as a callback from the PulseAudio API when + * pa_context_get_sink_info_by_name() is called. + */ +static void get_muted_output_status_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + + //fprintf(stderr, "[DEBUG, get_muted_output_status_cb]: inside callback.\n"); + + // If eol is set to a positive number, you're at the end of the list + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + //fprintf(stderr, "[DEBUG, get_muted_output_status_cb]: leaving callback.\n"); + return; + } + + // If eol is negative, an error occurred + if (eol < 0) { + int err = pa_context_errno(c); // Retrieve the error number from the context + fprintf(stderr, "[ERROR, get_muted_output_status_cb]: Error occurred during iteration - %s\n", pa_strerror(err)); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Cast the userdata to a boolean pointer + int *is_muted = (int *)userdata; + + // If the sink information is valid, set is_muted to the sink's mute state + if (i) { + *is_muted = i->mute; + } +} + + + +/** + * Queries the mute status of a specified output sink. + * + * This function initiates an asynchronous operation to retrieve the mute status + * of the sink specified by `sink_name`. It requires a valid `pulseaudio_manager` + * instance that has been previously initialized with a mainloop and context. + * The function blocks until the operation is complete or an error occurs. + * + * @param self A pointer to the initialized `pulseaudio_manager` instance. + * @param sink_name The name of the sink whose mute status is being queried. + * + * @return Returns 1 if the sink is muted, 0 if not muted, and -1 if an error + * occurred or the sink was not found. In the case of an error, an + * appropriate message will be printed to standard error. + * + * @note The function uses `iterate` to block and process the mainloop until + * the operation is complete. It is assumed that `iterate` and + * `get_muted_output_status_cb` are implemented elsewhere and are + * responsible for iterating the mainloop and handling the callback + * from the sink information operation, respectively. + */ +int get_muted_output_status(const char *sink_name) { + + //fprintf(stderr,"[DEBUG, get_muted_output_status()] sink_name is %s\n", sink_name); + + if (!shared_data_1.mainloop || !shared_data_1.context || !sink_name) { + fprintf(stderr, "Invalid arguments provided.\n"); + return -1; + } + + pa_operation *op = NULL; + int is_muted = -1; // Default to -1 in case of error or sink not found + + // Start a PulseAudio operation to get information about the sink + op = pa_context_get_sink_info_by_name(shared_data_1.context, sink_name, get_muted_output_status_cb, &is_muted); + iterate(op); + + // -1 will be returned if the sink was not found or another error occurred + return is_muted; +} diff --git a/v-0.08/system_query.h b/v-0.08/system_query.h new file mode 100644 index 0000000..230291f --- /dev/null +++ b/v-0.08/system_query.h @@ -0,0 +1,85 @@ +//Header definition files to query about sound card properties (number of sinks, profiles...) +#ifndef SYSTEM_QUERY_H +#define SYSTEM_QUERY_H + +#include +#include +#include +#include + +//Structures to get source port information (e.g, line in, microphone...) +//Used by get_source_port_info, get_active_port, and get_source_ports. +typedef struct pa_port_info { + char *name; // Port name + char *description; // Port description + bool is_active; // Is this the active port +} pa_port_info; + +typedef struct pa_source_info_list { + pa_port_info *ports; // Array of ports + int num_ports; // Number of ports + bool done; // Indicates if the callback has been called +} pa_source_info_list; + +void print_proplist(const pa_proplist *p); // Utility function to print all properties in the proplist +uint32_t get_output_device_count(void); //Gets the number of output devices in the system. +uint32_t get_input_device_count(void); //Gets the number of input devices in the system. +uint32_t get_profile_count(uint32_t card_index); //Gets the number of profiles for a given soundcard. +pa_sink_info **get_available_output_devices(); //Gets the total available sinks (output devices) for this system. +pa_source_info **get_available_input_devices(); //Gets the total available sources (input devices) for this system. + +char* get_alsa_input_name(const char *source_name); //Gets the corresponding alsa name of a pulseaudio source (input device). +char* get_alsa_output_name(const char *sink_name); //Gets the corresponding alsa name of a pulseaudio sink (output device). + +pa_source_info *get_input_device_by_name(const char *source_name); //Gets alsa name of a pulseaudio source (input device) by its name. + +pa_sink_info* get_output_device_by_index(uint32_t index); //Gets alsa name of a pulseaudio source (input device) by its index. + +pa_source_info_list* get_source_port_info(); //Returns which ports in the source are available (mic, line in...). + + +char** get_input_channel_names(const char *pulse_id, +int num_channels); //Returns the channel names of an input device. +char** get_output_channel_names(const char *pulse_id, +int num_channels); //Returns the channel names of an output device. + +int get_min_input_channels(const char *alsa_id, +const pa_source_info *source_info); //Gets the maximum output channels an ALSA card supports. + +int get_max_input_channels(const char *alsa_id, +const pa_source_info *source_info); //Gets the maximum output channels an ALSA card supports. + +int get_max_output_channels(const char *alsa_id, +const pa_sink_info *sink_info); //Gets the maximum output channels an ALSA card supports. + +int get_min_output_channels(const char *alsa_id, +const pa_sink_info *sink_info); //Gets the maximum output channels an ALSA card supports. + +char* get_alsa_input_id(const char *source_name); //Gets the alsa input id based on the pulseaudio channel name. + +char* get_alsa_output_id(const char *sink_name); //Gets the alsa output id based on the pulseaudio channel name. + +int get_output_sample_rate(const char *alsa_id, +const pa_sink_info *sink_info); //Gets the sample rate of a pulseaudio sink (output device). + +int get_input_sample_rate(const char *alsa_id, +pa_source_info *source_info); //Gets the sample rate of a pulseaudio source (input device). + +pa_sink_info *get_output_device_by_name(const char *sink_name); //Gets output device by name. + +void delete_output_devices(pa_sink_info **sinks); //Releases memory for allocated output devices. +void delete_input_devices(pa_source_info **sources); //Releases memory for allocated input devices. +pa_volume_t get_channel_volume(const pa_sink_info *sink_info, +unsigned int channel_index); //Retrieves the volume of a given channel. + +char* get_default_output(pa_context *context); //Gets default output device (default sink). + +char* get_default_input(pa_context *context); //Gets default input device (default source). + +pa_card_profile_info *get_profiles(pa_context *pa_ctx, +uint32_t card_index); //Gets pulseaudio profiles. + +int get_muted_output_status(const char *sink_name); //Queries whether a given audio output (sink) is muted or not. + + +#endif From 20daf19e35a3013369beb6e5dad08a7702f12b44 Mon Sep 17 00:00:00 2001 From: NMagic Date: Fri, 10 Nov 2023 08:32:17 -0300 Subject: [PATCH 12/20] Mute toggle improved! Added functionality to toggle mute for input devices. --- v-0.09/Makefile | 20 + .../pa_context -- interface overview.docx | Bin 0 -> 33970 bytes .../pavucontrol sink update flow.txt | 41 + .../pulseaudio/introspect.c summary | 79 + .../pulseaudio/mainloop code flow.txt | 17 + v-0.09/easypulse_core.c | 528 ++++ v-0.09/easypulse_core.h | 89 + v-0.09/examples/Makefile | 19 + v-0.09/examples/alsa-mapper_pulseaudio-api | Bin 0 -> 99192 bytes v-0.09/examples/alsa-mapper_pulseaudio-api.c | 91 + v-0.09/examples/change-speaker-mode | Bin 0 -> 93048 bytes v-0.09/examples/change-speaker-mode.c | 94 + v-0.09/examples/error.txt | 103 + .../examples/get-card-profiles-pulseaudio_api | Bin 0 -> 96640 bytes .../get-card-profiles-pulseaudio_api.c | 63 + v-0.09/examples/mute_input_demo | Bin 0 -> 95280 bytes v-0.09/examples/mute_input_demo.c | 89 + v-0.09/examples/mute_output_demo | Bin 0 -> 95280 bytes v-0.09/examples/mute_output_demo.c | 89 + v-0.09/examples/print-input-sources | Bin 0 -> 96440 bytes v-0.09/examples/print-input-sources.c | 92 + v-0.09/examples/print_volume_output_devices | Bin 0 -> 95952 bytes v-0.09/examples/print_volume_output_devices.c | 72 + v-0.09/examples/switch-sink | Bin 0 -> 93128 bytes v-0.09/examples/switch-sink-pulseaudio | Bin 0 -> 98248 bytes v-0.09/examples/switch-sink-pulseaudio.c | 62 + v-0.09/examples/switch-sink.c | 67 + v-0.09/examples/volume-change | Bin 0 -> 95112 bytes v-0.09/examples/volume-change-pulseaudio | Bin 0 -> 98088 bytes v-0.09/examples/volume-change-pulseaudio.c | 101 + v-0.09/examples/volume-change.c | 67 + v-0.09/libeasypulse_core.a | Bin 0 -> 34638 bytes v-0.09/system_query.c | 2375 +++++++++++++++++ v-0.09/system_query.h | 88 + 34 files changed, 4246 insertions(+) create mode 100644 v-0.09/Makefile create mode 100644 v-0.09/documentation/pa_context -- interface overview.docx create mode 100644 v-0.09/documentation/pavucontrol/pavucontrol sink update flow.txt create mode 100644 v-0.09/documentation/pulseaudio/introspect.c summary create mode 100644 v-0.09/documentation/pulseaudio/mainloop code flow.txt create mode 100644 v-0.09/easypulse_core.c create mode 100644 v-0.09/easypulse_core.h create mode 100644 v-0.09/examples/Makefile create mode 100755 v-0.09/examples/alsa-mapper_pulseaudio-api create mode 100644 v-0.09/examples/alsa-mapper_pulseaudio-api.c create mode 100755 v-0.09/examples/change-speaker-mode create mode 100644 v-0.09/examples/change-speaker-mode.c create mode 100644 v-0.09/examples/error.txt create mode 100755 v-0.09/examples/get-card-profiles-pulseaudio_api create mode 100644 v-0.09/examples/get-card-profiles-pulseaudio_api.c create mode 100755 v-0.09/examples/mute_input_demo create mode 100644 v-0.09/examples/mute_input_demo.c create mode 100755 v-0.09/examples/mute_output_demo create mode 100644 v-0.09/examples/mute_output_demo.c create mode 100755 v-0.09/examples/print-input-sources create mode 100644 v-0.09/examples/print-input-sources.c create mode 100755 v-0.09/examples/print_volume_output_devices create mode 100644 v-0.09/examples/print_volume_output_devices.c create mode 100755 v-0.09/examples/switch-sink create mode 100755 v-0.09/examples/switch-sink-pulseaudio create mode 100644 v-0.09/examples/switch-sink-pulseaudio.c create mode 100644 v-0.09/examples/switch-sink.c create mode 100755 v-0.09/examples/volume-change create mode 100755 v-0.09/examples/volume-change-pulseaudio create mode 100644 v-0.09/examples/volume-change-pulseaudio.c create mode 100644 v-0.09/examples/volume-change.c create mode 100644 v-0.09/libeasypulse_core.a create mode 100644 v-0.09/system_query.c create mode 100644 v-0.09/system_query.h diff --git a/v-0.09/Makefile b/v-0.09/Makefile new file mode 100644 index 0000000..b1c5107 --- /dev/null +++ b/v-0.09/Makefile @@ -0,0 +1,20 @@ +CC = gcc +CFLAGS = -Wall -g -Wextra + +LIB_NAME = easypulse_core +LIB_SRC = easypulse_core.c +LIB_OBJ = easypulse_core.o +LIB_OUT = lib$(LIB_NAME).a + +all: $(LIB_OUT) + +$(LIB_OUT): $(LIB_OBJ) + ar rcs $(LIB_OUT) $(LIB_OBJ) + +$(LIB_OBJ): $(LIB_SRC) + $(CC) $(CFLAGS) -c $(LIB_SRC) -o $(LIB_OBJ) + +clean: + rm -f $(LIB_OBJ) $(LIB_OUT) + +.PHONY: all clean diff --git a/v-0.09/documentation/pa_context -- interface overview.docx b/v-0.09/documentation/pa_context -- interface overview.docx new file mode 100644 index 0000000000000000000000000000000000000000..6cbe2d09c38dfcab843409c88d5b9d8666c90192 GIT binary patch literal 33970 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 literal 0 HcmV?d00001 diff --git a/v-0.09/documentation/pavucontrol/pavucontrol sink update flow.txt b/v-0.09/documentation/pavucontrol/pavucontrol sink update flow.txt new file mode 100644 index 0000000..9428de8 --- /dev/null +++ b/v-0.09/documentation/pavucontrol/pavucontrol sink update flow.txt @@ -0,0 +1,41 @@ ++----------------+ +| pavucontrol | +| (initial file)| ++----------------+ + | + | Callback function triggered when there's info/change related to a sink + V ++----------------+ +| sink_cb | +| (pavucontrol.cc)| ++----------------+ + | + | - If error, show error and return + | - If end-of-list (eol) is reached, decrease outstanding tasks count and return + | - Update GUI representation of a sink using w->updateSink() + V ++---------------------------+ +| MainWindow::updateSink | +| (mainwindow.cc & .h) | ++---------------------------+ + | + | - Retrieve or create SinkWidget for the sink + | - Update SinkWidget properties (e.g., volume, mute state, active port, etc.) + | - Prepare context menu for the sink + | - Ensure the sink is displayed correctly via updateDeviceVisibility + V ++-------------------------------------+ +| MainWindow::updateDeviceVisibility | +| (mainwindow.cc & .h) | ++-------------------------------------+ + | + | - If idle source/callback is already queued, return + | - Schedule the idle_cb function to be called when the app is idle + V ++----------------+ +| idle_cb | +| (mainwindow.cc)| ++----------------+ + | + V + ... (Specific steps and logic for updating device visibility) diff --git a/v-0.09/documentation/pulseaudio/introspect.c summary b/v-0.09/documentation/pulseaudio/introspect.c summary new file mode 100644 index 0000000..d9616f2 --- /dev/null +++ b/v-0.09/documentation/pulseaudio/introspect.c summary @@ -0,0 +1,79 @@ +* !pa_tagstruct_eof (context_string_callback): this function seems to be a callback function for processing string responses from the server. It examines the incoming command and checks for errors. If there's an error or if the command isn't a reply, it sets the success flag to 0 and prepares an empty response string. If the command is a reply, it extracts the response string from the tag structure. If there's any issue with extracting the string or if there's unexpected data in the tag structure, it flags a protocol error. + +* pa_context_stat: this function sends a simple command to request statistics. It leverages another function pa_context_send_simple_command and provides the context_stat_callback as the callback function to handle the response. It's used to retrieve statistical information. + +* pa_context_get_server_info: similar to the previous function, this function sends a command to get server information. It again uses pa_context_send_simple_command, but this time with a different callback, context_get_server_info_callback, to process the server information response. + +* context_get_sink_info_callback: this function is a callback that processes information about a sink. It first ensures that the operation and context are valid. If the received command is not a reply, it handles the error. If it is a reply, it starts parsing the sink information from the tag structure, extracting details like the sink's name, description, sample specification, channel map, owner module, volume, mute status, monitor source, latency, and more. The function seems to account for different versions of the context and extracts varying levels of information based on that. + +* pa_tagstruct_getu32: this function seems to be a snippet or part of another function and is possibly not a standalone function. It attempts to retrieve a 32-bit unsigned integer from a tag structure. If unsuccessful, it returns an error indicating a protocol issue. + +* pa_context_get_sink_info_list: this function sends a command to retrieve a list of sink information. It utilizes the pa_context_send_simple_command function and provides the context_get_sink_info_callback as the callback to process the list of sinks. + +* pa_context_get_sink_info_by_index: this function requests information about a specific sink identified by its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SINK_INFO) with the specified sink index and sends it to the server. The response from the server is expected to be handled by the context_get_sink_info_callback. + +* pa_context_get_sink_info_by_name: similar to the previous function, this one requests information about a sink, but it identifies the sink by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SINK_INFO) with the specified sink name to the server. The server's response will be processed by the context_get_sink_info_callback. + +* pa_context_set_sink_port_by_index: this function is designed to set the port for a specific sink identified by its index. After some validity checks, it builds a command (PA_COMMAND_SET_SINK_PORT) with the given sink index and port information, then sends this command to the server. The acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_sink_port_by_name: this function sets the port of a sink based on its name. It first performs some validation checks, then constructs a command with the sink's name and desired port. This command is sent to the PulseAudio server, and the response will be handled by a generic acknowledgment callback. + +* context_get_source_info_callback: this callback function processes information about a source. It starts by performing some initializations and checks. If the received command is a reply, it begins parsing the source information from the tag structure. This includes extracting details like the source's name, description, sample specification, volume, mute status, latency, and more. It appears to accommodate different versions of the context, extracting varying levels of information based on that. + +* pa_context_get_source_info_list: this function sends a command to retrieve a list of source information. It employs the pa_context_send_simple_command function, providing the context_get_source_info_callback as the callback to process the list of sources. + +* pa_context_get_source_info_by_index: this function retrieves information about a specific audio source based on its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source index and sends it to the server. The response from the server is expected to be handled by the context_get_source_info_callback. + +* pa_context_get_source_info_by_name: similar to the previous function, this one retrieves information about a source but identifies the source by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source name to the server. The server's response is again expected to be processed by the context_get_source_info_callback. + +* pa_context_set_source_port_by_index: this function sets the port of a specific source based on its index. After performing some validity checks and ensuring that the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source index. This command is sent to the server, and the acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_source_port_by_name: this function is designed to set the port of a specific audio source based on its name. It constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source name and sends this command to the PulseAudio server. The server's response will be handled by a generic acknowledgment callback. + +* context_get_client_info_callback: This callback function processes client-related information. It first performs checks to ensure the received command is a reply. If it is, the function begins parsing the client information, extracting details like client index, name, owner module, and driver. The function appears to be prepared to handle multiple client records in the same response and will loop through them until the end of the tag structure. + +* pa_context_get_client_info: this function requests information about a specific client based on its index. It constructs and sends a command (PA_COMMAND_GET_CLIENT_INFO) with the specified client index to the server. The server's response is expected to be processed by the context_get_client_info_callback. + +* pa_context_get_client_info_list: this function requests a list of client information from the PulseAudio server. It utilizes the pa_context_send_simple_command function and specifies the PA_COMMAND_GET_CLIENT_INFO_LIST command. The response from the server is expected to be handled by the context_get_client_info_callback. + + +* card_info_free: this is a utility function designed to free the memory associated with a pa_card_info structure. It releases memory for various properties and profiles associated with the card, such as its property list (proplist), profiles (profiles), and extended profile information (profiles2). + +* fill_card_port_info: this function populates the port information for a given card. It starts by extracting the number of ports (n_ports) for the card from a tag structure. If the card has ports, it then proceeds to fill in details about each port. If there's a protocol error while fetching the details, it returns an error. + +* fill_card_profile_info: this function is responsible for populating the profile information of a given card. It begins by allocating memory for the profiles and then proceeds to iterate through each profile, extracting details like name, description, number of sinks, number of sources, and priority. It also accounts for different versions of the context, fetching additional details if the version is >= 29. + + +* context_get_card_info_callback: this callback function processes card-related information. It starts by performing initialization checks and then examines the received command. If the command is a reply, the function starts parsing card details like index, name, owner module, driver, and the number of profiles. It then calls the fill_card_profile_info function to populate the profiles for the card. If there are any protocol errors during this process, the function handles them accordingly. + + +* pa_tagstruct_get_proplist: This function seems to be a snippet or a partial representation of a larger function. Its purpose appears to be to extract a property list (proplist) from a tag structure. If there's any issue during this extraction, it flags an error. + + +* pa_context_get_card_info_by_index: this function requests information about a specific card based on its index. After performing several validity checks, it constructs a command (PA_COMMAND_GET_CARD_INFO) with the specified card index and sends it to the server. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_by_name: similar to the previous function, this one requests information about a card, but it identifies the card by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_CARD_INFO) with the specified card name to the server. Again, the server's response is expected to be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_list: this function requests a list of all card information from the PulseAudio server. It employs the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_CARD_INFO_LIST command. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_set_card_profile_by_index: this function sets the profile of a specific card based on its index. After checking the validity of the context and ensuring the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the specified card index and desired profile. This command is sent to the server, and the response is handled by a generic acknowledgment callback. + +* pa_context_set_card_profile_by_name: this function sets the profile of a card identified by its name. Like the previous function, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the card name and desired profile, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_module_info_callback: this callback function processes module-related information. It checks if the received command is a reply and, if so, starts parsing the module details. This includes extracting details like the module's index, name, argument, and usage count. If there's an error or unexpected end of file in the tag structure, it flags a protocol error. + +* pa_context_get_module_info: this function retrieves information about a specific module based on its index. After conducting various validity checks, it constructs a command (PA_COMMAND_GET_MODULE_INFO) with the specified module index and sends it to the server. The response from the server will be processed by the context_get_module_info_callback. + +* pa_context_get_module_info_list: this function requests a list of all module information from the PulseAudio server. It uses the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_MODULE_INFO_LIST command. The server's response will be processed by the context_get_module_info_callback. + +* context_get_sink_input_info_callback: this callback function processes information related to sink inputs. It checks if the received command is a reply and, if so, starts parsing the sink input details. This includes extracting details like the sink input's index, name, owner module, client, sink, sample specification, channel map, volume, buffer usec, sink usec, resample method, driver, and more. It also accounts for different versions of the context, extracting varying levels of information based on that. + +* pa_context_set_source_output_volume: this function sets the volume of a specific source output based on its index. It starts by performing various checks, including verifying the validity of the provided volume. It then constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_VOLUME) with the specified source output index and volume and sends it to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_set_source_output_mute: this function mutes or unmutes a specific source output based on its index. It constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_MUTE) with the desired mute status and the source output index, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_sample_info_callback: this callback function processes sample-related information. It checks if the received command is a reply and, if so, begins parsing the sample details, extracting attributes like the sample's index, name, volume, mute status, proplist, and more. The function also handles possible protocol errors and is prepared to process multiple sample records in the same response. + +* pa_context_suspend_source_by_index: this function suspends or resumes a specific source based on its index. It verifies the server version, constructs a command (PA_COMMAND_SUSPEND_SOURCE) with the desired suspend status and source index, and then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_send_message_to_object: this function sends a message to a specific object within the PulseAudio server. After checking the server version and other conditions, it constructs a command (PA_COMMAND_SEND_OBJECT_MESSAGE) with the object's path, the message, and any additional parameters. The server's response will be processed by a callback function. diff --git a/v-0.09/documentation/pulseaudio/mainloop code flow.txt b/v-0.09/documentation/pulseaudio/mainloop code flow.txt new file mode 100644 index 0000000..f4c8b96 --- /dev/null +++ b/v-0.09/documentation/pulseaudio/mainloop code flow.txt @@ -0,0 +1,17 @@ ++---------------------------------------------+ +| Mainloop | +| | +| +--------------+ +-------------------+ | +| | I/O Events | | Timers | | +| +--------------+ +-------------------+ | +| | +| +--------------+ +-------------------+ | +| | Signals | | Deferred Callbacks| | +| +--------------+ +-------------------+ | +| | +| +---------------------+ | +| | Other Asynchronous | | +| | Tasks | | +| +---------------------+ | +| | ++---------------------------------------------+ diff --git a/v-0.09/easypulse_core.c b/v-0.09/easypulse_core.c new file mode 100644 index 0000000..e3bf574 --- /dev/null +++ b/v-0.09/easypulse_core.c @@ -0,0 +1,528 @@ +/** + * @file easypulse_core.c + * @brief Implementation of the easypulse core functions. + * + * This file provides the core functionality to interact with PulseAudio, + * allowing operations like setting the default device and adjusting volume. + */ + +#include "easypulse_core.h" +#include "system_query.h" +#include +#include +#include +#include + +static bool manager_initialize(pulseaudio_manager *self); +static void iterate(pulseaudio_manager *manager, pa_operation *op); + +/** + * @brief Creates a new pulseaudio_manager instance. + * + * This function allocates memory for a new pulseaudio_manager instance and initializes it. + * It allocates memory for the output and input devices based on the current system state, + * and initializes the PulseAudio context and mainloop. It also sets the active output and + * input devices. + * + * If any memory allocation or initialization operation fails, the function cleans up any + * resources that were successfully allocated or initialized, and returns NULL. + * + * @return A pointer to the newly created pulseaudio_manager instance, or NULL if the + * creation failed. + */ +pulseaudio_manager *manager_create(void) { + pulseaudio_manager *self = malloc(sizeof(pulseaudio_manager)); + if (!self) { + fprintf(stderr, "Failed to allocate memory for pulseaudio_manager.\n"); + return NULL; + } + + // Zero-initialize the structure to set sensible defaults + memset(self, 0, sizeof(pulseaudio_manager)); + + // Initialize manager's PulseAudio main loop and context + if (!manager_initialize(self)) { + fprintf(stderr, "Failed to initialize pulseaudio_manager.\n"); + free(self); + return NULL; + } + + // Get the count of output and input devices + self->output_count = get_output_device_count(); + self->input_count = get_input_device_count(); + + // Allocate memory for outputs + if (self->output_count > 0) { + self->outputs = calloc(self->output_count, sizeof(pulseaudio_device)); + if (!self->outputs) { + fprintf(stderr, "Failed to allocate memory for outputs.\n"); + manager_cleanup(self); + return NULL; + } + // Retrieve and populate output devices + pa_sink_info **output_devices = get_available_output_devices(); + + for (uint32_t i = 0; i < self->output_count; ++i) { + self->outputs[i].index = output_devices[i]->index; + self->outputs[i].name = strdup(output_devices[i]->description); + self->outputs[i].code = strdup(output_devices[i]->name); + self->outputs[i].sample_rate = get_output_sample_rate(get_alsa_output_id(output_devices[i]->name), output_devices[i]); + self->outputs[i].max_channels = get_max_output_channels(get_alsa_output_id(output_devices[i]->name), output_devices[i]); + self->outputs[i].min_channels = get_min_output_channels(get_alsa_output_id(output_devices[i]->name), output_devices[i]); + self->outputs[i].channel_names = get_output_channel_names(output_devices[i]->name, self->outputs[i].max_channels); + // Add any additional fields to populate + } + free(output_devices); + } + + // Allocate memory for inputs + if (self->input_count > 0) { + self->inputs = calloc(self->input_count, sizeof(pulseaudio_device)); + if (!self->inputs) { + fprintf(stderr, "Failed to allocate memory for inputs.\n"); + manager_cleanup(self); + return NULL; + } + // Retrieve and populate input devices + pa_source_info **input_devices = get_available_input_devices(); + + for (uint32_t i = 0; i < self->input_count; ++i) { + self->inputs[i].index = input_devices[i]->index; + self->inputs[i].name = strdup(input_devices[i]->description); + self->inputs[i].code = strdup(input_devices[i]->name); + self->inputs[i].sample_rate = get_input_sample_rate(get_alsa_input_id(input_devices[i]->name), input_devices[i]); + self->inputs[i].max_channels = get_max_input_channels(get_alsa_input_id(input_devices[i]->name), input_devices[i]); + self->inputs[i].min_channels = get_min_input_channels(get_alsa_input_id(input_devices[i]->name), input_devices[i]); + self->inputs[i].channel_names = get_input_channel_names(input_devices[i]->name, self->inputs[i].max_channels); + // Add any additional fields to populate + } + free(input_devices); + } + + // Set the default output and input devices + self->active_output_device = strdup(get_default_output(self->context)); + self->active_input_device = strdup(get_default_input(self->context)); + + // Check that the active devices were set + if (!self->active_output_device || !self->active_input_device) { + fprintf(stderr, "Failed to set the active output or input device.\n"); + manager_cleanup(self); + return NULL; + } + + // Don't forget to clean up the temporary lists of devices after you're done with them + + return self; +} + + +/** + * @brief Callback function for handling PulseAudio context state changes. + * + * This callback is invoked by the PulseAudio mainloop when the context state changes. + * It updates the `pa_ready` flag in the pulseaudio_manager structure based on the + * context's state. The `pa_ready` flag is set to 1 when the context is ready, and + * to 2 when the context has failed or terminated. This callback will signal the + * mainloop to continue its operations whenever the state changes to either READY, + * FAILED, or TERMINATED. + * + * @param c Pointer to the PulseAudio context. + * @param userdata User-provided pointer to the pulseaudio_manager structure. + */ +static void manager_initialize_cb(pa_context *c, void *userdata) { + pa_context_state_t state; + pulseaudio_manager *manager = (pulseaudio_manager *) userdata; + int *pa_ready = &(manager->pa_ready); + pa_threaded_mainloop *m = manager->mainloop; + + state = pa_context_get_state(c); + switch (state) { + // There are other states you can handle, but these are the important ones + case PA_CONTEXT_CONNECTING: + case PA_CONTEXT_AUTHORIZING: + case PA_CONTEXT_SETTING_NAME: + default: + break; + case PA_CONTEXT_READY: + *pa_ready = 1; + pa_threaded_mainloop_signal(m, 0); + break; + case PA_CONTEXT_FAILED: + case PA_CONTEXT_TERMINATED: + *pa_ready = 2; + pa_threaded_mainloop_signal(m, 0); + break; + } +} + + +/** + * @brief Initializes the PulseAudio manager. + * + * This function sets up the PulseAudio threaded mainloop and context for the given manager. + * It creates the mainloop, context, and connects to the PulseAudio server, then starts + * the mainloop and waits for the context to be ready. It also sets up a state callback + * to handle the context state changes. + * + * @param self Pointer to the pulseaudio_manager structure to be initialized. + * @return Returns true if initialization is successful, false otherwise. + * + * @note The function will clean up allocated resources and return false if any step + * of the initialization fails. + */ +static bool manager_initialize(pulseaudio_manager *self) { + // 1. Create the threaded mainloop + self->mainloop = pa_threaded_mainloop_new(); + if (!self->mainloop) { + return false; + } + + // Get the mainloop API + pa_mainloop_api *mlapi = pa_threaded_mainloop_get_api(self->mainloop); + + // Create the context + self->context = pa_context_new(mlapi, "PulseAudio Manager"); + if (!self->context) { + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // Set the state callback + pa_context_set_state_callback(self->context, manager_initialize_cb, self); + + // Lock the mainloop and connect the context + pa_threaded_mainloop_lock(self->mainloop); + + if (pa_context_connect(self->context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) { + pa_threaded_mainloop_unlock(self->mainloop); + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // 2. Start the threaded mainloop + pa_threaded_mainloop_start(self->mainloop); + + // 4. Wait for the context to be ready + while (self->pa_ready == 0) { + pa_threaded_mainloop_wait(self->mainloop); + } + + pa_threaded_mainloop_unlock(self->mainloop); + + if (self->pa_ready == 2) { + return false; + } + + return true; +} + +/** + * Cleans up and frees all resources associated with a pulseaudio_manager object. + * This function ensures that all memory allocated for output and input devices + * within the manager is released. It includes freeing of all associated strings, + * channel names, and profile data. Additionally, it shuts down and frees the + * PulseAudio context and mainloop, if they have been initialized. + * + * @param manager A pointer to the pulseaudio_manager object to be cleaned up. + * If the pointer is NULL, the function does nothing. + */ +void manager_cleanup(pulseaudio_manager *manager) { + if (manager) { + // Free output devices + if (manager->outputs) { + for (uint32_t i = 0; i < manager->output_count; ++i) { + free(manager->outputs[i].code); + free(manager->outputs[i].name); + free(manager->outputs[i].alsa_id); + if (manager->outputs[i].channel_names) { + for (int j = 0; j < manager->outputs[i].max_channels; ++j) { + free(manager->outputs[i].channel_names[j]); + } + free(manager->outputs[i].channel_names); + } + if (manager->outputs[i].profiles) { + for (uint32_t j = 0; j < manager->outputs[i].profile_count; ++j) { + free((char*)manager->outputs[i].profiles[j].name); + free((char*)manager->outputs[i].profiles[j].description); + } + free(manager->outputs[i].profiles); + } + } + free(manager->outputs); // Finally free the array itself + } + + // Free input devices + if (manager->inputs) { + for (uint32_t i = 0; i < manager->input_count; ++i) { + free(manager->inputs[i].code); + free(manager->inputs[i].name); + free(manager->inputs[i].alsa_id); + if (manager->inputs[i].channel_names) { + for (int j = 0; j < manager->inputs[i].max_channels; ++j) { + free(manager->inputs[i].channel_names[j]); + } + free(manager->inputs[i].channel_names); + } + if (manager->inputs[i].profiles) { + for (uint32_t j = 0; j < manager->inputs[i].profile_count; ++j) { + free((char*)manager->inputs[i].profiles[j].name); + free((char*)manager->inputs[i].profiles[j].description); + } + free(manager->inputs[i].profiles); + } + } + free(manager->inputs); // Finally free the array itself + } + + // Free the names of active output and input devices + free(manager->active_output_device); + free(manager->active_input_device); + + // Disconnect and unreference the context if it's there + if (manager->context) { + // Check if the context is in a state that can be disconnected + if (pa_context_get_state(manager->context) == PA_CONTEXT_READY) { + pa_context_disconnect(manager->context); + } + pa_context_unref(manager->context); + } + + // Stop and free the mainloop if it's there + if (manager->mainloop) { + pa_threaded_mainloop_stop(manager->mainloop); + pa_threaded_mainloop_free(manager->mainloop); + } + + // Free the manager itself + free(manager); + } +} + + + + +/** + * @brief Iterates through operations in the pulseaudio_manager. + * + * @param manager Pointer to the pulseaudio_manager instance. + * @param op Pointer to the pa_operation instance. + */ +static void iterate(pulseaudio_manager *manager, pa_operation *op) { + //Leaves if operation is invalid. + if (!op) return; + + bool is_in_mainloop_thread = pa_threaded_mainloop_in_thread(manager->mainloop); + + // If we're not in the mainloop thread, lock it. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_lock(manager->mainloop); + } + + //Wait for the operation to complete. + //The signaling to continue is performed inside the callback operation (op). + pa_threaded_mainloop_wait(manager->mainloop); + + //Cleaning up. + pa_operation_unref(op); + + // If we locked the mainloop earlier, unlock it now. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_unlock(manager->mainloop); + } +} + +/** + * @brief Callback function for setting master volume on a device. + * + * This function is called when the asynchronous operation to set the volume + * for a sink completes. It will signal the mainloop to stop waiting. + * + * @param c The PulseAudio context. + * @param success Non-zero if the operation succeeded, zero if it failed. + * @param userdata The userdata passed to the function, a pointer to the pulseaudio_manager. + */ +void manager_set_master_volume_cb(pa_context *c, int success, void *userdata) { + (void) c; + + pulseaudio_manager *manager = (pulseaudio_manager *)userdata; + + // Check if the operation was successful + if (success) { + printf("Volume set successfully.\n"); + } else { + printf("Failed to set volume.\n"); + } + + // Signal the mainloop to stop waiting + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + +/** + * @brief Sets the master volume of a given device. + * + * This function sets the master volume of a device specified by its PulseAudio ID. + * + * @param manager Pointer to the pulseaudio_manager instance. + * @param device_id The PulseAudio ID of the device. + * @param volume The new volume level to set. This should be a value between 0 (mute) and 100 (maximum volume). + * @return 0 if the operation was successful, or a non-zero error code if the operation failed. + */ +/** + * @brief Sets the master volume of a given device. + * + * This function sets the master volume of a device specified by its PulseAudio ID. + * + * @param manager Pointer to the pulseaudio_manager instance. + * @param device_id The PulseAudio ID of the device. + * @param volume The new volume level to set. This should be a value between 0 (mute) and 100 (maximum volume). + * @return 0 if the operation was successful, or a non-zero error code if the operation failed. + */ +int manager_set_master_volume(pulseaudio_manager *manager, uint32_t device_id, int volume) { + if (!manager) { + fprintf(stderr, "Manager is NULL\n"); + return -1; + } + + if(volume < 0 || volume > 100) { + fprintf(stderr, "[manager_set_master_volume] The volume specified is out of range (0-100).\n"); + return -1; + } + + // Fetch the sink information for the device ID + const pa_sink_info *sink_info = get_output_device_by_index(device_id); + if (!sink_info) { + fprintf(stderr, "Could not retrieve sink info for device ID %u\n", device_id); + return -1; + } + + // Calculate the PA volume from the provided percentage + pa_volume_t pa_volume = (pa_volume_t) ((double) volume / 100.0 * PA_VOLUME_NORM); + + // Initialize a pa_cvolume structure and set the volume for all channels + pa_cvolume cvolume; + pa_cvolume_set(&cvolume, sink_info->channel_map.channels, pa_volume); + + // Start the asynchronous operation to set the sink volume + pa_operation *op = pa_context_set_sink_volume_by_index(manager->context, device_id, &cvolume, manager_set_master_volume_cb, manager); + if (!op) { + fprintf(stderr, "Failed to start volume set operation\n"); + return -1; + } + + // Wait for the operation to complete + iterate(manager, op); + + return 0; +} + +/** + * @brief Callback function for handling the completion of an output mute toggle operation. + * + * This function is invoked by the PulseAudio main loop upon the completion of an operation + * to toggle the mute state of an output device (sink). It is used in conjunction with + * `pa_context_set_sink_mute_by_index` as part of the `manager_toggle_output_mute` function. + * The callback checks if the mute toggle operation was successful and signals the mainloop + * to continue processing. + * + * @param c Pointer to the PulseAudio context, not used in this callback. + * @param success An integer indicating the success of the mute toggle operation. + * A non-zero value indicates success, while zero indicates failure. + * @param userdata User data provided when initiating the operation; expected to be a pointer + * to a `pulseaudio_manager` instance. + * + */ +static void manager_toggle_output_mute_cb(pa_context *c, int success, void *userdata) { + (void) c; + + pulseaudio_manager *manager = (pulseaudio_manager *) userdata; + if (!success) { + fprintf(stderr, "Failed to toggle mute state.\n"); + } + + // Signal the mainloop to continue + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + + +/** + * Toggle the mute state of a given output device. + * + * @param manager A pointer to the initialized pulseaudio_manager instance. + * @param index The index of the output device to toggle mute state. + * @param state The desired mute state (1 for ON/mute, 0 for OFF/unmute). + * @return Returns 0 on success, -1 on failure. + */ +int manager_toggle_output_mute(pulseaudio_manager *manager, uint32_t index, int state) { + + if (!manager || !manager->context) { + fprintf(stderr, "Invalid PulseAudio manager or context.\n"); + return -1; + } + + if (index >= manager->output_count) { + fprintf(stderr, "Output device index out of range.\n"); + return -1; + } + + pa_operation *op = pa_context_set_sink_mute_by_index(manager->context, + index, state, manager_toggle_output_mute_cb, manager); + + iterate(manager, op); + + return 0; +} + +/** + * @brief Callback function for handling the completion of an input mute toggle operation. + * + * This function is called by the PulseAudio main loop when the operation to toggle + * the mute state of an input device (source) is completed. The function is used in + * conjunction with `pa_context_set_source_mute_by_index` within the `manager_toggle_input_mute` + * function. It checks if the operation was successful and signals the mainloop to continue. + * + * @param c Pointer to the PulseAudio context. This parameter is not used in this callback. + * @param success An integer indicating the success of the mute toggle operation. + * Non-zero value indicates success, zero indicates failure. + * @param userdata User data provided when initiating the operation; expected to be a pointer + * to a `pulseaudio_manager` instance. + * + */ +static void manager_toggle_input_mute_cb(pa_context *c, int success, void *userdata) { + (void) c; + + pulseaudio_manager *manager = (pulseaudio_manager *) userdata; + if (!success) { + fprintf(stderr, "Failed to toggle input mute state.\n"); + } + + // Signal the mainloop to continue + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + +/** + * Toggle the mute state of a given input device. + * + * @param manager A pointer to the initialized pulseaudio_manager instance. + * @param index The index of the input device to toggle mute state. + * @param state The desired mute state (1 for ON/mute, 0 for OFF/unmute). + * @return Returns 0 on success, -1 on failure. + */ +int manager_toggle_input_mute(pulseaudio_manager *manager, uint32_t index, int state) { + + if (!manager || !manager->context) { + fprintf(stderr, "Invalid PulseAudio manager or context.\n"); + return -1; + } + + if (index >= manager->input_count) { + fprintf(stderr, "Input device index out of range.\n"); + return -1; + } + + pa_operation *op = pa_context_set_source_mute_by_index(manager->context, + index, state, manager_toggle_input_mute_cb, manager); + + iterate(manager, op); + + return 0; +} diff --git a/v-0.09/easypulse_core.h b/v-0.09/easypulse_core.h new file mode 100644 index 0000000..be7b003 --- /dev/null +++ b/v-0.09/easypulse_core.h @@ -0,0 +1,89 @@ +/** + * @file core.h + * @brief EasyPulse Library Header. + * + * EasyPulse is a library designed to provide pseudo-object oriented programming + * functions to simplify access to PulseAudio. + */ + +#ifndef EASPYPULSE_CORE_H +#define EASPYPULSE_CORE_H +#include +#define DEBUG_MODE 0 // Debug mode flag + +#include +#include "system_query.h" +#include +#include +#include + +// Forward declarations +typedef struct pulseaudio_manager pulseaudio_manager; +typedef struct pulseaudio_device pulseaudio_device; +typedef struct pulseaudio_volume pulseaudio_volume; + + +typedef struct { + char *name; // Name of the profile + char *description; // Description of the profile + uint32_t channels; // Number of channels this profile has +} pulseaudio_profile; + +//Internal volume information. +typedef struct _internal_volume { + uint32_t index; + char *code; //Pulseaudio name of the volume. + pa_cvolume *volume; //Volume representation. + pa_channel_map *cmap; //Channel map representation. + +} internal_volume; + +/** + * @brief Represents a PulseAudio device. + */ +struct pulseaudio_device { + uint32_t index; // Index of the device. + char *code; // Pulseaudio name of the device. + char *name; // Pulseaudio description of the device. + char *alsa_id; // Alsa ID of the device. + int sample_rate; // Current sample rate of the device. + pa_card_profile_info *active_profile; // Active alsa profile of this device. + char **channel_names; // Public channel names. + int master_volume; // Average volume of all channels (in percentage). + int *channel_volume; // Volume of each individual channel (in percentage). + bool mute; // Mute status of the devices (true for muted, false for unmuted). + int min_channels; // The minimum number of channels of the device. + int max_channels; // The maximum number of channels of the device. + pa_card_profile_info *profiles; // Array of available profiles for the device + uint32_t profile_count; // Number of available profiles +}; + +/** + * @brief Represents the main manager for PulseAudio operations. + */ +struct pulseaudio_manager { + pa_threaded_mainloop *mainloop; // Mainloop for PulseAudio operations. + pa_context *context; // PulseAudio context. + pulseaudio_device *outputs; // Array of available output devices. + pulseaudio_device *inputs; // Array of available input devices. + int pa_ready; // Indicates if PulseAudio is ready (1 for ready, 2 for error). + int devices_loaded; // Indicates if devices are loaded (0 for not loaded, 1 for loaded successfully, 2 for error). + char *active_output_device; // Pointer to active output device. + char *active_input_device; // Pointer to active input device. + uint32_t output_count; // Number of pulseaudio sinks (outputs). + uint32_t input_count; // Number of pulseaudio sources (inputs). +}; + +pulseaudio_manager *manager_create(void); +void manager_cleanup(pulseaudio_manager *manager); //Cleans up the manager. + +int manager_set_master_volume(pulseaudio_manager *manager, +uint32_t device_id, int volume); //Sets the master volume of a given volume. + +int manager_toggle_output_mute(pulseaudio_manager *manager, +uint32_t index, int state); //Toggles the volume of output device to muted / unmuted. + +int manager_toggle_input_mute(pulseaudio_manager *manager, +uint32_t index, int state); //Toggles the volume of input device to muted / unmuted. + +#endif // CORE_H diff --git a/v-0.09/examples/Makefile b/v-0.09/examples/Makefile new file mode 100644 index 0000000..6f11288 --- /dev/null +++ b/v-0.09/examples/Makefile @@ -0,0 +1,19 @@ +CC = gcc +CFLAGS = -Wall -Wextra -g -O0 + +LIB_DIR = ../ +LIB_SRC = $(LIB_DIR)*.c + +EXAMPLES_DIR = . +EXAMPLES_SRC = $(wildcard $(EXAMPLES_DIR)/*.c) +EXAMPLES_OUT = $(patsubst $(EXAMPLES_DIR)/%.c,$(EXAMPLES_DIR)/%,$(EXAMPLES_SRC)) + +all: $(EXAMPLES_OUT) + +$(EXAMPLES_DIR)/%: $(EXAMPLES_DIR)/%.c + $(CC) $(CFLAGS) $< $(LIB_SRC) -o $@ -lpulse -lasound + +clean: + rm -f $(EXAMPLES_DIR)/*~ $(EXAMPLES_OUT) + +.PHONY: all clean diff --git a/v-0.09/examples/alsa-mapper_pulseaudio-api b/v-0.09/examples/alsa-mapper_pulseaudio-api new file mode 100755 index 0000000000000000000000000000000000000000..d9b8eb4bac3d581c7d5a8f66d0edb153ca1b152c GIT binary patch literal 99192 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 E0+-`1!vFvP literal 0 HcmV?d00001 diff --git a/v-0.09/examples/alsa-mapper_pulseaudio-api.c b/v-0.09/examples/alsa-mapper_pulseaudio-api.c new file mode 100644 index 0000000..47eb39b --- /dev/null +++ b/v-0.09/examples/alsa-mapper_pulseaudio-api.c @@ -0,0 +1,91 @@ +/** + * @file pulseaudio_alsa_mapper.c + * @brief Demonstrates how to map PulseAudio sinks to their corresponding ALSA device names. + */ + +#include +#include +#include +#include + +static const char* get_alsa_friendly_name(int card_num) { + snd_ctl_t *ctl; + char name[128]; + snprintf(name, sizeof(name), "hw:%d", card_num); + + if (snd_ctl_open(&ctl, name, 0) < 0) { + return NULL; + } + + snd_ctl_card_info_t *info; + snd_ctl_card_info_alloca(&info); + if (snd_ctl_card_info(ctl, info) < 0) { + snd_ctl_close(ctl); + return NULL; + } + + const char *friendly_name = strdup(snd_ctl_card_info_get_name(info)); + snd_ctl_close(ctl); + return friendly_name; +} + +static void sink_info_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) userdata; + + if (eol > 0) { + pa_context_disconnect(c); + return; + } + + const char *udev_description = pa_proplist_gets(info->proplist, "device.description"); + const char *card_str = pa_proplist_gets(info->proplist, "alsa.card"); + const char *device_str = pa_proplist_gets(info->proplist, "alsa.device"); + + int card_num = card_str ? atoi(card_str) : -1; + const char *friendly_name = card_num != -1 ? get_alsa_friendly_name(card_num) : NULL; + + if (udev_description && card_str && device_str) { + printf("Sink: %s, UDEV description: %s, ALSA name: hw:%s,%s", info->name, udev_description, card_str, device_str); + if (friendly_name) { + printf(", Friendly ALSA name: %s", friendly_name); + free((void*)friendly_name); + } + printf("\n"); + } else if (udev_description) { + printf("Sink: %s, UDEV description: %s, Incomplete ALSA name information.\n", info->name, udev_description); + } +} + +static void context_state_cb(pa_context *c, void *userdata) { + switch (pa_context_get_state(c)) { + case PA_CONTEXT_READY: + pa_context_get_sink_info_list(c, sink_info_cb, NULL); + break; + case PA_CONTEXT_FAILED: + case PA_CONTEXT_TERMINATED: + pa_mainloop_quit((pa_mainloop*)userdata, 0); + break; + default: + break; + } +} + +int main(void) { + pa_mainloop *mainloop; + pa_mainloop_api *mainloop_api; + pa_context *context; + + mainloop = pa_mainloop_new(); + mainloop_api = pa_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "udev_description_fetcher"); + + pa_context_set_state_callback(context, context_state_cb, mainloop); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + + pa_mainloop_run(mainloop, NULL); + + pa_context_unref(context); + pa_mainloop_free(mainloop); + + return 0; +} diff --git a/v-0.09/examples/change-speaker-mode b/v-0.09/examples/change-speaker-mode new file mode 100755 index 0000000000000000000000000000000000000000..ab10a14cef761dba172240918cdc3d9420374738 GIT binary patch literal 93048 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 literal 0 HcmV?d00001 diff --git a/v-0.09/examples/change-speaker-mode.c b/v-0.09/examples/change-speaker-mode.c new file mode 100644 index 0000000..9bfc03d --- /dev/null +++ b/v-0.09/examples/change-speaker-mode.c @@ -0,0 +1,94 @@ +/** + * @file sample_program.c + * @brief PulseAudio Mode Selector + * + * This program is designed to manage the audio mode of the active PulseAudio sink. + * + * The program performs the following tasks: + * - Initializes the PulseAudio manager. + * - Detects and displays the current mode of the active device. + * - Lists audio modes supported by the active device based on its number of channels. + * - Prompts the user to select a desired mode from the list. + * - Sets the active device to the mode selected by the user. + * + * The available modes include: mono, stereo, 4.0, 5.0, 5.1, and 7.1. The program lists + * modes dynamically, ensuring that only those supported by the active device are presented. + * + * @date 10-15-2023 (creation date) + */ + +#if 0 +#include "../easypulse_core.h" +#include + +int main(void) { + // Initialize the pulseaudio_manager + pulseaudio_manager *manager = new_manager(); + //pulseaudio_manager *self = manager; + + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudio manager.\n"); + return 1; + } + + + // Detect the current mode of the active device + const char* current_mode = manager->get_device_mode_by_code(manager, manager->active_device->code); + printf("Current mode of the active device (%s): %s\n", manager->active_device->code, current_mode); + + // List available modes based on the number of channels of the active device + printf("\nAvailable modes:\n"); + printf("1. mono\n"); + printf("2. stereo\n"); + + int max_choice = 2; // To keep track of the maximum mode choice number + uint32_t channels = manager->active_device->number_of_channels; + + if (channels >= 4) { + printf("3. 4.0\n"); + max_choice = 3; + } + if (channels >= 5) { + printf("4. 5.0\n"); + max_choice = 4; + } + if (channels >= 6) { + printf("5. 5.1\n"); + max_choice = 5; + } + if (channels >= 8) { + printf("6. 7.1\n"); + max_choice = 6; + } + + // Prompt the user to select a mode + printf("\nEnter the number corresponding to the desired mode: "); + int choice; + scanf("%d", &choice); + + if (choice < 1 || choice > max_choice) { + printf("Invalid choice.\n"); + manager->destroy(self); + return 1; + } + + const char* mode_choices[] = {"mono", "stereo", "4.0", "5.0", "5.1", "7.1"}; + const char* mode_to_set = mode_choices[choice - 1]; + + // Set the mode of the active device + if (manager->set_device_mode_by_code(manager, manager->active_device->code, mode_to_set)) { + printf("Mode set to %s successfully!\n", mode_to_set); + } else { + fprintf(stderr, "Failed to set the mode.\n"); + } + + // Cleanup + manager->destroy(self); + return 0; + +} +#endif + +int main(void) { + return 0; +} diff --git a/v-0.09/examples/error.txt b/v-0.09/examples/error.txt new file mode 100644 index 0000000..edb3387 --- /dev/null +++ b/v-0.09/examples/error.txt @@ -0,0 +1,103 @@ +Operation state at cycle 0: 0 +Operation state at cycle 1: 0 +Operation state at cycle 2: 0 +Operation state at cycle 3: 0 +Operation state at cycle 4: 0 +Operation state at cycle 5: 0 +Operation state at cycle 6: 0 +Operation state at cycle 7: 0 +Operation state at cycle 8: 0 +Operation state at cycle 9: 0 +Operation state at cycle 10: 0 +Operation state at cycle 11: 0 +Operation state at cycle 12: 0 +Operation state at cycle 13: 0 +Operation state at cycle 14: 0 +Operation state at cycle 15: 0 +Operation state at cycle 16: 0 +Operation state at cycle 17: 0 +Operation state at cycle 18: 0 +Operation state at cycle 19: 0 +Operation state at cycle 20: 0 +Operation state at cycle 21: 1 +Operation state at cycle 0: 0 +Operation state at cycle 1: 0 +Operation state at cycle 2: 0 +Operation state at cycle 3: 0 +Operation state at cycle 4: 0 +Operation state at cycle 5: 0 +Operation state at cycle 6: 0 +Operation state at cycle 7: 0 +Operation state at cycle 8: 0 +Operation state at cycle 9: 0 +Operation state at cycle 10: 0 +Operation state at cycle 11: 0 +Operation state at cycle 12: 0 +Operation state at cycle 13: 0 +Operation state at cycle 14: 0 +Operation state at cycle 15: 0 +Operation state at cycle 16: 0 +Operation state at cycle 17: 0 +Operation state at cycle 18: 0 +Operation state at cycle 19: 0 +Operation state at cycle 20: 0 +Operation state at cycle 21: 0 +Operation state at cycle 22: 0 +Operation state at cycle 23: 0 +Operation state at cycle 24: 0 +Operation state at cycle 25: 0 +Operation state at cycle 26: 0 +Operation state at cycle 27: 0 +Operation state at cycle 28: 0 +Operation state at cycle 29: 0 +Operation state at cycle 30: 0 +Operation state at cycle 31: 0 +Operation state at cycle 32: 0 +Operation state at cycle 33: 0 +Operation state at cycle 34: 0 +Operation state at cycle 35: 0 +Operation state at cycle 36: 0 +Operation state at cycle 37: 0 +Operation state at cycle 38: 0 +Operation state at cycle 39: 0 +Operation state at cycle 40: 0 +Operation state at cycle 41: 0 +Operation state at cycle 42: 0 +Operation state at cycle 43: 0 +Operation state at cycle 44: 0 +Operation state at cycle 45: 0 +Operation state at cycle 46: 0 +Operation state at cycle 47: 0 +Operation state at cycle 48: 0 +Operation state at cycle 49: 0 +Operation state at cycle 50: 0 +Operation state at cycle 51: 0 +Operation state at cycle 52: 0 +Operation state at cycle 53: 0 +Operation state at cycle 54: 0 +Operation state at cycle 55: 0 +Operation state at cycle 56: 0 +Operation state at cycle 57: 0 +Operation state at cycle 58: 0 +Operation state at cycle 59: 0 +Operation state at cycle 60: 0 +Operation state at cycle 61: 1 +Operation state at cycle 0: 0 +Operation state at cycle 1: 0 +Operation state at cycle 2: 0 +Operation state at cycle 3: 0 +Operation state at cycle 4: 0 +Operation state at cycle 5: 0 +Operation state at cycle 6: 0 +Operation state at cycle 7: 0 +Operation state at cycle 8: 0 +Operation state at cycle 9: 0 +Operation state at cycle 10: 0 +Operation state at cycle 11: 0 +Operation state at cycle 12: 0 +Operation state at cycle 13: 0 +Operation state at cycle 14: 0 +Operation state at cycle 15: 0 +Operation state at cycle 16: 0 +Operation state at cycle 17: 0 +Assertion '!m->thread || !pa_thread_is_running(m->thread) || !in_worker(m) || pa_atomic_load(&m->in_once_unlocked)' failed at ../pulseaudio/src/pulse/thread-mainloop.c:179, function pa_threaded_mainloop_lock(). Aborting. diff --git a/v-0.09/examples/get-card-profiles-pulseaudio_api b/v-0.09/examples/get-card-profiles-pulseaudio_api new file mode 100755 index 0000000000000000000000000000000000000000..1f0a26dfa2d973dc85ceb0d3b1acf456d4ea7bd4 GIT binary patch literal 96640 zcmeFa33!y%6*vCg_nk>*vdv^82|*cF!)jQ>fTBSNjtUwV5Z4ewfGCg{5`_vBSu8Q4 zVAX1CTWVX2wpMCgkh%o52DcV>YPF)ZHX~@MwH8}7|KIQ2J8#|z8Kn06zUTQrkK@DK zdzO37x#ym{z2}Yd&5CJLZKbUE$FWYZ2t@{JOt~SHH+1ooTV+@CHw3w)RcH>g*D7}epVy=!Y3l%ZaHd} zhU2BTo#Hq)-nw2POP@n^h@ z`;%h$ugv(fdsz+|KjrdmS>4+$HSM~WQw)E+qz-=0{!7!`ucEKgw7c&*EvI`q-1IMA z#`T?vcJ#~PevCV5GJ(UG3;e}X+d;Xh0w=LK}AC;s=7$mvX?cW@FpPr-RT$?uQ; z_V2+DcP8OKFNuF1NMcV#68x`{$mx?r?@>wQ+>*qf6O#C$EQ#KKB;h|Ui9I(Yu_q;o zoEwtp9g;-;^GW2dOA-&WlgQtk1V1~8-?$F;6ely2*m-^u{%8{ZQAzBnPs0B~5<5># zB4#Yy;kCF$>sB;)>Y5`1Tp{;p1<_Zvy@RY~k=O`>;mlKyhNjo@GR z&%;UhuS;Toa}vEvlGqXdV)SIw<$tes!Cq^Y*? zoavJn)-SF-r+Uu9T21Sb(okL1w4kxJdT#C9szudxix<|{H&iXGuesC$rM{uIvAU@a zN}3lp*3KiUW{jj8N{^II|UeSq)y~e|z zwT+GSjXg_h#!%@|YG|x)putrTwM0Z4E8!V}F1-$6QQcJAvpfkSX>Hsr{n38y(I<23 zmekZE7HSUmR1>ton+q4tsn#ZfQHHLE2BL-y4${r>63t$x#3gmN4m^vi7bOVkidk=u zT&eLfK6sGkHP$9^k_o+on_N*{m*9pT%yWaXYgQdz-@EqiNFIs}&!&IrMsa>+fB|_C=7jQWR<3?9pP|d>nCA9}LS1qagMs5APo(P;WdO7IQ z=qh0}R!O+U6?Bnk>Ad>JMb%9`h-JIDSS(3Pdtj+vysQUoV#B({SRiYbR#(ld!;C{8 ztVIaO`Wj$yVW~08CYL-5uBchmV9jg5`qebgT2#A;GY74kmNj6mb2+pcnlZP)IJddM z!g48+mMk_cmNa4AZDhlmhGo{gD;hD=&>mB&=2GoYw=utVWMfQjk6|AJ9|=9>B#XTOB-v(x{!79v{O!+Ts3;+ShqIDt&Q>^yQ-r{ z9%EI`n09tW6>niS?oqbqKOgFT;Cu$pnx?0q)b&(T2CSga$gBTpX_Oe3N?Gx`0^Tn) zEeAI}X-~QWm;Mm<6!titCum__+5@S)Exu)N%Z|DNJEqV205Crav{wvmHsHLvx=ag} zePVFA0%MoNC66+1+;lT)saBeS?-Mx1$~SOx?>byP9V-HuA6mK1$RgZu<&OZ_)^J0Q zKc9&2!{I^XvaD_9`9mDvHc;cO?)$cZ+wReHip?;rEOvVEy*&6`9{jN${B95aL=S$C z2Vd^N$IlVyl-zq=(pFuA^WlN6Pr!r6QOEs+J^1)ol33`$pl2f5C29Fp3g_(pIbcm{5TTjW)Hr=gWux8n@55|-Ri-c zM|XnX=E3*&$Z7N7i#_ZGZ4$9wQwJ@^S8{5B8%I1j$fgFoJb-|4|m z^x$`S@F#fiyFK_x9{e5;{v;2+!-Jpf!SDCrr+DyRSHJea*BBMKy zH7OPE)w*j9n>BFrmPY_q_(6Xw+^wo%~k66TdDwo2d|2=n+F zYY_Mv!n`8IW(&NUFt0|jN`b#Ym{+1$xxkHtc@>J43VaD+UQJ^Wf#(qBl_(Y#_$Wr;-ueuprxDzUJ@uM_4KC1wfyB4J)lV*5X5|DPcoA-qT6#|iT)65A#4cEY@Z z#M%VDmoTp$v8@8%MVMEP*k*xmC(NrxY@@*6CCn>EY?Z(_5a!h))*$dTgn6Zi%@%ky zVO}L-l>&c*Fs~4?a)BEO^Xd>Q75EauyfVZh0?#4Lt3oU+@cD#C61D_Bi}2Be_kSki zPncJN*dBpTB0P%lE`cWy<`p2;Ch%y&Jo?AB3OtlBkNmOC0{17(qke3oz`Y6ch#y-e za1LQU8i_RsoJN>O{n%`QZNfa_$0`N>_XfZ`+Q-TT{)jM-^s!Qb-zUtYd@LgHJA`?J zkA($(oiLB?F$*x)hfyD#((=N^(Uy0jYu?>oc}~Tswoy+vSH${ARxNIe;14K2b%J+w9Eq&mzH4Xo>1Ra8dRe#e`(5$ zwoW_}_|E*@Ky}n$?4I(E1wvi)M3=o!%dO z^%Cv=WZGShnYK;V&_}RxwpZ+;@Ys#0w^rp$>kKet zJ}-iP=i2oOhAzf;T6%6TBAR+9BkoOwZCgbod;D{4rS4cddYq(Pd6;8doRlhJ&vV6I z<`sM2ry{ncy`v6mRZGS0){5QY?uA~i>oivn9zl=LHimf)ukTM{g79==?t96;tW+LQ|2ZVLM)pP_{ z_iK(ndO02f$KDXy?bg_ivj6n#Vy|`kutK&}?D?`z9F2vwrQ+Q+EB06`i&`u8h?qTy zzX{r+-PHOHIM(b}YulQ}V>(nCsoV_WQu`RGd5}t3Y!!t)T7wVmJN9F-ZhT|b`Ot>tCw+Cpo4Jb@4d-au_wL~tT<>U?~#=N$2KZ$2y+!^*%ei7 zMDN&R>%zfANok!FXt5LHL^np4qQ>e&2MsdQln4h_+k$)%j~)Q8D1zG7Es^%6bp z_izq;{!bmqt>wojPL$(46J^`S-icDEZ7(n6F2;#+>pF4xcAoj-6XlT^#I<)^#5rar z%4C0hqD;qp)Dz_gW#p^qXs>t~t*w}zC@&whLBs>JuyqEu@k36OgByD%N^$`@!l!-0 zzH*}UDCf)V&|>^rOrR$*h~6G$i^Jw)x#^1DWY&5n%A+_cn~8F;)I+NJ3(<$X#8i%+U*pNGICXUR*Bnrn_uV@IeEZua|BBiHcPoDj z&GsItiP+)bau4xw64l0y`ar?c1dQtFXcb4!fKzR-!!S7wr%7jGN1|JCES&qpzteMK z=7H#j{KwCvBjj+m?r-!3rJTem2{9NJ_^`;+`tRV;V%xQCnv1PAWWIzGd$ffI?v9{X zq)h?%?+?Yz!u${#THE>M_W4S1uWMU2$fKxGjBy1li|gHcmWS!rz~Yo>x(q#Y_G>+@ zQUE3 zZa45)538rzDGr2H`*dF*>Pxu8blsze%UwwBjfcz4=@44`V_4r_v5%eDd(vU`ptNv2`mE$Y+Ex+;bbV>j9NPW4tW=W6sNRReQ zkFGo{Ewfr@;5z+|zpFc^9kxnuQ@v<~&~{D5{=;&`?C}-*L#xllP5ST*r91BVfbu)K zP8%Je)mQ1$hK^0}w1P)VloLceRzIdwys?T!`{OT()pA!<^w8WAt2u|uEwTFUzPOoR zBHJ6Q2V`X9v3h8m5UU3ciq*x?x~Aele1HxiL1OiQ8>@%l#LUK8(cY1BxIOa5>SqbD zdT1@PT4#Kg7^^?rdzem4XsTni25r|=e0Er_K&*b25UXEeDBa_ z-g-Z7e|ZVp{Jskomp;}7bN6XF#sqeN%yX#VfUi01MZW2JMECLt7nbL1+)FW2WZkme z@e*)A%-90aCqr+yeHEMi9^B9OSWOEc1DlsL8i__&N^fdgU(p$QprTXXwY|GgMu&)v zH+Wua*~1R}3iYl=IUcb`p%J$BguSSvrTN`x%M4hL9$?SrGl`~bJQeACDtGPnj{Y!O z9+Mnp5ZT&$2VkqayKeCG?5cfjh`wmcBT+0uE%#61_f5@IWxyvTinn!4ei$^GJwV4NX3%ABE1_@liB1ysc&3g_PMU8bc414-7r9 zv-KvyZCKX;l0Mb^SVnRkeJ6W+>jtTAxQQ&S;>}Z9cEYqWISI9QtY(9jbqm;F%_A(V z=Ar1v_A9hY@FdE0NtSWRO0F!<5=$8xhyNzu1Q`4%y$ErHhs?KdyuICJtwNCG7ow292`CaXE zhfc;N_cPFwA^0eJc=hrYveQK2zrfX5i0G3E_8y1R=?fctM;w5|DI7oBsm z9)jhNmEa<*q}oNRO{;z$t8O-}rn;@Z)J3QLxkndS@u!RlF52CFX=tz51NGM4^X0N2 zOOxCmYTp&9`w#4i|fgkAfK8fY|DiJWShb z5(n!y()oydyGyJ z4qn?M;3zR1r8FIjy}!U9{zls*%-TDi01;c(+b#@R*J{sJZ!giB$Ahz*#oTO+oGa0v zmWt2TtoY2=l!0%5QwqLQnwjFS-Vy|U$22TPL#X}uGVsCApS>mEKLPe|`CW;&xcp)|_@6KhieY`nV(1hf?yUuB zn<33c;KW0t%o7@HzSi)(0ev0J&g$mOiq#p?Bv`h0D<+WtT!Xm>%!#*PhS4dcB8(=X zKGAUg1#OM$X2$X$gTDwS0qkYKAF%W7eg_~wpzLeV!g`~=hjsX53w_e=e;yz|T|taP z;0mnS&3jsAyb*1gz6*0=S5(eEZ&=ItXmq7W*s#g-+6@TnQF;j$Fqs4_UL~ z4QpjDG_Uf~8cE{=qdl#a5flen!tSgrZCUX~x24bAoTKd(`)PE?TI?zM_;;MRy5qMl zf*ab)_3Z18?Mzh1L)tQy-U7{fjUNNf*U7nI#=h2O^!WvZ^54t>;%$jzdA_utZYz{D z*go!U-mU*scvBnB6jNFJNma{?=itINtgt^4Qz|;vta#2^#_3jOY%B8EcH2pMY(Aq> zByIVXUhUVxH?d!eS@}2gBpLC} z5PNFdSTeP|2I2pR{#1~nwF&Dd7*KD`JW~YB=xEJpF^@!^iMICU$joOz(|oe(tS=6~ z258MJOxkdyG@MK;;L8n_yghZa0KDjc8;fCt+yPi;b)4%kdHHc`#m8&flyN+?-}xrB z`|n+Z$2h7Rm~ zE@BEK{b!+;G|40BH6!UU4kPwUQP$qE{|$ic{(NJSNZX4$o&T?pAx{CZl1|2v);u_D z`y;F7@gxj8>VSy*1GrspL}ZEJ(KEF6ZJ5wrAy?|y&rolz_$+$ML8%V7LYA}shaf}Q zWEh*2LyzfzL(w6^I)n(2-$wU%15YLehmUpRJK1F(Tyb9nzxP)7f353LC`x9O3Fj~C zy8jR&(3SUI|L?l~0QkLKKjg;1m3`eMo;BwdI&PS|>eqQ`%Sq#f{Xl%adDs2Omn{0% zBMp_X=Q2+jJ2(BN)grf5DLC&T zC$}d>^^elEe*Li7LAWfUNu^p>A#G7bE?_ z*Lb?XTN&?SgF>PNsE>idf`v|Bvw+R;AY{Wa$7+pwS+da|ulPZb*0E?ekQ*uk+rrWd zJUUgo9%5ZDH~;#3^wPF)bjXv@7TjOkLeU)^KI~sUy02pt+qOIonfu-C>&;iGBz~EZ zRTR){lJP`-A?4Wh%mRr60RRMw4_ZVDLfLTCU1$DQs6h#=7J`pTJx=S|JK4l^+J z&0|j!Ph^WFQQqFM6+PL81+DWd2gVOx>GFjMj6VXUeQ_C8YhN6xHR`~K$(VJ;odm`? zM1IAmD+d2RY>6udX0k|F_fnTH5*C@?fuUnQ-SQO&dziR1aj;)|@u0z8 z3zx+QLnlemuMpdMMiA$vgsEK*IR`a*9bNG@az|wc2tAC-`9Oc=QJGjn|0RyfW4NPm zR1~`Ozm3Y@Ug+xI!K3m5z4#SJKW(2H}#8Je0E zYw<6FDi}1?tMNRL+^$62^S0b0KA%m&JGKvpz43cQizsXF*nxJk0>`ca6$k$eNad$v z7W0_$TB5lt-|8ZG0NOHJ3&rZ-3Y}|&E{qG^TL#Wwl9NgI)@JyZm*s2BW%<6}n{Jx^ z?Uh83e*+r0ed&IRq{Evy9w&p#-SW?eN6noPH#nZFG`rA!O@o+gNax zl2gC#aaY&zGwpYYp1(}eQ2tyn8_!?0Zx>{n#8b58{&E}%T5dX?SDls(r6{_cHP$>r zn$=VSoxix))78i5%hq*l!WiBN%`yIeI9=SjStPA_goV{K5P0g6QPU(nCw_*89Jn#M zt>%f3-F0{rV8-tH=c!1iqT-_BY?pPhEzoQWwC>r|9a{TqcG={8LTi7@f!IhsMvx?h zLJwFt73)`2Ll0V^2ipem|3ZleZ+Mkqg9vNAiNc~f4aH1{guDaIkFFArnoWK_hd^`D zFS}(#{I_02&-ia(f!G?2`U$Kfwnn0Le5@bGz_XPN=i+%-yZ<6E@q?g3lVO0|SUUld z1)cZ|zWurGD@I2xGFb^hcZZ8$(A|HbHpKgQtj-v+3`%s+EyHY)lS_*9$V^4KG&LCk z8jewP| z07h;bIeU!U!B30S1DGGOn|!X57e7M-w>RAFzVs%Ss}B|#5VWhcyiZKt?B{vBiN_UO z{?qh{(8i<3#FIFdPFXho)82LFE7RB2vYoV!clY1Tk{-u}rU?(NG&UE+y-5UkR!bCbX?LTCK&JxLpSJ-J$VJsU(rH)N)appjkI zvma2jS%XHSuAT8u**2!{CuKVvW14g{Jav$U5w3+}SLk(gv8!Q}Xow$*cOjuJ-7!yM=Yg-AuWDR9pU#w? z6n4|o=+Tqn>Uo;RC*G6K^K{|_JrF6b@Y}TTH?c!`2O{4i{7x{7oA%aY1n}r&`kw93 z68F(|kL@RF@jv@5eZ+vANb&lbe7mSHJLvs1zzp;$u6*~?%u^S-0tN{D4XuRN(Xr7TLlqcalQq`n~C%7{wJs);c>_u_^ewD z^%X-o-|jyLhHl8b8HZf&Fpt!B%AWr?m=8VQEGX@!;St&)Gx}_;p$s<_uZHJnf*I)9 zu7+gu?RSqKq~QWr!{5)AK71s9W7oB2T;kF21(TtnkSH1Gx2kcIVquK=m-+s(?p%yTxWJ{TD-Qd{9fg_pQ&9d!#k~ z43JG3kKCujC_q3m3CHa*UP>k2XsS5yRCzdVmQDrkZ>bD?S%2|jAhO%M#a?x$r=K^% zRk0S`Pv~5=p6fmC7R%ZzKIVF|7k4hXu?j){1`4N%Qsfp7?v!=~BfMkL4td;wdn%93 zfgag+q91B+cuj@840-^5!poq`yR!U|$GEX~eAGtQ#Lx8R4;Jp$7Vp>Z8`4l}J@+w2 zqkn6q1QS;L%mZCn!wE3ScwNpye@8kb{+j!lu#@A(bV&D6<~#bOka~Vxs@x5(H_sF1 zQl;l^@I6R1Z@qKm`Cj{vDclTC%ZdXn%^%A%7Q9Y_OIzn&yn0b_K)+Ae1_v}6G-Lb# z-^E_@cuDJ&jbZ&aCOxI@-F*G}Gw6mL+lRs(@w-l+678C4>^<^dU~yyo7I-#x9gYq0 ze7*k;kX!S&;Jd|ro8QgXpWQMwQ7840ca9bj?$@G>OCp3#RC%yR#` zY!7`c{`aKje+flv{ww%4UE0tmtY0R$^-&HTvhn_Vgy&aXJnmnM)1*{QKg&$zbv~k}1E5Om56jyNHt~Rr{xD^|*Gs4xD1t-v>dh{&8r{cNP32P)U5N zp<^=gX!@RYf<6kbbrF1H;oC-dKacRfM)!;r{Oi{8hl22=_@_|8!#T{FDV& z*VFd$in#kUvhCRJ^~<%$?s6%+4eiAAy{CXP3+-C-!}#v&6zlbqY4S(Oi6;PTwc4~A=4tgO(`u^QsuY~-$$3zkJm)tu z+WRrg*vZ>Fo|dH7L22^;JQP1;#Mk7VEzM6NM0WBr4BhzujOb+vdwqMy(LUOZbxUY#afw{|)R0xgp~f^5U$8zsBp6P19c3PMr?^hYdZx6$7_kw6||ED%y{t z^oln&RCeNZJaE4Z8?Y4PMYOoZTnhjP;xOu;p`$v!C$6b@1Mj-Laa_fdp=&30nogS4 z2n$S?2X@jqgwg(CUB?st_$yF{H4Nu-NWOd+PI!2Vk)dyF_X-ig>@4Z{MkCm)7W z>7D;!81912Jr2VrcE;nztKu-+*o^vrI}DRN?T^uQ&oHCCpJVFHD*vS&SDH9>=^dY8^0tj>qiMT(1ENDGWI}6y zlvEN=)BCsc%|f%%zj{A?m_(`GA7>tl4v(&(M_T088*Ql!?;Xt3V6rx}y8t1-mygi( zu5v8ilA&1%i?#V*fE?sawfq0HH}8W761~|74CcaD@aFpa{%3CVxJ@{aUPlYos72wiuBtd{<1Q#?Cj6?mxq+2p2azA}uShH~Ak14^I|&LhIkG z>yn6VVjX9UA?QZ@XkZ;lTzf|uH0fQ0oz!z@?XNwfE&J(cBLNo)SHg!!XbGRd7`=R) z4ZUUL#KWD|=6yPWvi=JSYwxJ~l?ZhoLtoA`4YyY~1{+4M)WP@Hd*kAKM7ez|mE`i_ z587HYXx}->7Z@!vdN$odv%Yb?t=#{6+H1l+dE0>GH8#n-fhrM z>q8vY7l`UUXusF~)l*akZH19A)H7&xM#7}HguNWJHRSAR(C*rrIA}YVbLnBwMnk!d zfh2<#_55|BKK}4;ZvI%V`{)g;e--OK{t$7nm#-jjQt%IboA74=27n79AbTH{`0s%% z_qh5v?CF{w44v+Ooz$@(T}e21jzZc^BY1)=H>UOTIPbY4ZJN&w(K*<$I>5mrB=$f2 z_2q_4#p8>6rFC-ee=7Ik>Z{yQJ zO)%^rm#;v-6I}kNi=fM&KS6uL>+&!s3MMYcA#BpaTFf$9IEt7B{KeN#Moj1+EUvfA8sMUWF zg?LQ!PXogBRfOv>|K7OOKOA`acKi})vKv0bP;D$#kb+a1_wRptSY2ReU+TjQ!p7zw zVCp-`bh-IqQ}?)e8ByKbys?*d^F-)R>gEPE?9t7aOJBR(d^hq? zJ-GQTus!{R{68^q9SU^)Ux7IpzW#jefv-LAwFkcTz}Fu5+5`W8^#FgTj-PYto2nN^ zJ~?u7St_?)YLD+4+YjXP8hVXIn8u*(&hN^KmH19q>?}TH>r7U zU43G696s==;BS3Sh)k|;UN|?hxV|ZZUsY|atG&E7ff=gwFDK$xSx1Tr)6Q#|Hz0wmOQX6;3zt+!PMHEjx@7Q| z4n3+xY&~4r*jT%yp?>jP{HSci<%!IbA4`M+@=dQ>T(_usQ6&C*kq|nU%7s?Fv6E~@5l4OeOYiz4U1DqW8(X{fEK zn^y-gUf#81lD)Bltzmrdp%;l*N~04Ci`hrRf=6X?|xGyl2Qr#ixj#O5Xm&`_VOy zMx!2$9`s^Fzg(PIJ;5SV<5zH?@qfcEl{I04?h)k+H1;mQ#CCg-{ zL@sNt#moWL)4&Mpa$%w@vr@pt&5N7j-m@(Jd~19WsS;YrkO`4_?riOG)*WQ%l6dI2 zg1eOWG~d4pKWDABw>rMISLsQJ-`|!E;qWZiBg=m4X8%pEEo*YU{HAhzG%;Ty-9^F9 zc$CX;1lMA&F5yajc^!W5+jwZkV%eOq9`e_MBbAe&f#j-{p{B6OEhztprc*)TZfnjM-5tXRKiR!bAa1uwd|r1{#3M{ zB_7%meFD-4wu7i9{PjB6HN!mZ51v@&*u)+u&I_Z8hpmL^bdc$$U42bWGY(jDBUdcI zambxsW<+?%jC%(AANOu^M!I4F)(Gt{}bv0h`p0PSSe$Q#u=;;awciwuB3E-}F33~K$ zpLm<7oxuK zrq0eOC~I%->|BfThqrci{siR(KkDq(1NHSN=c3$#ayarBJ5hcMWe3VLkoU>JJ8%xtV8c<~k8&Ey&rvQ!c?Obv*P@() z{OT`IK92G^l&2wCy$_`iZyIFyE$cPBvrvliFL*Je66GGeZqtDBk9eBD5#?mOMYR>> zaJ2;zv6>!zuX5t;f(F=;{O0p$kMeK3&>rPmFQ7fjEia-y%9SsnJ<7*W zhVho)-LH0bjzwwX&7E^lUV^d-<=KDe?7R`>>v;WV8_Mc8Iy>J$dC!}jou8rn{7;>o zeS((tySF+!k4Jg$9*iH#HE(xzE=M{4ozBkNP=0{&VU+EEMthXA-$i?rS${!$98@Q~ zhxRCcgz`d^r~MV}Q3g8D9_76#A4Zv{r@f`Vah9c)hE;J!YG5N0V8kV1Hnx?S&}+fc6s*7uKY# z@YVL@%oOJs2P&)xP|NY}ABe|?;Ww9l^0m$ypR+X;Ow_*_|5|_0*?AL6m&e{n5u&4w z_#bw5o(`K`x^s#m1KaPxzmc0eJJT?>U37m+oNl3A;T@fwt3h_@_6k>i1oUr!J}ZHK zwo5Mu{a(=jnxOw3SO09_mu>0nyda_dOt<|i(C-6%X9E2Rm%bVF3o!?KY9B$HHqgHV zdQa^sl0JABJjY@F-bX}y9PE2s9X`za--FJqbr=0^mp%~mY9{v*=#yRg6wq5hKP!Pg z-KEb3{WqZV?<8IM&VJWNYeC=r(>;5M(+T9D%Q@M z6Z*Hw?Oy=4ZkH#C*&nDRSlxtrU^fy6&E`i?e()o*~Em))9OQ65)($|B2 z23}#mF@b))OWy+e6QJ))u>Y^F{X0Rw9&7&Z652oQw(kIaBL1!R<`}Vr_tq1)m>@`m((4TbaTR`6h`l|`_ z7hL*I(64^BvvZP{zFf#w1h@{+e+K%8-uU4hcvnJ5VkiS^S3Yf6Au7a9?#;cirzYc}ukQoTikFhF`7eY1^Ouv; zKL-5|uXJ|uB_4My?dM!y=3zg&2K)EB3G}yI`dH9U#|x*)+Mfe@C+NxAH-Y{H&I4B` z$iK>!emYzar|t<{>M)oeySV%ih(mUnX`-}xKvm0 zVyJw!-mS}G17pdOPj6FhGj#4({KV=1{Gzj-a2wAN_!za;M%=~t!PX=np4a#>Xltw? zq-(T=R~+S&Z_0RKnpqw9XbiV|ez^bh!+RY+*aGB(clhM9Cr6iYe89kQyLTJDpef_} z|I?}a1GKQ>Jw@r?tZdELY2dhB`wjf0+$JsS({6Ml{{MN=X2z?#;&Bm;nQF?JrkrQW z%T0N;DQ`CA9j1K1luw!RRa3ra%1=z0($A7lFH;US{YC#Fp4Z}gjTuqnrxa;hn3nsS~gFE{1Yro7pdcbM`4Q$A(NS55hz zDL*k~$^fI^l!Hw<&XiM4In$K$OnJE}uQuh)ro6+H518^PQ@(1-_e}YTDO1dP(aV(D z8hp#8*s@NZJb6N-BjQdLst{N zHUAr!*_!|C5>4J3pPLEXc*F(Rwyqu==XcDT*OBA8F&c0;B>OET!V6ymaKurD(vxMr zMv8y6fUl#Z22xWM3SVjlilRWO3Y>`csdnmYtc$5CWfCCY{or&47o5rlwtqfQy?y?= z#Z8v)8V8i2y(Wn$|Fe+cdjV!RBZ?{A_cZIb6s==@8tb8odh}u)J3HT-nP-&kHPxwv}V3vJ8mP6l^ zUe#zi+di4nrsmB9u)zK^J0BIR8|)kCwo?RXvNPc%->K=hfP1MujY_BIoC#o+{W9B} z9-0MUwf%ESJ0ox@7}nSuup0Z$3|$Fey`4<~=Vkr`3>)oc3b>$P9g17*zU=meMb`t^ zY#*T27l}Dr?7{TG#la}rY_*@HfT}e5a+}SEkG|PrTbq3?J2xkABLqBY`Bs4BPc7O3 zzT(AX8)+K-o`ph{Hvz!W>{A&p|z_k>pjZ^?^bDYfuwLKF1NpT+9D3xbukc zbCC0XiLX94L3{Y-EY^Jwf}T>y|7oPWEew9!m}QpF)wH zkFj8oq+UH6{EFO`x(wTMaG zvUagMf%EzSa#SXtRRyddo2B}dvkd5l%Yr>SkDNsS126 zH4~QFs)*5~2B8N5^(@+lRT>&b)MH>QS2N+DRYy#r3CaqNLyN#Uj`IlM{5v4TPZ!O1 zrbBdkCs@C!Lq+R`20E zTXo_)M-{@QxoQ-?^VF&M&R47O-AjEJ-vx?K6AIPu@Li-j@ZDS4u%TGZg3LbZXw;8T zx#-1_Y9{J^RR-*dsB#Q-Kh*?F`l}k$2dEYJ9;m*9??EaGp22Dd>PM+R;=4rs6W>GB za>yB~ZpQa8wF*4L)qMD5ggPCr8mX?v_t6Snv`Q6oBcs$Gz&To7f_NKa`BLD}w40pE zKsmAq&DN#`R5%M3OK_zHb#PgI7gaY{X&I`RB%c-HkQ|As%)Gu@In*<0PhN8YpppWg+Z*-0YD*H9m83`GK zo(HJ@4e^#Lg>Zi>~<8YK*&I-6SLaTN!aa*$Ak0_ztG8M1)|nJpgkv zPIaz?xXgYK6wa6vR$#DShpLR4Tv&u|Y;nz54L|2B=$^yAVz?rEV20#XsrD@^77^(}YJgy;yfj;=o468hj z*}%XM_$4!2x7!k!lMg6Ih3WoZI3K}_xk}6|RnA`6lBXHRDrW(#&esacl#_?v^-`g& z5M8dEw;{7Y)1u0`2K#HF%I9KJsrc&@mS;`5bU2olPwsJ0mzG9Wl@n4{v&9J49 z%I8Y5P&xlVyCbyr2IVY5Z;#YalX8xS+P)fEs+{z`oIgeM(JJNq2N$M(s*t*SRF2tE0-{70ecCwu?-A*>nq*qJAi80ENRy#_`k>9kR32Dvk5jCS1|TDXe6S1oIZQ52<5YZ(NLH*~<>+9IVkG{R z$Y0Z#JMooc4R{AOW%UWOTc6@zj@4@tnCpa@5iFMHSOb5Fz{n~R!Gk7a2vvp{+Wj!7 zZcCeoz{rw0U~ig|b~~iy=25)8X;#6FgJ1(bzo1$846d_OQ7(6t#z5&Y2C7WE3*8uJpmV78 z4&1kSww(x3L*#5L5351xev0OAk7VfcYlc3*X6R#WhCbwG=+mqmKJCE;BOxL~pJs>Z z)2yGTS$k-&<4Fm~Y1YrvtUaQ5GEjb=X6;*wu3(*~S^L&vsmJiAXZGgaQa=-O#J;^R z>%#)R9h9Wcx!J7yAHr(BXVih;=h7 z<8}}%XEGe;3uXTj^?;TAcN8+N{#OfVAG*oY5iIBFXt=Ko-}yWv`R9U~a`l~nZ8;>_ za!9h}kYvjt$(BQsEr%pq4oS8gl59C7*>Xs-<&b2{A<33Qk}Zd%kUk{&X>ZDd&Iu^8 z3Ki_E1k_!a7elztm!-?rQneC z7tr#z7oaT%CUwvx29@H|2D?8zuk2Dd%(l$cE)(=$1*G< zssGkcAax-deW9VSmCkmlKF3*(cG+y)TMl`&{|G0KQ6`5xTMl`)9P(^A%yb%JX;QVwjA<8a>xtmLtZ)$ zd8s($^+Su^tK!bR)wzqteV>nN?00}w_Dc+CyA9ty`wn~u?Ca6Fu$_(XhkYwk18)IvZUjs4y!7o*U^$JD z8oV%X4mPfUvm2^|7iU}nAnf=E%+B~0fI{a(SR9;_aT|b$^GzrZ*7kY~K#8-2Z1Xdi zSSoeqP;_0!y8z0Z3t(#S(u_|5lsj+Hn#BbLSly$}vux9lF&sdpvl)F1Hf9_TV3u<~ z1vF)x31GG}6rKrQkueXz0xQ1^jU*z2eCmy)m9tj&dM6tyVvk}m`)zTSZScR)vQ zYWOnLeV5}a*h;Rhmcs9EXE#nc@;jhqvhM#go1GSBs?v8io3*>mr1l&^t&0NX9_0_w z?CIe*iFgNJ!GDoUbV(zvYZ7%;_I2RqOxFD$u;*um^MLRb;VU>2U%Hvpv>M9t&*bQz zBdig2oME6jyF4(AN_CqPDUH#g#7lIL<(p3=qePIFZ#iKGie}=fY5A@N9HG$+8m&RP zd|Q|BAF&<7NVy)dd`}X|a1x~DS#K$dD7H%igDm!1V7HUk60? z3Sx=yzl$l5{{8R|f$;qVUqPPYm3(RA$m;(-MlF4F__ySGhFovCTrv!rbtiNVCdGFt zzVdmolw~7h+6-(PA-P%Fa&zoh&O%9K@ zMZ6xa%?PMg_**vQ3|uU^AzLGPvCP25k|dv1%n|t>{`Hv*VqYtrEi-VjtOm}{i)ChW z4)^sexmady3iCZRhkJbH4O*hZi)H4wvq^x!EhzTkpAqP1yUZJ%`+&+OKA*Qs35Tpf zl{g#Na=o-mF@VaJ>!mH%OIxm&wp=f5xnA0Gy|m?eY0LF8q_3BLUN5swbv}pqEV*80 z%?YoCY=_s&teRZvv7AZl#=M*u9E4Sud|3;e3qi_~>t!ew{(xCUu9h6NfvLP&hH$lHyDh1_ zT8417q@#b4Vy>1nu~em)t0fu7suXjzq=GV)Vy>2-LP5DoF;`2{qAJB)EqTPLR4L|a zNhi)yDduX)cC%HAxmq#;7N`_+wdDC_p-TA&)Z%JM?F}kr5qgWOC7~vjVy>2imZ}tU zwWN<$sT6ayya3R8m13@zjO2|f#au1hOCx}yrQi8rZfn4nr&b6lB>`sKQj8TBhP&5Ziegi&9XFzVmX?aZiO=^gdu+D44} zx3O=o(2N-M_1JJ%Y6WK0zo|l=QD3ELX4J1z1w1>NQD3cO>X=bqquZHLU#qe`qrOfR z@O)@S{c5eZZCC!Jmn zZBWjB0NFE%uEAH)0-kC^#r6&W+WmcOGwEckkI+yc^-LVcLPy#XmEqJsQCeRO<>@$x zXsFOir_4}4+gU^{6zt!Luke9EZ=uL!Jwrde$k0zO{IlTr?EC>=fRe>}d3Jf=I&7xS z%fMt$DqaMf<$Q*nIQyh*S>c>*n9JFd3mZWRI}_P{iU5Vqrx?@h3W>sq(+E4WrwTC8 zd76}y)A?M!#JQh9RDe?FD#T;{0;=9X<%i9%XEMo>q@8{vG;Q;!L3hV=`)h zD|MFQxRE_p*vgzwj{Dgdx97`+wyVo^U(!9u6(|iAjwBxXGumXXH?(|D0i5V${CYN7Rwolubgo~HVQb* zNaY+WK-k$$N|^wK4l`0Y;{}K~b6{J}1OZAMW~6eC6QI<2k8O?@pv)=9K9e(1fO3b& z_?&V9q7E}sIgq`8lPX5$FeLYaC{za?T8mLb2Xq zMk?pL%$vcm(P2g^=YoRcK)Jm5@^j+B2&kFnqcI6KYodP`nDH?D2xT76Wh&~5~RuRh% zTH!n4o^Y9xL)PU)%j%Nz4EVx9mD1v(ju?V2q~G^lBDm;SM;whsC;b&ZQqhQ2Ohj^DxKKUlcnsp-H=)#|p(KHHtVapA5BS=xR7y zr3@mQn0v&1v~7F2+wR-$AmyBnVQ)R$w#yn}4*pXs}CKfC01um$21nAx-K=x)5E; zKS@Xzx+KqFbXT2%9o6Em)e)2))D(CUbs^+51nKV+Fv1WMSE;bPpDIIrnG?-KcC zqUH&gv>Y*K1^9eD{}>_tsT+xp(eqCf(x=@>yv*iL6uUxjzc|7QoQg2%^_wiZa*&HH z;gj(`;c-ClAFO5Ehd+SCf*;#iTyoAOGnX6rvid)Uu*mP7#;MVt&&%_Rq@Kg{KmpPN ztI01{)WAom_L?YCZjWR2T0nWoPr;;u&05VvaW&R}H{skbgzq>`Tzq!w!cw>OLX$KO z@fT_g>v-Ot#vSwvRY8mFP3NTXNc@GW*lix`1>(ygIT5q;U*!%Ki(4y{{%}VdtdrS=sw)8oP&w^|>_U168CASzrzL6DC-@ zSYBvkcUitGZh5;J>$SXHP4!yduFmvW{*rPnAD9N+_o_!GXluKSF2R7n=zG<%UZd|- zCwPs%S55aCeZR-(g>c4lG5XaqE&Hz=9emVn4?(uLd%1SEvuWGPw1+WN%eB9qP4}%# z<9%qkI*00gvGh{SfEsvtzZu z)vnx&AXmCMP7N_*b0n-9r^l|&1d7f`qWsBk89{v2UCprxqVxY(bTy3;V`k+B}fYz`3tPVi^ge|xO|Y) zl~J$|q%l9@I(v5}4~#!4)x3Oe!H>G_TK4&2c;xPQWaq8KnBU)vn*nFt*jEs{YHeo7 zG`&f;MAOgE^q3mZ%!oz@af+=i+YSz7%knsx*A;SWz|_v8U#~XPZB`yn=--k9EmCC# zi>&o>z^A@(AETM-m(LN1XS*K8jOIt(mPb?j8!^$oL$G}C(;KHFel97-31L6h#S;s; zCSnaK{DEP))r=rUZ&HDFe>vQL)^KU)O2|6~3eN4#^&e|UVY?xFTAycHPhrC?7+hxR zehqI8lT01o2ji#v`)fZ4VjI<&x*S{HG|N2(Y&kkzm!s2lIXYbzydM;kuFKKsy5Txq z7c}X*Nni-Bz?86u7po?Ro75faBLdEglw@8}V?Fpy zXmE;im$UvLzI=tbGg)UE&(}MzfpwrSEuzXD8 z`9s-E>;$abEYKyRpYm!!6ex6`X*~3TX}pmR)1AHY;W2+5sHs;I`+wtIrvjbE3l>2> z-gUYFMG^CHeAg+6fbp4kov7dP$KQ4O1c1-aM|^zO>3u)}{fZRdb$Su3nelg>*r{HU z#+yX0K^H@&k~E%@G@g<)o{}`4k~E%@G@jCFydcwfff3FCH0!m4`b5k{8z^SfK!{WW zB9!zid6?{y^;44dQ#$JxWY#aR++l1NOV%&&Pn%El{LK0V zkoB9Xpu*3rUjSJ@LIFRsegS0t2!*XowhJKZ$G@)5W#fLHSG#5d{%Wsw^)^|*%=oKa zITS5fKSsoS=XSsaNnY(LkgQ*U&iZA>U+r2%36k}rS8jDap>dM+Q+Pf6BKN!G7GvVH|R>zB!_ zUjSJ@2Q7jozjr3;Me+PzK2{W;$?rW2;g-+j_in+H_JGgi_wEJ|_L=#Aot*X;@85eI~!x8$g-Qd(#0#eI~y*2SBCIIB4>Fe5{x! zb(7y)1ccLwuh1rZ+49AFvQ5X^)MAU5oC-M6sRSG}`MsZ^?)(B@p&jJvYAO6dliy?3 zBTwokzxO9Li~9~VW1Usd7zq>>Nd?FhZr4_br%O&&i9FAl;~8v zb1z{Aie~yAnp@7}fCtcM294GrU4F4k_-ky(FtS~bSkAwRWH<@Zazdzv7*U!j6=b{? z0eAqr#^}<*PXJ_$9?K>SHCuYmj#?Bq ze(%=+a({%cJRa|RNzRQ5(x-8aFZlXx&i@;4a|W4nOTWq42EP|e&MiHlm{F76GaWfM z?w;1s%(F$z41_ZcUm>R2Z28i2n5+(uswLH^1$k%>HRtg3 zQ6$O6(5CPYLGbY;61qXV(#K?D=-b&su#UJC^n38ncrwU#p&OkmfGU!tUN{ymOot36 z+rsZ>QxQf0pYUD*0zNLq;eA256aFAr2O!VK{7(2oVJq~%L^_gshT;_=x0(djHDjJVxXT% zJvjl&dt8)FUmb z(o9m1Czwi=W|Ddw`dKQ?B=y*Cwn{TeJ$ib9k|!8=UzEp_g(~eIP>ZA% z3L^nXDBzdyKmw5c2>T^IkN~8(Jii185`g415rPCDIT0b$5Jm!UH`EQ$3BVs?wb06t z0MyDPLXZGtBNHJ=0Fq`R1PMS-gdhRvi4Y_J+0H}=5`bM1f&?IKM1+_GAQ=%MCILtV zCPI(^^h5{}fTWoSK?0D+NE0DQ0D2+>2|!PTAOYx!5F`M3R5THS1R%AW2tfjnkcki^ z01250K?0CIG7*9V;1)n8LXZG_ADkvakN}KF2zeZiVEMgs6;0J(Pqo%u4Bj_^hm zevUjZ;48$(1UfFH=822#pcLm0!Xv%#cC{Rfn|~2}T3DjI<}AJRSW=dlD+NGAT2RwC8pzsKLXCNO-Wl!c}lof`XC+ z1w#@P3{6ll%qY;)Yq%|;+sDeJhVW?HDTapPOEHv{;bZM`Y%97yWeMuW$JNP8g^?HB+m|CU^CaJ z_lpa4W7Elt;@y%x;o^9=xSEHnG|hBmwx&gNN2={&>Mrp=4=v$28YtK&33P|g*^5dsZiP7+;fFz$ zy*wu~{do}dUY?UBK*0AG1WZmSja*?o>5)Gi2(oQX*!dQaMYnVOb08W~?qh#*a&uX? zeA_VDa`Ghd0zUq7P)@$c$*`O!&@#xDIlY|UqwY|1ktCCIM+Nx!(Z^(R?wC~e%<_%I zSMInVxdQluK>)`J5ccgRrA&ZAUzF2&yZ{m394wc)69g#nF`1luoB*Z1_t@rm0m^*k z*pqW73Q+E2GC8+gfT)kjWx7h#bk2su&g{Llb!oP zcZfdXMF^x-a!3U7Zq)ObOm_aj8k5P+pHUM=KKc+wJniAomJl(Thm2k~XR#jKSAxt^ z`GA2qmF4E*EAJQ}de!zfkFWA;rva(XL#)p6#3t9W>LVkScBy0Vg8Dt2)=?R zkHov!>h};}sp+UI^#yd>YCJHGsu@5r-yDcG>P@IlQ5%3sRkuKGKs^CjLDi1UB~3+9 zPgf72HyP?&*qy2V3eGGw0MwAGg@mv=4b*J)2IS|c0?5x*>p{&^KLI{p6@edrrUXoZ z+6{{fRW4S9B6SDa_E!6WDOSgU+DH8j+VQ7&XcbZ4g3bL@GwS`-FM%JRegMva>P0wU zkjj9r!RlT(<|wrc_Lrz>&@x0V1LsinW7s@QHNukNstLMAsBw@sQjG@B(JBwiZK=uy zW|V3K=VN}{XsmD;yP^(~1mg+4Y zn2PTlH38HjRR?OZmD!2L`9;dP6{C|G20j0~s%Q#^Chray;2ewEm{hrB^*&nN4XF3G zfVWidf58sR?mYqq;-RxV@(=XB0%lp^-ft5b>D`A=dGCABa~zK9&{3u4ptY^8g9$$M z1F!|GzJ*!AHzC-^cZyV~n05S_bT0tmUVK&)@bLvBm7UE?SlDtd;lg$%x}|a)T2y!z z>UjlxTo`o9??r2T`i2XFgR$@X_~$>W&@8)r=SLOkWf$+>Q$}z6c`0O6qu!^0ErQN$ zS4Jdw31tj`|5d*{)-B&Ie5?L)w!nq69+1O%795Y>ssYZ)Kom|ueNaIYszIm0l~xkm z28@q8wi+V)oaMWUz)-z_<54l8Va`op8+!`tBf@MFbV^+zrGYezoX-~lbyP3bjY*@m zNxl=*&C3xvSn@K9NJ0P@B@sgI1Cp#(h71s`gK3YEq2U=R{1X5_5Itxn|5}=fp*APl6 z@EVf@`k)0up)KV7&-uRZZZnf6?{$8^nLGE~?>pOf&iT%_+Zx1^D3rYZZMN zA{Etzg#Dj$0iL3;ig>ZT5{vCzd?}npO6w|PI4^y_BFyfr`1f%3@9=@j-&d87aRDK! z=uN<2D;grAn6rFMe%{Xi=J11wG*FfeyOD8bWE;oaC1EN5K`zCwEerEM>{3I~qGqU} zVuM2XystpG1%<4li;%Elu`2K#e*uo4R?(vnyJEg7Py}_kB*Gk_t)i!@An-;da03^R z2IB?~yP7U~80Np|9ie&5b}yIWG(hQ%i`H5jpNA|r}>(rP27Hk^NO|V+SdcuYB*jODy{yAud!CG zqBE@QFDY;-#BnuYRq(!vCA-BSHuEKEQWWY##?4%`HxIhNh9K8q6UK&h}e(9>L0+M|h$ znz^!yPOxiiR(k!qQ^0Mj<-9MX68l29Pf~R%cq_`1r%JfdxVsiDW9kmjO6&$tCZ{)2~Wj|ZY#Fq0`sWNPp+GsB8P{&)PN5u`=uw`)vnQ#QWXKu-}cf^0W(X0p7xURZx48!SeHU{IepD=i`SpRK&O2E*e)x z`fpr{l~ZdK)xrx3_o~{95Ij_E(Ok(L2q4=Egx<&*Ai?Jub-)^a0)_LZi@1bLY+^Ug zJnY!mQ&7(0Vn0CiQ?R$&3#6+GU%tyK>qY|<7Ce1gq4AS!b8^Wa~F|5l2v2mPq z$i&6vo>*dP0;jz!HEz1i=f$+bf?s5zusuPDtSBhtaEg5grLSr1JsSHwyd1(>R8XvH z52NkAx&b>wVj|S*X;sP<>b5Ef^&Z&L&DaL!P76UuGFNt!s;|QM3<5d5)<&CdnB#d9VyejSMI8bO#uAb?ldB6pHsdm^Prn zAVYPm&Xu7$c2MS(F87FeRmXZ1(~3rIY+eNd25)OA;f;^4=L?h9?ol}Z&Ov<^sD;Vb z^Vb?C_f^69d`y;jnEVbr@f-QeG^Pg~OkY$?ej~r$W%3*OhrCRFBmWM=B-3~)-(~U_ zAo?@;Wt_@wpH?_ua!{{;A;@hw&*X1W&3{*P8N~au{0goB$7M}^K3`k>m{s;+F!@ma z$dp3y*AAvRV1gze%HQTP`A~kh*KZ%nztd|C59P;=i8INE4M`}LH~x<1&*$`bE*a$c zuMN+m`Avpr-s6_cFXsxH=d_3C*AQ#=^1LVi zq~V!KwiuG&`CC9%q<9{J1@p(KMB6UM5$D!2QnXtxOKv65o;E4+8Iu zHgjQYOMFN44{`qMhG0*W?~Hg~RGaBQY5Cg}vcFOX7Wb;5-vM!X!)~XdpRZ$vOMfA< zqWl|BXJ>SikA7!#mydp5RGWyRf5N5zYZ|GC{;-!mZ?mn57P7sq)WP&s&1&dMKj=rF zM~T{~jGWNHMSlzGUK2Gv1#S<)IYs|yL{-w%5JhjGF8qd~p8k%azW$D)zW$D)PJhQV z3!?KG2M44Gv$uwKJpV6Rz=OMZLXqRWSNsWG`DYYmmwt&{m%fDNyGXOAR2g~BvXniG zkP6l=(heQJ&=p^#JCsZBm9F?A4JZXa{SFD17ioz71N%gAz^y1YEBH9VY*hSBZU zk<1iJXU99-U&M|@5NkpJ;*UI19LLa=_keId&yT#AXYxO3s~7XyR9o$h-U@sCYF?=f zVlNLwTcEDL%Udb~Tcn443)R>17O0l&kwoq9^K@d>XO-~Y|7k`1Phl$jafz31)WoOr z*6C=M&ppa?-d@#-DdP9|iO=|n&-#g{Jj8he|A9Q|=3hIeh<{NXAi2%NIY~T_w^k9C zW`uWw>)GLDIF;GqcUUESkHyy_qKaMp%r@Tlp$-t>Z73+c z&etMqJgWG5#8Jh==;L0ExT^RFeEM3XyH}xbRk7$+QN^{0q-9za*CGemkR4TAi*)%^ zaV;|FsN&aQY>!3!s`x{5u2u0z<{YYcpii;jQ^m6pk19&|$w%jv=uaJ0rQhp_ehdtY z6`YS~`yYs2f&*P}WVgybh`i-wuN{k#(PWTe4$+LMt(-Yn!~q?<)Gf#YQ4 zI7`YS9&Yn7B?#hKl;DtH%&2;IL8eO--W<@(;2aS;mWi(^x z?)fI1SJjNj?{=wD?{gf*ssrB~Y+enUahU|0SHt2ftQHP7-wFGI&3D62u;Du_|0(PX zHvdPhk7D>^mGEsoPb%UII)lXDZiqkWC;p_L_@DTR-*Ab41ijl+e&SDii1Q6l_bcK* zJ*tRrLqx{=XG^ z?*WDU-yI_3Ad;U~#TReo)C+^q(%;vmzN||jpLjW>^N9&`wTAB;dta!Oi~sli3So)kF|Pq3XMMjBazgQUk&OMO+JwQW zQ`sa~kB6Szr>e>eXYe<4<*o)%UOcqZO#m)E9I>nyONnn)M zI}#zSz5%O*9~HMdB#o@z_+eRpqDX?)bkh1$GrzAV(?ZS!TJV>&(w&6S4fF>9@bruf-U_A2D) z7UdJV(hVA=^E7FFu;dXCR%kiT35GADmAA(b_d}nK@&bM2c2)N^r)3@ljvWxuTEe&1 zeA}(I^EpTs`cN@fdt#5Oc2pgpspnCx^y?ao7%v||@p~?cwNZ2q4~^?m+MiK*eiOQR z4AnR4{^mBGMGHODq{QzLH1Azv1X#;=Y4!Z^Zbjn{G_BB;gNy|>)l;LU_y(5nO<9Ao zfq?JH+VwoBhjvHJO*5ZxYOb5McCVLt$;*d?*q$Oyy7}(JIV*I#^xJIo>owKmy6%#% zt;C>P_Y)@p46VmbljX3fa54VeRU~IlsR2}2{ zE2AX07w2OFv}jLJqy(0uv8lSiR-o$&08@@z7*%yhkqg7di-eJ4xLIB3_Da53!WY+7 zwwE_ohCrmaJcM+jNU_L(5-hftG$T^X4~5#x8B$seKI%cOEDvS(R8vtk?*Eh;)g@eD z0SH;;YlYi|+vQLpMT=C)>KLR|MHd-1N*OfIzFb znngjl4(J%T+5w`X0oFJ`Xk&dJv0I#x>tHuKb|I#DbhCt_vzc>qO8((k3Jd5)<;<*gV%9i;bz2 zI9i4jtgiXS>`EPSqBmo8Wy)9<_^&Ef%8d~_94s^tM@K&MV$Epl5?#XnovMos#HqT( z7+R&nG%T@{xnAls+I+T9vF~NZ6P6oKSm7`Z(otg%E1|m>yPrdTl_JK-t60Ozp{lu+ zS7);mV^M;mn!J|6IBM(QfQmqM@w!T5M0{zDX*WmEwaOFMiI~+Nh}>4qcA+F)ulcX8 zPVghc@7g3bdq~r1+f}~V;OI_F!Yf3ha|u%T zY8s{z0`O@ zS#Gmh;Cj0W@W$yY9PXsC40nsXPUO1gViOUT7+s0j+$ydk0wjKDY-?GDi!OJFib|B- zt}y<&()j19@(}to$geS0c{Rcg>ot>VFUOv~%8mJ6C$Dk+xR(9cgm&ZhUd(HaVu2vw zuj`CCIBHn0{B?utuhK_KWZIZ5Slp87uD81Gx=FcfopRUupqKJaOsm1`s*Rbh+LRaC zQ&a?NRQ(gT%@%(tZojP#bB>vMT}=a(Uhb7nX1mjhBE45-JBmX6=<;`ZecJU?=HNDQ zEst04@?vwF*0P$#Q9LEBt4MGO+q2%y-E1iI?-lFZerP{_qMiIhrFdkbd4P1JC`2nS5M78}rmAmK>?>4|rqXatIh9`{O3~s$nio4v z#e=aQVh)^k;eSChbz0%P&;S+iA$AzQ;phN<^HOwsG&V~6xYS`fky&a)m0BH*jZ?w% zbbIUpsz%{mH)$0P`)|^+SQQn-I%4O!ZZw78u&y&N8XKeHbnIz5@G>n&u>-Lqax98< z&`K^oLPfFj=5GQ1)^YWSeS?HxAtk7(K{8+)VT^|KqkIZY$!pB5o^sgnypE zPv}LIQ|&CR#*G;I41S{0lC%+xXdWaGsR~imW8TK2N2xG&LN(A0im~|3RB(jbwe%@k z`Y0`7&;V7YX|eiOe1>8vsy$DYXmkca!wb&Syg9TzS6lcLZMa5@U!;N*Z5gC8G}qEO z+8(<~was)}J*@$tOkisOt6>atblVXHZ|1Td_WF43n4(4bZkVYcs4%1qu za+s?4kfMS};Uy}5mbF!Lo|dGL7XzNDt&K)ojY?aUbF`H;(@Z<+sa9zVuv)-YGln_Z zaYVtJ$qzqwgl+-;lg-rPYM@fpVaY>4u>nVD>z4*av8Q~B)kOn}eG5h7gET&eR=7k* zn{g0bfyGUrEA$~5$mi14hG&(4KM)Oq$@S-{n%VvVtx{Z?taKoaiPM$0lg;W-5LpR!)l>r@UZ#S2 zD*Z=VmLlq+Vw4eN^UffYP*Y@H9mSrag^#nhEW1p_DOxc|Yv*VKGzOnoaX#0{^7FK2 zj@F~t!o#%kGF7B#O+D4kQ3F7?AEwIZ=m@xp{61}FrVi6iKFm?Guy~2q@v)hzPtZoy zJ{5;)`2`Qo8o_yMJ#B?~0cQ(>>{Y64rd!VkK!@oLAdB2DO$kbS6r~nTNsI@S-s_>X z8`r{-dvwbkrdlqWqRPkuILI6=e9)&4EvV8*juYskc8=Bs^s#A?pQFF4N~!sXyK1(UJ4=iCKbFwp{Hqoq^Oxdj7;`6U5N4P`$D{H9*Tu`lsh=+ zEE0qZ><7mp3*b>g7&49$g=-cG;Q^5$wwhM31Swje1ZJ<}o~2TH9&@(j3@Wa#0MgBj z^v+0`7RHbBSfmho`G3MGegE@VW8l93IrOqw`+m&)sBA3Q_kSIIu+#r9{~~wG@*~OF z_i-w3CJSdv0^I&zx_;^PB{7h6Kr#V036KuoO#*(#T|Z|6`4LR35@!PWoC)L?;Z$Hz z1ml9RnQM$Rhi*{O%?q@m9=aUm%;`r|9(zB{W9`RADD=y4v?RrzMaIX?u)4vqum`nK z6@7=}-n@TQesu%+(_$oc()GdqLa);9NO2ui{fJ^Os~&%ZI9`NDxcNh|J+z)%X_26l z05)Jc(Jn4FAVDUaq633eo1%FirG=xUVrpfiw2oGuSBcvIEtc?YOl0*nh2|v(E_uyO zT5*k*iF9+pD}#?BnT|$D{Ra3xuB#T0a>udiCM|kgR5wUfDEm0YBc;tWAGxl$BDjQa z#TwZwchllVT9~5HC^bY%>aJ7CO)5`QAzYSu7%(|oNe5;C0Jy5!t(l6C&_WUSUie8Z z{N!m0?WT#yeE8n{*jb8w6zDajyJ*oUtw_;wBwq*_X;58o7bkd2=BQ>)b;4I^(QaJ^ z-MRF-D7Nq}?(2}W)m}v+*~vm}9i&C**aX`qr{gc&!yRZduFdIdTdqxRs0a`Xkl9Aj%?s-kCO9DaRqi;g^RV+Mu*y{7N@G&Z6Ev&AfN@yWX zjk+f;L8wBQ8AMk$hqq(4@ChM0=03y7{IRkYR6c!FubN){^`RfANcXe_*-V8|FX>@Za*8j{m84Lu-{lu~FEF^zke zMrjp|M&{R{G2ccAtOet2Gn@4hmM9us567E(%Qmz4oJZZiOcZ-fn@?Y4UTok8wBTim zolz+hn~Mt1^YmaLMe6~1O}ozxSQ#rQ`W&r~V$?{l$r+CV!(r@#N7s3SN~6fkR62#h zqAnkeJx}YOqSDW2x$+ghLZ6p0+HUG&qkdCd{WvREFB1JYJ69E1Xe+M1kmZWv>I+&| zcf2WGt@Y_@?bw@9&={@t>ji+PU3GW}pUd4y|5b!N?U0C6Ah^U3#$=?1=+2QOc3j0V z#53KmSFo~m_x=*?#;D~wx}HH=msUyr4Rk{27H+34+c;k~28O6z_;|qcWe}h<%Bw0+ z@%U9)A;`C~wfRv`V+A zAY8LBat30`=%EQAnN~bQg$SmM$_dAB$k%-Eg=rGS))3eVuU$Z~SE%5j*zTKDb{ECI zsxsB9GVno6moR{#UHz}niWiXdpQlwXfWvpGwCn{@TlfWK!)g!}js1WMI`9^QEfosM zORfx^k#pgi5Ut_})fq`WhtP#!QV2>@-6qvcTUUq49nLE6Hu||msG-v_;;GKCCOef{5$=jtU(8%@RO>+@aqeO*@I5$ zQ%JeF0{6b25SbfJ#~!89Ib8{Z*Q}NN@wW6SBnBBozQS`sbWTUxo=ByMw&#qHYa#J7 z=A`uW2QwvJE5ZNS>=I`W{<$T~r3vc)FO?W07R&+erh(X9w3L%GOnM=KJCC5&e1Z-k zJsP16KX9gYu2XHAwx;Not5p6REltw`v_1=bovPD3RU^}7*Lh@Da)Gm}&?9uL0hq@a zvqYsrM5XJTkYMtxsh-MEvzgWdCCnA`6dK#oBUGKDdWIdLCQu09V&k??au8~I}uIu0vFk!agIqjEyx=HpbF zrp>U9>pVMBdzL~sX);pI5%nB+*NNl_T0TlUFg=I?uudeGpP-#1gxsb6Jl!@z$a9fv zHr(JG5qWYk4=JF}HOFb)W3=QNZAnqp9PQCl7YGo$X(uK-V8(9Jx%32WOVR2%x}B5G z4$f7225EUpQ$BQ+4zSwisCqZ;P7wy)n9D$VS3F3C;TpKt934Y>%ybB+-B;B-HOe3H zl;_E8TEb(~m6A$rjw~3VLL^#@+X?hJV@CA{Y1Ly?^9TzS3$MmN_%z-1X&M@#8jNR< zS0goLOvv%ll5Iuqg}HFjy8K>`3LhdQvK1U?#=Obim`?WOXp+5k2KT^Em^>Im7riA2s6N#uLDj@Ag|*hku!RN`7kYvlwfii?E}Y{!x{w5L+Cw1 zha>Z0S;Ak9k3XdBZ<)X2Z<)Wd9{!56@z=`386+@J+eYvQS4>mIHNq?=G`0rQIM9n4 zWmi%41uFdtH9v+4^JZF$V6y=iG1=EONZasl3o92R%m|@AY{0PF$9x82w<37M<4_+{UlyTm5DnvIjM;iy(w`Ir! zi7*)!xd(PA1D@MB-&%|nj1)05a6>7EP^0IFR*A4CV_d?S2&ShNsM)XMY_B|TaD?uT zEU3c>FB_AmsrUoJ@EPa*c zNr*W@$73f!?{RDd3SCXPn~nL=sImm(XKgKm7=|v z3`dDb?6Yc$$ytY4@C)2hRp=DYBU$67`L;x?^Sl&>;LO>!O2tPbi?~0V;Jz5s6^&Gm z-u@<&jXsCbD7Y$YUS8^eL4 z-Cce5(e{If`mEXUdlPnwiS@R0_H?w_{X23}R`pujy87CVTK4SN)J*DBdc?Br^msD0 zLt|<0I$|H_Xz8=>?C$9AY_n45rV}owr{c5f3>9rTN!q8UCeo7$dp4Drp0y^XlA~4f zlTOZ#k0uktRY1!1`FPu^`$gDrbJiMu*cN#phk z*xRseUt3lgJ6i@kis)_JVmCFaqHSHR-TOhrZfR|@+uK^VHSBEKZjB~V_Eb7Gole=q ziPPgl343TN4Q5>#n05PfDt-!#PmPSsCU813K9NXHS(8)A@zm6eJv)`28A>o+mq^#3 z@WHCw-`3i`4Bl=tc%q5ag;&^ft#cg{!KD^aoD_nX;d?7jZDwLFu3Dw0Fz zvdUy)5fnKaKb=q!g@t0*f##LhDBVLfQxIGb=~#zQ07b_qX5;qwa8?3P+Gc4SM%dMj zz;>|Li8Qk*HrQ-JqFPg~3tMts5Sz(RDNt?8RbzXu3)y2hQ0;V>ADM`cDrZq~za^Jr zpjLzEARB89IUT&AF&A?UIaSk;Q#TD;C05!Yd#TvG|9S%pr94*waGXrNbKIsp| zx=V0Eb7xQ6!A85KrPb{PfZe&gzpwYue&3}GrAha#+=KfMc3&-!4sZy3FlXhX%)OL~ zpUo(hO)5cdoPuNLwk@8Xa{pjgOJ{qljouj?4+@=$siC_$Xo2K`b`^EJ()eT%uWIjV z?_-V1Nq<)d9HVW&V^!i35(Gh9j+`3^7xpB&8Kv>l@$m`OCwhBNWsU4;y8E$v`@pH- z_V)cu-Qls#*CS`s3GBDA!P0?NXk@er7s+Xq*y5NAt%~x>e|k->kQIAQPi@TUs*O9X zxKWg&@Ix&}_aAFH+Gg4NrttI_4#-M1v(t$o%SoAFO46rf@S>AGPTeH0G7Z_jKhX9j z1F$7dh%cL<*|-H|Ct;C}!DiEsCrz*pcJ)`aHf*nIXsTF!kxa~t58*UEGc>mQ?2c`lwr#1}G+MQ(J9ps8t~bMWZjPjP_a|Srar+E)!7!R~ zve49E8fbh1{fa$0GnJlJy@?={G;nw-jpQ$@1v#Cic35_Fr0|>{>O^ulF_Az|?aMJ; zFX?LQJJx;lNLJjv{riq}cOT$9-SmwdOC)Ena?FI&(`=ej8BjWjK6$v&noSM!vxbbR z^!E4mv~}%QPCuj)?5tRN+xNGrfr=+V5;V$Vbn2!IFGKb2FbB0w?l(O(J1&ExsWUJc zjwop;m%V_~5;0XB%udCJ?oLnp69NV{)t5#plRR*mOe2M2fv1wG#Mu-^fyk*KZJ@Ar0WNJ1oswR}-)o8w&oZXr z#0ZEaPA7QSn4XwT#M8s$Q@XjW)HsHkoIi8Xsp$m996Z>DVWlvzx?3;Jf(6mn7OiD zU;n4M_NXRH^QLf*saH!=sqv9>8IogqrL(;Ysn34l8bcy+cZWhte_wZRPs_0`FBrf> z-ACJx^Hd0jYSmJbtpyaVtyGbPsc>6m6`6CxpecB8n~4|Q&Ppe0BE+=4ujhILpJw_T zP0m^4vrw)ZQj`w)vNm=ZdU8+c(-~mtjo>-Vl4$mS|qrA>nJT+NLHIkp4h(rC-3^FAk9TbL{DC`Zj9wRX+n9`0)&6MLg ziMs2HCjFRIorlFbni_IcIs^w$(+N&5+}+>D-LP&WX%kO?)ZtOjeLB4`%K(lu?JJF5 znp-4`c}c(OHLlFsP|=JEfIg>oJ0v{?s`QmvpQDU&AO2^nhDAT0n1l^@n6l7z;$V|X zJsx(AS$K4SaNE)@U5ROO)#o8;of(G1!sU<|io+RyF=i519ljVCCeuVbx22U&gObx2 zZAXuGAN90-#vs)YP{yRYwj_^pS*C>g=bA%cddj`vojrGgq9p_`<&7ZLfRPAd^l@$I({Z;8`E@h zBh?2XWWz@-R)2FbLh>yWj3_ z*k-si*&=2pI4BHFOB!u_N?M;SRwz4>>OV6R428I+HgnF`CDH^G9blQXD0$Q&P7t#?`IuEgd}h?HLPk?yBvO2f31p z2S{|Z^!ACMx|?#lSgg{;c@mumFg9kvyr&r1YcEsgiw@G@)eMPop_E=#2wW9gW+gfL zkb=p90!gfm&s!N znAkUVm1+HK1$KMysfl>LJ~nDK+Dn^p)q2#haV8%Q(1vH$k&u+aC}rrSTO z`z9uky-#IM1FAD#12sX0_{8*BJXl0z*peC0c8FqGsWUTEGme)1Ay(Gl0yJew3WhBN zlj%t@HLu4zNkA5c`@4>Gbz`U^3pAk1FmsHmVpUQ| zt=UL|CXL}U>?XgRZwV@>AMps{@W5U*B~YIo9v?+U3F%yGHg@Q0h-1B4e+}Xk7c_d) zy^X-wlJv@@nZ3dc2#6$7m@`CcVAT-wa;}#uAI=D(=%OSfp-=AaX*=2?`vLZMcc~a} zA{?h!GIt@P22l;`G}u_q1$PwXvp|WI0cl!Wdiwe?^Xy}wwWX`It%GxgpvRbXLbeT` zzv$Q!bmGi-%1)dK6$jYC=44(S6G zI0FHvY`rO&R2wo`MzADDLDXlNyvvYm+pKTBOl>wSWRkJQFvpnH6;uxAXC z>^<`~S($R9ftipA&<=Q7P%dK`pdYBHvomeIN>Db1Krzk(pcrFSu>YjxizXcJ5bn}5 zDjV}(GvNVUy$pvP>(n_lyN?%Cx%Sm#BoO`r^OKz@b8o;9f z%r#Gqn1K}rSFPAqcSOio}MxUy+erB zZr-0az(}1g4pp&TAfw^AOrRS=r^9r-ChTNwSzITcM8wx=i|UR70-LaBIMuzBWGURo zAe>_3pM44wt3yKBNUk`5C1r5U{h~_u^lYoPOkVA9olwo^plMXX=7|SbdId4ep=FpF z4?w|`Hs;wzwMfh8gH3CU5+>%TRVRFiHbYs4EV^6K=AMC&dsE$OWa$a5`mw3WME%+N z)?03=PsC@>37UHB+?&DjRej>DEbh;;0yi3X&JUO%23nn)v^mh$?f{?s_^C<9W@O&EX+U8}Cn zSDKfI(Y|$KvfFbOM<^>jl#(qaa)!NesZG2UB*~{D75*4I#$Ro0*xZK`myEc-ShjK7?oK@~4Xt z;ByFHhR@gVhXra`zo_B=v0VY?G<-zEpSeu|PH6ZA4gcmYKl~a_v+*epZn7$^z50=? z{ERgIJd1A#@RJ%|Dp1S%f`*$n3L5y|Y54tt@`nH5lV87w@+@!gxw5QCh6f*3yAXO} z_)qqt06zDr173Nl;K672ZrAYOqlk}bc<}koGa4RzM)|umJov!%YZ@MW>ii#Rc<{me zU(oR2`!V<}^ek8Kl^(}0LtT0v(_gr^3nZ#9Pp4;VSVZ`7smhiwQM14vGvMF{qVm5d;#PgIiuju z=*zDP++UW@o-5??nV*V?!V`S+$9fG9K5~1vh6kT^eO%y~_DfZJP%L&#S6w`+V2d3K!N@7tl^1L|NA z9>AGR-faRe$#?6Y2KlkLo{~Nk|@a;(-%TfMMbHM*M;AQ-H z#y~rMpW%qZ=H;s<-u_JRlvu%6iIhf_{Rdxnwp!py7Vq!=9PncrPw;(qQ#r~%pv&)S zR@nKWK>T^c!28wt7uCUfA_tzYp99VEl~avjC*SV&t?yY1YTkVU&V1UNBKEjKKMqyhjWzwogDCIG@jsFmcE#y{I_zz z3(zhc2dZ>@fLi3U9B_{R!Fant;FZ>;Ks>3F_SKa=hu$1;e&sCN;Scaq1^yJm5BYOi z!-FqzdUp;yH+1>$rBwY+*13o115^IUh zpP$ow-lyTg_sG022cD1TfWMRj{?i=rVz@*$x#|R7Vg=u0wO_-7?`%7n1J8pw;2+U= zg72Dm3h*ke6Yt?GIq-z=GJ|aVZ_EKdB=C}q*W=ka%FpD0U)Fen?|}I|4gbun;{I0M zFZ_vy2j6e>mpSmilmlLh_daCP&#D~ooq%W4&xsuH(>dVp$^rkVz)LLiOgr=bjAu1G z_!`7FGvN^!iMt!A+&M>QZmZxdBRN$(bw=x$4BYp4sU4w5m z4~y)cwY?_anOW^H^U|_jBn)PoK2S&yEd%bI{tOmYlcEB3nDS0QIy`xSerf#NnkjMC5u^3h3tlu6jv9roVxX$3 z24vTfYbVz(W_9izMf;n05EXQ8*qTlT?@?tLvCxV!NH--6oLvah4f z7Irgn$qcdC?E!)G)Vf%ik!NpDe@Abdy;)G0IaxhVtZxwU>Om$8J-cIl8qBftl=lTX zWH5JZ3{s}noeQjSzU@b=PR$MrMog~BES9gR&pN$=Vh@B<&_j&TyUPd}(%T8M2|sgh zq1xH#AkCavcK2xQZRzN3u{YPLd;h$ObEm_-GweE6IJiX#nLEH4Y-ay?2b0`&!;^iy z8Cl)K=Tn=k1I{`zhWYdDL1**J6oaW~3&2L3_*qAoy3I2~Tf{(o&FzYW`S`QAb$lFm z7hp|j@4=4teXVvQ?#9|Glb=~=xmz6^Dp`F_mQ~a)P9Iv|5`?rZFVH)BwC&;9DO>O1 z^M*(zhD_^gS+Jv&>-#*H?J3g^cyFUaL2a+~@x*Ad__`xKFI~FQ=Ij839pO;5soL^t zoJM4Imcw{;(P1eo)36aGiBpW*DaRgOgrFH0pW!gWe6aq4De)oR*NlfD@btB#ho(2P zxyfOLZP4*<$8{iwPg>7{V20nKteNKLJ)E-+YQwzV_pJ8(Ic(xqU{+*?Ig7bvzb`Js zU)-jYHc?!<>!m>{oHm0DOvd3fSkPU7b&4J?&jKW+u419?^AI~Gg}<8wHi(Aa11`URP5K7@iDlpoX0Wvh}!lk+&HGV_ZSwt zu=IY}`+nSrHtR#%pjKiI) z8Q+F{_yTT@@F_WyAhrNFw6erv*%2aeW9}wp_VkPr2AM^buk!6a4sRaL9pl%Tc?|-e=s1^#Gi_xSx7}qUi$08R7;-L+$U_%=YVj~B=Ird|@b~Nf-OgOnA8~cM zXVuM~o5a(Aa7@jpXub;LuV;IRb3Qy5s8Bjh;^m>dr;_aZmkDktPU^V#1Q|+ey4qe|I_c|rjA2Y9Nz}xW0TmP)C zZ;pDJ+!V(essGa+sDDM*H^(Y}@r?S%aQ(-xzdmL7=XFE=nB#hNYUycNy?a3eafsuK zsYOTrS9E=I{9Rp~d@9Q4^|4c7n znd3!W*q||V%#qjmf9|P2P^K!F+s|qLlsghrd?c4ha+RqhS^wzJcQl-r? zXfS4d&>TM;tY53^>tm!(ots}%&zwJoKVJG~{mmRP4eI*@`Tw}CZ}e~7uZ!#BA7CER z`!V`6u&3~c>6`jypMg2vYA)ysLHf@J>VNZ+DrkLG1^)XfmJ|Fv^ z>KH6<&drhEGKcpfJN2K`^`Cr`^}ma{Y&(X&*-!B)UEe5%?Vmq}u4%^~0mk}s>g#)88C`$8`Om|1q!pF-Lx*jQOvwsNWi0|B@Hzsb|1za@7C0 zuHSgvlvKwct%e-+Z~liW|39!^==}ui-=3rX+oP)F-7CGdGi5!Z>j(AsO0BB@FB`Jg zS640T&K&i>syDushu^sVh_3H1Wm*5!qbP99^?nRp1LN}m3Aq%zLzR3*$DbNNIV2kU nGx49*Yiv&{>YsnMRsF97;#ZJ9cURf!e>SN~o(@z9oLc`EdAuE{ literal 0 HcmV?d00001 diff --git a/v-0.09/examples/get-card-profiles-pulseaudio_api.c b/v-0.09/examples/get-card-profiles-pulseaudio_api.c new file mode 100644 index 0000000..829f45c --- /dev/null +++ b/v-0.09/examples/get-card-profiles-pulseaudio_api.c @@ -0,0 +1,63 @@ +/** + * @file get-card-profiles-pulseaudio_api.c + * @brief This program queries and displays information about available sound devices in a computer. + * + * It uses the PulseAudio library to interact with the sound system and retrieve information about + * available sound devices, their properties, and ALSA (Advanced Linux Sound Architecture) related data. + */ + +#include +#include "../easypulse_core.h" + +int main(void) { + // Query the total number of PulseAudio devices + uint32_t total_devices = get_output_device_count(); + + printf("Total sound devices in this computer:%lu\n", (unsigned long) total_devices); + printf("Available PulseAudio sound devices:\n"); + + pa_sink_info **sink_info = get_available_output_devices(); + if (!sink_info) { + fprintf(stderr, "Error: Could not retrieve sound device information.\n"); + return 1; + } + + for (uint32_t i = 0; i < total_devices; i++) { + if (!sink_info[i]) { + fprintf(stderr, "Error: sound device information at index %u is NULL.\n", i); + continue; + } + + // Display sink name + printf("\n- Sound device name: %s\n", sink_info[i]->name ? sink_info[i]->name : "NULL"); + printf("\n- Sound device description: %s\n", sink_info[i]->description ? sink_info[i]->description : "NULL"); + + // Query and display the number of profiles + uint32_t profile_count = get_profile_count(i); + printf(" - Number of profiles: %u\n", profile_count); + + // Get and display the ALSA name + const char *alsa_name = get_alsa_output_name(sink_info[i]->name); + const char *alsa_id = get_alsa_output_id(sink_info[i]->name); + int sample_rate = get_output_sample_rate(alsa_id, sink_info[i]); + + printf(" - Sample rate: %i\n", sample_rate); + printf("\n- Alsa ID is: %s\n", alsa_id ? alsa_id : "NULL"); + + if (alsa_name) { + printf(" - ALSA name: %s\n", alsa_name); + } else { + printf(" - No corresponding ALSA name found.\n"); + } + // Get and display the minimum and maximum channels + int min_channels = get_min_output_channels(alsa_id, sink_info[i]); + int max_channels = get_max_output_channels(alsa_id, sink_info[i]); + + if(min_channels > 0) printf(" - Minimum channels: %d\n", min_channels); + if(max_channels > 0) printf(" - Maximum channels: %d\n", max_channels); + free((char *)alsa_name); // Free the memory allocated for alsa_name + } + + delete_output_devices(sink_info); + return 0; +} diff --git a/v-0.09/examples/mute_input_demo b/v-0.09/examples/mute_input_demo new file mode 100755 index 0000000000000000000000000000000000000000..8b608b225642a8da026a801ab0d5d3213ef2eb56 GIT binary patch literal 95280 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 M<{4iD-=+2c03DZ`Jpcdz literal 0 HcmV?d00001 diff --git a/v-0.09/examples/mute_input_demo.c b/v-0.09/examples/mute_input_demo.c new file mode 100644 index 0000000..9cd212b --- /dev/null +++ b/v-0.09/examples/mute_input_demo.c @@ -0,0 +1,89 @@ +/** + * @file mute_input_demo.c + * @brief Demonstration program using PulseAudio to list input devices, toggle mute state. + * + * This program lists all available input devices managed by PulseAudio, checks + * if they are currently muted, and allows the user to select a device to toggle + * its mute state. The program uses the `easypulse_core` and `system_query` + * libraries to interact with the PulseAudio server. + * + * Usage: + * Run the program, and it will display a list of available input devices along + * with their mute status. The user can then input the index of the device they + * wish to toggle. The program will then change the mute state of the selected device. + * + * Example Output: + * ``` + * Available input devices: + * 0: Device 1 (muted: yes) + * 1: Device 2 (muted: no) + * Enter the index of the device you want to toggle the mute state for: + * ``` + * + * @author Mbyte2 + * @date November 11, 2023 + * + * @note This program is a simple demonstration and does not handle all edge cases + * and errors that could arise in a full-featured application. + */ + +#include +#include +#include "../easypulse_core.h" +#include "../system_query.h" + + +int main() { + // Initialize the PulseAudio manager + pulseaudio_manager *manager = manager_create(); + if (!manager) { + fprintf(stderr, "Failed to create the PulseAudio manager.\n"); + return 1; + } + + // Display available input devices + printf("\n***TOGGLING MUTE / UNMUTE FOR INPUT DEVICES DEMO***\n\nAvailable input devices:\n"); + for (uint32_t i = 0; i < manager->input_count; i++) { + const char *device_name = manager->inputs[i].name; + int is_muted = get_muted_input_status(manager->inputs[i].code); + printf("%d: %s (muted: %s)\n", (i+1), device_name, is_muted == 1 ? "yes" : "no"); + } + + // Ask the user for the device index to toggle mute state + printf("\nEnter the index of the device you want to toggle the mute state for: "); + uint32_t index; + if (scanf("%u", &index) != 1) { + fprintf(stderr, "Invalid input.\n"); + manager_cleanup(manager); + return 1; + } + + // Check if the index is within range + if (index > manager->input_count) { + fprintf(stderr, "Index out of range.\n"); + manager_cleanup(manager); + return 1; + } + + // Get the current mute state + int current_mute_state = get_muted_input_status(manager->inputs[index-1].code); + if (current_mute_state == -1) { + fprintf(stderr, "Error getting the current mute state.\n"); + manager_cleanup(manager); + return 1; + } + + // Toggle the mute state of the selected source + int new_mute_state = !current_mute_state; + if (manager_toggle_input_mute(manager, (index-1), new_mute_state) != 0) { + fprintf(stderr, "Failed to toggle the mute state.\n"); + manager_cleanup(manager); + return 1; + } + + printf("The mute state of '%s' has been %s.\n", manager->inputs[index-1].name, new_mute_state ? "muted" : "unmuted"); + + // Clean up + manager_cleanup(manager); + return 0; +} diff --git a/v-0.09/examples/mute_output_demo b/v-0.09/examples/mute_output_demo new file mode 100755 index 0000000000000000000000000000000000000000..961f02e193e46d1c08773812425e505bfe0ecdd0 GIT binary patch literal 95280 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

V2X2AQEKSX9C-z%^78qMH zswd|$1TAdhjUtzj(-C4@fQ2hVkd}}Lfi`!Yt~x1R|ubV2V(T92mqOFJ&HIEZv>%-!L;_e4`ocf{rNX#u~A zwy-#dPu<|0Ovv+$zQTHOBr$I^#Nx?F1J?2zs5^}$@MS2w=u9d)JGldSh%D+j*u5he zo;JApOn3q7)02xappa*Le~6#xy+FyC0XRGtod5}Oz{S4?Mj(M91R4z!@wqwrL`%bD z3?3e*XPZushXZu8yjqRVO(PB(c=Gms=Yox zuNo4MBsE4evMcbGYoafr@Qh0Z3q27RSR7D{III5!Du}C zO#1--ucQ6@OJxIneqOaF`iV|WzbZC<9Ty~14ezL$bkpZoR7H(nx7YlCOtn9#>Q&SJ z5ghtV>v43@X$Ahg?XRMYj$cV7ypZ%_Kzup)92565PEKnucAGXsNBZ*GzkR9r~k7&d+Y0aeSQtq zmf=sge_FMF`dzmFKH8G)==OTQ#q+AY77W=x9U8CJNA*_OPXE{K_4$r0?eFcD zH3EL!Ql51?eV$V7-L(wkSBWqj6my-2Zl}xW-h+Z4{f27K&WVy*{MF%4i&MvcEX!K9 khfC}DjS~{n-+AJf7e94Z+IFqRxHun`HP3n)cy5jV2ef~T&;S4c literal 0 HcmV?d00001 diff --git a/v-0.09/examples/mute_output_demo.c b/v-0.09/examples/mute_output_demo.c new file mode 100644 index 0000000..044e2cd --- /dev/null +++ b/v-0.09/examples/mute_output_demo.c @@ -0,0 +1,89 @@ +/** + * @file main.c + * @brief Demonstration program using PulseAudio to list output devices and toggle mute state. + * + * This program lists all available output devices (sinks) managed by PulseAudio, checks + * if they are currently muted, and allows the user to select a device to toggle its mute state. + * The program uses the `easypulse_core` library to interact with the PulseAudio server. + * + * Usage: + * Run the program, and it will display a list of available output devices along with their + * mute status. The user can then input the index of the device they wish to toggle. The program + * will then change the mute state of the selected device. + * + * @note This program is a simple demonstration and does not handle all edge cases and errors + * that could arise in a full-featured application. + * + * Example Output: + * ``` + * Available output devices: + * 0: Device 1 (Muted: No) + * 1: Device 2 (Muted: Yes) + * Enter the index of the device you want to toggle the mute state for: + * ``` + * + * @author Mbyte2 + * @date November 11, 2023 + */ +#include +#include +#include "../easypulse_core.h" +#include "../system_query.h" + +// Forward declaration of the toggle_output_mute function +int toggle_output_mute(pulseaudio_manager *manager, uint32_t index, int state); + +int main() { + // Initialize the PulseAudio manager + pulseaudio_manager *manager = manager_create(); + if (!manager) { + fprintf(stderr, "Failed to create the PulseAudio manager.\n"); + return 1; + } + + // Display available output devices + printf("\n***TOGGLING MUTE / UNMUTE DEMO***\n\nAvailable output devices:\n"); + for (uint32_t i = 0; i < manager->output_count; i++) { + const char *device_name = manager->outputs[i].name; + int is_muted = get_muted_output_status(manager->outputs[i].code); + printf("%d: %s (muted: %s)\n", (i+1), device_name, is_muted == 1 ? "yes" : "no"); + } + + // Ask the user for the device index to toggle mute state + printf("\nEnter the index of the device you want to toggle the mute state for: "); + uint32_t index; + if (scanf("%u", &index) != 1) { + fprintf(stderr, "Invalid input.\n"); + manager_cleanup(manager); + return 1; + } + + // Check if the index is within range + if (index >= manager->output_count) { + fprintf(stderr, "Index out of range.\n"); + manager_cleanup(manager); + return 1; + } + + // Get the current mute state + int current_mute_state = get_muted_output_status(manager->outputs[index-1].code); + if (current_mute_state == -1) { + fprintf(stderr, "Error getting the current mute state.\n"); + manager_cleanup(manager); + return 1; + } + + // Toggle the mute state of the selected sink + int new_mute_state = !current_mute_state; + if (manager_toggle_output_mute(manager, (index-1), new_mute_state) != 0) { + fprintf(stderr, "Failed to toggle the mute state.\n"); + manager_cleanup(manager); + return 1; + } + + printf("The mute state of '%s' has been %s.\n", manager->outputs[index-1].name, new_mute_state ? "muted" : "unmuted"); + + // Clean up + manager_cleanup(manager); + return 0; +} diff --git a/v-0.09/examples/print-input-sources b/v-0.09/examples/print-input-sources new file mode 100755 index 0000000000000000000000000000000000000000..ed4a86ea1c9fb6ef7f2211834f57a9225a529817 GIT binary patch literal 96440 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 literal 0 HcmV?d00001 diff --git a/v-0.09/examples/print-input-sources.c b/v-0.09/examples/print-input-sources.c new file mode 100644 index 0000000..09fedfa --- /dev/null +++ b/v-0.09/examples/print-input-sources.c @@ -0,0 +1,92 @@ +#include +#include "../system_query.h" + +int main() { + + char *alsa_name = NULL; + int min_channels = 0; + int max_channels = 0; + char *alsa_id = NULL; + + // Get all available input devices + pa_source_info **input_devices = get_available_input_devices(); + if (input_devices == NULL) { + fprintf(stderr, "Failed to get input devices\n"); + // Normally we would clean up here, but no cleanup function is available + return 1; + } + + // Output the number of input devices + uint32_t input_device_count = get_input_device_count(); + printf("Number of input devices: %u\n", input_device_count); + + // Iterate over each input device, print its name and sample rate + for (uint32_t i = 0; input_devices[i] != NULL; ++i) { + + + pa_source_info *source_info = input_devices[i]; + alsa_id = get_alsa_input_id(source_info->name); + + //printf("[DEBUG, main()] alsa_id is, %s\n", alsa_id); + + min_channels = get_min_input_channels(alsa_id, source_info); + max_channels = get_max_input_channels(alsa_id, source_info); + alsa_name = get_alsa_input_name(source_info->name); + + printf(" - Input Device %u:\n", (i +1)); + printf(" - Pulseaudio ID: %s\n", source_info->name); + printf(" - Pulseaudio name: %s\n", source_info->description); + + uint32_t sample_rate = get_input_sample_rate(alsa_id, source_info); + printf(" - Sample Rate: %u Hz\n", sample_rate); + + if ((alsa_name) && (alsa_id)) { + printf(" - Alsa name: %s\n", alsa_name); + printf(" - Alsa id: %s\n", alsa_id); + free(alsa_name); + free(alsa_id); + } + else { + printf(" [!] Unable to find an alsa name and ID.\n"); + printf(" [!] This is probably a pulseaudio-only virtual device.\n"); + } + + if(min_channels > 0) printf(" - Minimum channels: %i\n", min_channels); + if(max_channels > 0) printf(" - Maximum channels: %i\n\n", max_channels); + + //Reset channels for now. + min_channels = 0; + max_channels = 0; + } + + // Clean up all input devices + delete_input_devices(input_devices); + + + #if 0 + // Using the get_source_port_info function to get port information + pa_source_info_list* source_ports_info = get_source_port_info(); + + if (source_ports_info == NULL) { + fprintf(stderr, "Failed to get source port information\n"); + // Cleanup would go here + return 1; + } + + // Iterate over the source ports and print information about active and available ports + printf("Available source ports:\n"); + for (int i = 0; i < source_ports_info->num_ports; ++i) { + pa_port_info *port_info = &source_ports_info->ports[i]; + printf(" Port name: %s\n", port_info->name); + printf(" Port description: %s\n", port_info->description); + printf(" Port status: %s\n", port_info->is_active ? "active" : "inactive"); + } + + // Remember to free the source_ports_info structure after use + // Note: This assumes that the 'ports' array and its contents are dynamically allocated + free(source_ports_info->ports); + free(source_ports_info); + #endif + + return 0; +} diff --git a/v-0.09/examples/print_volume_output_devices b/v-0.09/examples/print_volume_output_devices new file mode 100755 index 0000000000000000000000000000000000000000..1036400d4076e724ddf124f9ba97482eb91f6dab GIT binary patch literal 95952 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 literal 0 HcmV?d00001 diff --git a/v-0.09/examples/print_volume_output_devices.c b/v-0.09/examples/print_volume_output_devices.c new file mode 100644 index 0000000..bfa1b9b --- /dev/null +++ b/v-0.09/examples/print_volume_output_devices.c @@ -0,0 +1,72 @@ +/** + * @file print_volume_output_devices.c + * @brief This file contains the main function to demonstrate the retrieval + * of volume % of each individual audio channel of an output device with the PulseAudio API. + * + * volume-demo.c lists the available audio sinks, their ALSA IDs, sample rates, and + * channel volumes. This file assumes the presence of a system_query.h header + * file and related implementations for interacting with the PulseAudio system. + */ + +#include "../system_query.h" +#include + +/** + * @brief Main function which queries and displays audio device information. + * + * The function initializes necessary structures for PulseAudio (done in system_query.c), + * retrieves the count of available devices, and iterates through each device + * to display its details, including the ALSA ID, sample rate, and channel volumes. + * + * @return int Returns 0 on successful execution, 1 on failure (e.g., no sinks available). + */ +int main() { + // Initialize any necessary PulseAudio structures + + // Get the count of available devices + uint32_t device_count = get_output_device_count(); + printf("Total devices: %u\n", device_count); + + // Get all available sinks + pa_sink_info **sinks = get_available_output_devices(); + if (sinks == NULL) { + printf("No sinks available.\n"); + return 1; + } + + + // Iterate through each sink + for (uint32_t i = 0; i < device_count; ++i) { + if (sinks[i] == NULL) { + continue; + } + + char **channel_names = NULL; + + printf(" Device %u: %s\n", i, sinks[i]->description); + + // Get the ALSA ID for the sink + const char *alsa_id = get_alsa_output_id(sinks[i]->name); + printf("\tALSA ID: %s\n", alsa_id); + + // Get the sample rate for the sink + int sample_rate = get_output_sample_rate(alsa_id, sinks[i]); + printf("\tSample Rate: %d Hz\n", sample_rate); + + channel_names = get_output_channel_names(sinks[i]->name, sinks[i]->channel_map.channels); + + // Iterate through each channel + for (uint8_t ch = 0; ch < sinks[i]->channel_map.channels; ++ch) { + pa_volume_t volume = get_channel_volume(sinks[i], ch); + float volume_percent = (float)volume / PA_VOLUME_NORM * 100; + printf("\tChannel %u name: %s, volume: %.2f%%\n", (ch + 1), channel_names[ch], volume_percent); + free(channel_names[ch]); + } + free(channel_names); + } + + // Cleanup + delete_output_devices(sinks); + + return 0; +} diff --git a/v-0.09/examples/switch-sink b/v-0.09/examples/switch-sink new file mode 100755 index 0000000000000000000000000000000000000000..656abc863f256636a164a223d1d42d8f2bb25476 GIT binary patch literal 93128 zcmeFad3;pW`9FToy)&7aY%^I&SY+520mCAKxCAjcTBuP$aiI_)KopWRBrFyb1uZe6 zVAYRW+hSL$wc@VS1*$c;7T40&g(_+yF4S5}Et=o^{hV{}+zA<^e!jo&AK#b5EBD-I zInVQ)=R9Y-&mHEHiYb$Ar7ZX3SjSm};{7$I+z{5DpX4dG##uR5xi!G*Z)JcUz@N+4 zx!h@kh>u%_HE1~~S+9gQU6egF+Hy-*J4@C}_t{>eDQ;=SG|YNI-o|;sCoWg7RMR!= zmi~I8Zoy!vqzgtoVKWDttIQQ%5t2FgKy-LgJTn;nsb4yp> zX{blP9O}oo(>mSgOV;@_}DQc7T1j! zC3MY z_qU(T`}n<+$isH94te+?j(_fl=2zg4JmMeT1gyTqO~&7am)yK!{3k8$Fajp^^98{C zRFpucqhVd)DYGm5M`%b__%~orSNM<8$aw(`>WcsUG;%u9=pC3w&XaInSMvL!y?wjz z!>`lupPj}(_ouO^A`SkoG;(^T(K{%OoEy{l^XN2w7?(!xKhp3|NMp~nY3#{JBj?&Q zdWWQu|6CgRm#2w`*=gi&OoN}D#&4VlyNZ)D)7W`V8vaBY{*h_ysY}EELK-_yNh4=* z8vfJL@b^jM&)PKn#cA3*Jx#wqoCe>KroES?(R)!E{H!$gw4~9yF-?0p-^TIR`SWlZ z{;Sj2-;_r0;xzWRr;*bwjhw19_5j_b{ln7W9{|3qIRAATy*H(?e^MHIDuh4RDjlFb znxzY?1^7Ix)QaD&5$=A(nl)?wqPp5yiyNyN8fVS2W}Q53>a4ld4b}5&7B^NmOq)7s zVO?$Yw5szLR%=?9l=`Y!jSCv8tL9eEowcZ{rgmXnUHzj568V7%yZ17Z*A;<7Mo$Mxjh+%l z<17g`S3#0QOXt-!EUIekLM-dKVlgEx>w=}Kc6k@r)QUB=m>}mYtC}^h1|tq_uofX8 z>*fH91IrvUZF0)9;EFkm>aBV8n7*jCppiwm{(H9qvaMl;?mnMz z*WuUza#_}c=J|t*-`Zc}t@Yt$(pSTZC-R@_w4{uy7q%t3# zHo2d1KD_H|(#m~!_gMn*2_HU_2=l4*;oZF!Ni%$S1eW)i?ZfAKSj$@A!$*DidLKUK z!!PsU^L+SKKD>XQxz>j-@bRzr;rV>T{oLro7r9838+~~5C{C!Ge0cLnQ1F|5_)?#o z2YvYNKKxc6zK0LL-G}!-T-o8n_ww=Y^x+Tl;dlA)y?yvLA3pBG@AcvP`0)FD_`W{8 zb(aPhYyEuqun+GJX_8|;yqN-|R*4Tk&?hJE!w>S|2mA1YefTmTeuxi0&W9iB!a4}XFW-{!+l^5OUT@F)84-`sxVfp0wUjR(H*z&9TF#si1$fqz5~ z`#iDwgK(lH_|!ExR$RWd(eBuhSp7u!aS_sSqar2K=5d zk5=tF1l~fJN2>O%0^d!TN2&JB0^dfMN2vCV0{@gSk529D1-_Xuk4){W1iqFqx3BH> z0$)j(N2K=I0$)a$N2B&ifiEJ=BT;*~zzu|X6lyOM_yWQ_nzqLUKA$j;MC~zw&mqjC zP`f4Y>4c+%_kIb)fKv#^2=5a31j2cQcL;nmVIFnbw+cLpFpoIxn*|<9m`9uTjRN;2 z%p*Lo@hquZ6*Vx&%jRJYbrbd=T*K>fD8 z7`=&>={uWG7}u7Cp49ipkh`UP+~r%NYr11THemDCM>(5Qd5nfM|6WV2j7iy29z(}9 z(VD-r570)AMc10)#+v)+5z~f+n4GmWOE8VgUEANgvu?$%)`}gdZMCn&0?|^jBeAaV z4}?*5S3>Pbv|t^ABUe^TT26jU`uTbD@N?`nHXeV6vYp{BEzrLDZK zXNWFr!z_qCFI!!)Ls1_F!}y9F(aRR=;N8VBFznwtkXy=+NgXK1_y)>*|MCx%5^Z~V zi91lXuN8-H;UeY^lwoHP*V=Z~=gEOG3A-LWP^Mx$>Vfj(apbFLYpr;h1H%lImwf}J zEoGpTv`l~bD+bDemHh)Hy#O8I-=jlhpmZt69VlNVW{egSZmBp>45Ifyq&raNW4cL3 zZ#p%;f$}KUelt)GlzLEA`_W$Z&d{`f%*qZI!7eTKsnGJ-#|%Q z*$kA)N7E4;C@-6Va?JROm%V|~#z1yHGlASv9wt2C1lDP7`&P=>7;MIdury85EQ3>6 z$_&e3ZV<3&bN(+c<5(JtMQ6q3(kENE!E(n^c$$_|PB~`L`4<*l89{pjf?EAV{M?D> z>9rdRcUhu&B^KBwEHPMhFuqW>C01{Z<9@H)b6T$0Cw0+^cmCPY(Oj{6^~&9W#sXd& zPHF+z7F@kgE$O}IXz=ZAm4p)R_IXQrE}XLGFipe?2bcSZe}~LHYW@1BWJAH-1dM8H z+X6IJXgJjdI}GDasVP%W42PjvE*54z|0xHfn7J>pu4v>Lbi}K4`@NsIQcmEIgcx)S zrUGpXrA6O6BrP*qrsI6@RxsI|iw;?(zp9?J zjzitm6?+fK6|=`z?2TS_7LEpoW+>h9#$L*AOYSz>qL*FjZj~9E;MoEmEm3w5ZmfPv zr}$$PllG@y5vz5csKmj!Me)Q#<(612I8<(btnQPZbz}A5HX&B`9T2NO`j`&f=XTIR zBuK38^J4WNoEX`dD_YwoLbmD3gLC_1b$?2%enq{O>HAY-_4$tuRi(eGj@4^XcXh@7 zLvjUTb$?2%eubfQ$0(8isfkrA_@Ac4ssur7w>{dWA0=U~K8;73z?S8I z0~PEGG{yYLY_Ah^E2nrG{*1S^@(G3$0?`$gPRh!l9o`OjyAx+qUqDrMrQeU=(&h_=Bk5 z(Y^>v>FP%)%UTxEH*+uMgN^;))74M$RganKTfOQdP`%}HF{rg|KOSx+nlGOXVX%aS z)ieU4?t-Y6>&b-eMo*E!?S?GoZT;a}ZOU8FG%xz`)=#2CFQ-ADL}Nu6Q-~Y9{gdc- zo(3HJ616{xp1tjpM0D8J=F88c%ofoYy}!JF^#1KF*9&gl<@F%xUCoQqlb6$XvbMLZ zliPLIlchzxd2;i1m^My!Lal9gu|o6Z3s_^W44M@SpF zKTJl@MTpI0WX8GYL}WHk=jdp&WXFwQ*SkeFFVo2PKjwM&WZk^yAxnB`&k{zz9H4hM zu-41VwNv`~tlDX6-RRXS*JB3CTBf$OOyAYgv|Ib!p_Adi;c!DjHn>;}IBd1s`r$E) zxb4tfbdoWqpU;@Z#+WP^1IZ~aItyC=8yCH|OgGl=qQ?{3MYls%iirHd>)ygSfEJ3CJetrfeV-r94H964lalJmoL?}^mC2#UQ{V;@lU zv8ee;Oi=%$+a}`MGNFG@58XK=Ug;-(_zuLZLu@4_pQG)?X$#@jw01q6kI2^(79#&5 zX!g2Q!c%kNKoPunsdjXCpUX}#jy|Csb}R$aa$#z1yA+BJoZI8zILmO%f^|G{1ScEB zVQjU8S!>%TAY#e-n+HQ&a<*r!n5ne@oSiJ@Vq@go2ARzj`&X~rA85?RHQ1PeYeo|v zV?V#dcX0X}7?V+lRWW!c$Xqs$!u{>${&3v?%G~$H{SSGMkuoW%1_vUZg!Tke`#;t; zi_L2e&R~_6;AvWlJg*)gQnqdB;d5-@BrUlewM0_;FCi8cON`1&>B(T87ME$n;kk0~ z)h1Tmwgt~aygBKG$y(gaG@>Q=lCZS4{cyJ{J)x!lo`iKpj|scPV%ytd_FW{j1aD)3 zlPvYrijZwv{PA$J(KAZxxlmYI+eUkOcEPAbOVR0C+_@~)BSmu4E8nU%e7@cGIrr>8~Z4r|!U* z*pZOE&ui9l<`C{c6$Xlb@%j|$96Ij1+LYVC;%$E(VUvffUiq4JaWSf2?Wf&J8Xp+# zYN?E)*w-BM+)&oM^0iJ=pE)@vS}Wwd*|r92ir)TB5LdVT!9#FCbBv`&p^fe`TW2h7 zg=Rg+j|OLioa?54(9(o9zkpEw*lZwTbf$j3w3iJm!4%z6@j>UMe>uFV4QGmJocpAz zdHS<(;a1GBI~wSqini4&pS6~A7|a*Mwk@ST+p>&phf`@wa4uLpFD^w)wKGRg2^ZtB zT2T`va0R!Tw<5hFPY3u=h}hs@f87bJJ4}XZ(ea&Yt?Ow&wh^?pB1S~B1Iax)^XTUe zW&q#uT{dOgmLWdNziS=~eixdc{Wh?8mOlcy?Y|YXing(CC!1Rk?+mdg9~?ub=08FB zKN7zXBzF9WTg;zez3DiJWfttG$NJQ8_2(bAngbAxL>S>=&YBR0PVXvsM#ZN-^V zaT2Y7FV|J_^wic2aOOTQ7GnsxeX!1IJIk@G=88{SDn4DkRT;-a`_5f-Uhr@Ac)SyQ z6IXuVi5igZ}8SUo`hk8 z_KCPKxIJ&gWs2ZlAiCynkkDEoN9y)p;l8C}f8xdiQXO!G^kmXkqAb2Y&78OC+y7^p;%A)^T1h1PK-^~+PP5I@{i3%Q|lJ5Rv9?oASadz z44b#V^oGq^@FaZe#9ln*?_!-e?KO9u@Fz45Xz(uBZea_JHxtI7*r6W-j4?L)7v9f~ zqus4-`_Ng^vi6^Ho|mfKq-rB4wjDTA$D{XeZC^ubOViH8x{9`kaBpqlg%aNV3pX}Q zmtcWHq6DaZe`TY#q0tXr$ZB{HvhK)VYK?kY8j1G!#SehAwp&X4BYpIm5-!#gc1LF!1x(JNkK!5GPuxU`Iz2TfSyzpCc|!?d%L_>(trzz&CDZ=p-rHbsX#Z9E|-^ z%FzDtD_vBIbgIO~N!I_p(Aq_>Gz0y$du8D~`Y-hWHDbK>X&IXIzw4F5eC<21S1fw* zYxc?$kgVS=OU}*pFCWk=z2M6OdSw&q9;8`EwyHprHe~F&Mrh4_teOBWj@a^Lee4FiS4&DM)FsR9|aV++JK!2K}g(40; zp)VPsKXire83)eS$;qU9OB4Ld!}67~4?=rhG|e>a+au3ugAb#E*Otz^NIJZc{jmgG z-jd&po-}7hoZz^xl4qJsCBgR$>%GRc*TA*hw6B8Qn(F%hrLk<0`2Ql;F!BG{;1mDP zVemEwdrE_XMJ&*bd_e!y`K+6I#tj;8tdo!rJ_#1j-ao^N1CI%f=5s#6N5hO{W==~OU#rhT1=mS>tfvp4h-|FF+172lV zr*l8oQ&>W$p_u8AkZ*wIM^}kQP4?>sc7f)iUqTXc!R@ozUBPWE5L=^gzlisUtr4j0 z_Vq|dB$j~#^d#rp!=nVV9@QJ zr48{v9@~j$Ff@M?l<1&aj?p4Z;gM{hI~3*6^fM!%9EQ3r`J)jq-xI(&#Dsnk`Og^9=0k21e{{xZR2V%TII!3zQi`*a__O&9nCn~0m+({V1 zCUOJPw5}s}V3O_i=jZ`9N0~lygB16_kK6}G!6mEEW9Vk-;kMT(I2pN9(Y!=+F!wv` zvS5gXiQIc;vQ}#3E`>M-%u>{n$bAt^{OHKt2*~Szd!VR`$UO!Q@YaVo*Sfab@k~A? zazF48jNGBdkde^i2Hua2As<0Wr^x*t8<-Ng?dR#1jPnV&-UztE6Try*n4Dck?(}Cx zsu#Im=%==?qJq~Nu6AE}k}J>~i);*m9WCWO+vUxE?#COsUBTf$Q|}0Eho*FOb|3mo za`!Y&A6MrCg}y=yzBpG}z_a@&aG2NaO|;*r{FRNVaW|`U+8aLVJGXy!kaPPcQJ1=7 zpY}8rq#Vx_y4v05P1J@yO0H&}+o#dcbvaF#81=(Q9iGoow3&mdaIc;5Pgypm?j>al z9Am1q{p6_wG@R#Y_~abX&`sQsJOEzk)6fBCt>FiL4e*bvVbOsaJ_ky-VZGMyLYd31 z+Ys?-_>re!q-by-66`=iU7BN_#9j}+PQJR<(=%A>`FA4FQ9bu*3IymcbSB; zXZ;?30Yw);u?FJ-)KfX+@a^ldSe<8Aj@(#^rc-EPydI+LPJ zH~byU2On=oKxropAJ7gN(U)lrzZ#yZ;XgFNXt>7HkZ!zv@rMI6TG=bgwXeDuZzUkQ!p(U51KOqCbgmZu8V+>+ ziSK1Rqe%#fyi$26uWtvubq#>Rqf5XozS^zE$4fjEta=de9HM`56)aPMib;a zP}ohBA-8y7qqHlyX0_e&ggkD*ITa0R33ti99qmwiVyi3UWzc=_6J7>gk<9YPAB(|& zwmuLAZ|UQ;`-O!&w8eY%`-U`>TCey$qcQmA84^sG@pJYivxYTVj<*;3JDxhbueqNF zJK0}Mhji{`zN23Tsm-obIU8JKo+tc(Dt)=gA3~~m>zzH%_u79(;ih|2$-kEkofB zcgxu_M7!pDY(4T{VDVzS^>Ot5)z~(;`TF21Ah#6#3D;)tZGJCbzsz5^g>_Fy-Ik(F ztQ7nuuH%0ny^OJhu>@%K)-aOK_%;8lgGF)|v{AGa1#mS@TGunCUnbbTjmq&d zLGTSoY$@7>YqHsr43@WnW*d{R26-l3XH4p^O`7R9sU9KGew3ILTqBaNNR`a-jj1I4 z%LLr7?2zYoMUyBXr-A~WN^JWZ-k^Beyi9PiL>|rWElT>NDuEZgM@2ub)K2w3jk8S) z&X+Mmbvk+7pmhUiDS8t1T5`7I+FALt;=4&;3f@YlqMwn;iy5fa;^awHZ_pT*I8S;G zyl0T^)3+h0C0Gp(zN-*CkE|(gHMC7a5{Imu?_U_uv9c29yw|WD$F6Zj~j1HO1j@T+uY95VFhJ)nM+-5vP#(N~F zqhGV|zGNJ{8aNZ-qork3WV?8eSV2TYs`fXN9J@meB1YJf0T7v%p%ONch%b6x$2X1eOZF~%~R5DHeT|aFN zX?m(MuciDqY4Qc|V9F8t*B*lYd2gz2)&%sJI~Pnc&AJ_m_58^+`G@4h69Cq_%hd7@ z*QusflUJ(@oDY!mfHe8UN2Ry-qMNajx3)cnC(B)=$%j7T?lIgsd3$ry6PVez^DxXH zYoD#BC9L&$=Oe(jU>=l*`-b6oFtk)Wk+|{EF!;&#>F-3jnGm@&>~c2(|9+Sq2^ef2 z;$G|6kBY4ouZg|~CU2a%%d<%8tk-G zyw>GgF>ve5J-yRWQGYg!0eM|z2VTbm_sg&WQ*mqCNv_453jiPG!ni-&ZNZ*nS694- zcU@kaQ1L|cs$)A$Bh74t2`1@*f6+O{1AFv6p76V`Kpj#yoWm~p>TX!HC2cn}_>7o` z`~RXF{s-*oyJ0!K)BN?j;m@$S%Wl}p#`xU0*@e*!KgYeEW)8g@>V5U+>U&=|crT4e zw$=pt5pcVxX&dmlcvjD)?m&sLSIi5OW=q!20}6+o|3$5R=IeM|Uhtxa-gS?J34GLf z9V+OB{o{v3hu$$p*W8*`5_i*kxA4tEGt&oAGp$m+KAw3nIy`zeJ<=?v-b8a{Y|lXM z2GiA{-Q5uKd-w=luPR6VMS9EKFuLCv|K{+BP4e^z_9>>alar{l4Co^|Z=Jz<$w_Fw;mF z;7ZtY2K3G+Cm!y!G<~2GC~M6j>FRq;n3@=0!iU{lUiB8WK<;5sF_i1sC_vQL?zA#pym(>^-!z)s`4?Ci9= zA*yqyeX0Fxj>y~u{l-Y}9|d9o7a*;S|g`JU8H+oqqzAJA!4P=3%(OZdK> zsJB1-&P}GV&>vRwjD^qN2Y2xm1P%&*(U)HfFaTU|D#-qaCBZi)`TF_quxEWr=yd*e zQrliMC1u|^63_fKg3hahIF6YeV z4e#GA?$dqJn9F!({qNx^yX@IBjS~N%=!TwJ$@A<_ZlXH9fpv-UlhzRQ81j|!2dS}7SDmp(K+oefZ2P{c9Nfb4#{_e+!7oF zd^26S3;zd&+97Y~2PL3`0Z}S1g#24t6a1vydwHGXReEHw`?c+LW4J#25iBi5FW}nz z0x0TfIV1)X>#{-3NVJ?8PBg1T^J&=bOa|u6l0@@FY{*Y5G2ip18Tcl5!>ujBt0=^0 zTJU>7c)p4=@yYKSw*=1xo^df}Gd$56OaSDkH8{CkZY+G~64tgoLlNqd^4yDF)P*8KAhKEmcV9{}tFpuPHI z)Whg}Kmsb6Q|m_CTY?+?Qttt7PjATEk(YFI!|nCZF>p&v8cj`NxmI15vZ8Kiaf9~ z!zzyE2^Gm3h}U=o6b&=-vqX=cJnpI`P}@|I}dd8)xYt%c>@6L=A%## zZho+Y%}cs@Gi_@Lj`vHQLaF~-H@|l*6d5<~G50<)G@*V?ua`qR4kC#=|| zn|~o~O}hCG$v+(6=3GSHQ;&Q9=c)I=AN@Y{v8Rr9MG zMr3N=B zqT(=KnB#M+m(KU~&NY6K->Y0y#owx(rTJ&Zr@<?FWyj9 zJHI+UxNP{yva%trUnkWyEu0&#t!s?qXJ{L0s?nmw_>oUEW?r3iiEdB)#&65UQKONb;pgPqCFsMsai5n=%jin;JEh<~ReH*J z6;|P=X;a$cwj*hm(WrZ)3%%&kuNJ3+&N{nX-|Q_PusD8fe86H8jg}?wF|~EI!|}70 z_~G6-n$v`6Xb@lGH+>gZ*ESxPX`Opw#R=0-ni)UU{W0KVZzfHigWtsDKrp``j5Z}{ z_+3tq5T96iGKdvbiB3Z5_&wWs7=mzdQ*EQ`JJBi}3ms2zQh8V7>+A4y)M|UHmcTszLh~#=2=V*P9D9oo&2rtd zY`3oV-?ZAYCe_Jr^18i=$c%Ru1v}j+m*1GJ##mh(hm)7o;P;}9ho;xE0h|x{YqRmn zNmEU59*t-l7MGte=B*oelkfx57_7eTSb*PMURu>q9ru)ApfxnjX>4k!PS&j8Zz0pf zMh5F5nCt#ZtZ$Tep|exHs%3{%uWI4qsuA*o(DL)UZhrxb-z3HWlwTWWH@ObdKS3QQ zw{{GjNhzK9eba^K0{M+?6RO6m{&}jaxZ}^m`jq+YqY1R^5HxwMwB$~Qk+opy(dfAW zi*n4{p=#Fc>{Rb7G;@VX_BACOWE>0{ zuy|0)NHAl7%V?FXqH+Gzu#R;fZE@A2dJHZ7Q^^NVP5A41FgZ?q^$#3ai<5k*qR^rvps4biKMcbDA0&usSbYz_}RClVNFkgln%G$XNflcAGuY(gm0!%nv9d>@kvc zmBsO@hK8!;sMH0&830LcS=^0+F8J{y%?oSh_{IDB>d^S-Rxh5@P*cyJxHo!|0pX3? zYTp=hn|t6o#;umOv*0`lXPH(XtQ~ag0S!;ON#a~jMPFz3Pdon~DAKgdo9GZ#==Zr* zjaBY0hnoi9(yzzURJ|#7n^0FPamDpge$~D6bZ4dEPyPaZry9xrpg-qU&#P)$2*0{p zKmNLSvh!e4lHcqvy6%_ih9%Y933~yYte2uk>=M4DrX=gU>c%+>xKeVbqSyO#D^5TC z)YFHt_h)faH`iVBxv6ZzmgW4JN5?x2uDMOJGsDk`V_>2+@!_(Nx?NG#Fdw_|+QyVM z`9M9oOaFT{_yM3E&V<1@_8`%14f{by$9cFP_CFmRC!!p1V@Jmtlw~M?j`D+_baZS- zdFe*{w|pr7cxy*T7+)Ft^RGHO2BSQ86LKgh??Jf$<;}NsbgV`BPn4TbK5{$iqbxy! zq7CIPl-U9Nem61^!%$8}4rU6%3hT3qKt(s>qX?T%1~}Zny?aO z>{--Dx$2LokFtIT>Z9bB%XgrRzKHrLD^bSqQsr^4baaeC`GZ$GI;Nrg56VWAyYXJo zbto^yyTlKo`~+`Zy@s;ujrIy81kL*x*J@SpjGflYbx{i*4XfWAL|qJ-$Sa{<3molXFW>iDoSg zudH3b2EFvc6#;&j@x21Jo-sjIjaNC z<`CGZeBPK>s#u_UO*ZiVURh!rx;*?&#p}$S3K+43}=9 z-mib&(Qz5b9^GE)$&Z7c^^1;<87cHLJbF3klR$qjMgLo#{@K81Vl17TQvXb^{wmNb zK;NE1f83*Q1pUJ__2a0s74*Rvn_bnXNcvzmc%B8%y+pYEVBhKK2w>dL{&hzOUlK^t z@9^mTLH`8wL<)V9M?Vqt?wAiwPoYos=yO4z0y@8z>dANZdOlhMdLPUi7pK%;?$!S} z=$C-roI+pY(Vqal4RlHQd+obd=yBB94f>^+k6!ZYuUPFkPl*ZQqcG;KGUR4+{X9;@ zvvDx!hhfh8Pl^qnc{U_K|Mx-Y3qXGvbKHWI`g6ScYeDbHH#Jh|yFL0Q(BA>Q6m3cR zu+Sz0`*=I(Z(z<$M{fiDPnbh*NNL{&uYF;R<*ArU)6oZm{y5%=d?v-dCq4TTpx0s! zel~^P>d_Z~-W{(Yznen;n@3*@`YzC~OQB!m(KmrU4RiYkDfYkT*}on1IOhE4Q|dqE z)o%m+dC=3<4`c1P8EZtk`h!7FVC|@fACvyS(4hkQKLPrU_^MMn`U23~TCql?*tf^C zZ!PE#Vy$^9h5m#`-voLUzOedg3jGC-z8&;#Pj_@o^wU=e*@^?#2KqSAKk~;9$G~n0 zA!$Q4=1BWF{4`*Sk1IVN4+H(E=hMgV6wogLy{j0e4GTd}VEz2QUp{SEDJsNHuFbb& zZB55RU*8L!T&%O{=KPmIKjx+M^iM&*;N^}EzBA?ZrTwhu%R;P2J+OZ7PNBc)(Z_)P zCg|zvPXm2D*86nz8$q9jeZUnd@-Ow|UkCaY(EpM`f5oHU3wqo5I9~XYI6a0#Svo#wwgZd`Nz@Iki8@%l*pUrpZ67N;Z2TP88_|i2$4;ni68~nKR ze}36fM|dmuf%q7;)_RNs5Ys$|| znbF6RPq8TnnsTfuC!6w2Q_eHx5>sAb${S4iOH4 znsTx!&ot#cQ!X*(6{ftwl)p6P{ib}w-IEw#pa>f=HTUMfIYPM7*e$T!7DMf+QWNH z0xGx+vz2{gDeVpJ%*XvrJ>-4~?>Bar``eBlfFh6g!Hc2WDJeLO z_uq#$r+XoN7rY8;oF0XIHkG?Sga^TaaJWBTq0BlT zVl%=j{~geZ9)|D`J0>(>B8HJ|bEUKY0m;f9j3Bn{p>(JHJA_EU?%j>;co&Y$u!2Lt z9~$mtpeTA4+O?R)^%QeDSS&ja0+gMNX4_Wq6Q~WXaHfJ>dI3CC68fioFGXyFg3xDn z_IPQ>KB7L?P&o7l)D3;9p_rA$dZB>htN>FUD|c_B>9oI>QwS&9$8+G>r@~rgzXgr9 z{U;y-_HS_?w#y+dW-mwU;`XEPce%Y2oU4X^$W|*WD?)EfbDSqBdOoHQ>Eij$nGhYl z5tmEsmpHN5e?liJ`_EvrqaWwsfqwKQh+b)BeG912WscJa%-u^}=icPpM&oP=lA+i& zD0>EsuN<@KrUoHTn_I8|0Z?;+z}ZY z?*VKs@9QIHh2I3=3jO7{HpAi#rK=w-GDt2!oyZ@DUCedVT*$c(YcWmdJaU59Nq{2fI%5KF?JLX zfn#uqoQsQ+%WU4wW%N*s5-$a!kP_$)ICwPrG%`8%UEBwj;1X#eSF)z?2Y<_EoP5~- zfR@Ai;8IrmR*a7g19z}mt5;3#o+YStQDA^mTCke!pBj6eh_`Tw{EJ+oODbty*V5;e zy&bqYhxfrp$$EOM5Qso2`(Okvx|-Z+HIx;+g1tXYSmSIs!$5N;J#aXc>N>|$8lyvr zm*^lXFrP?9i6E`O3c?H&%~UN+R{@UGXa(WQll$)b(^61NeCnv&MDVOF3g;0QxbkXB$MVMd*18jU(uU?P!> zzNAa6z?p!vj)mULV%2jQfE)tBM-ksyH}|+2h`g1=5)piY%s-0#1V!NIxJ3A@P{~Cb zN7mq6L`c@g*dNICG`ZgNxTG62>votlkd(lMxD-ub9Fv?qWjdlcdKH5I61$C4u6;QI z2dfs?Z2LuhTR`LA^SVPgzTZH6}B(r zIJLhIIhl48lVX^->lw1a3%FS|FchuNpVIlb+XSf}Fl zw{Y!aSL52(z695P_Dcb5Z|s|JKft~R*MatPxDK-4!*#G-h&B$fe+HKfwfXe&aQi=) z?1$M?(Y?d%SK+o1_O0;P5%w-{mf3%XXGYrVF`10AKZiF)TfvW@KKpv-Blw{7x0r#} zWQSD?D$0VK9nlN2HDXa!y_KD6dO6oQ_X3qie90h*eQ>lr z_95$R9)d7=KacTiIm;10(LDl$o!!tG{Xn)kG3N~QPxQkGyDbknqi%IJroRicWx#i>*o<#1xD5+}}38G}%-yRJ7|Wqbi& z^iX+>fCVaJ0D`lpD&qcSp~@JChWFCi>s7{d`1mjlHL8qD;OgEQTBb5yKMVs%mC{G6 zRL1YRV<4%La{;YY87na4`|3zuuQDzM)K3-92JJ>=1;`U%7Y3?%#{kHpzoY$?^ErUL z3y5BdOX*X%433_r-bSfA;&ito#Pw%rC>)Y5pQde#g{04?YmXL&q|?vToTk@nH79zV z8lrW|xfJD~%ixhlH3eOzl{LA_q}P||N~YJBYMSZwWhuSBJf+t!()CQQf6w3RE4*HR z96nm98PV$>!W|cD1*X?8QT|?ErD>+uFIC;RcQn0zSxT?3*7Z!UuSx0k%T+h-4^6LM zp|zV{|GtJyudmgR>GfvSgFZ67ex>Su8X(i_Eh)WzRkGK~6JS4P(aX_w%GnDb?@XfS z;8L222{s<>VQ&MV-QUwTgHHOomxjWjRUBA{*?N43W^#P@)=;62gSduDtSrim_OYEs z)Iz~Qz9JCYH{ea&=kPvTABeN{fjHO#$LAIG`x4|_-k0Z0MT-oze@Fjy>S z8&=}H6Y{v~hMi-9%9~WufFkCc&H5(_P~yx%L-Q(RT*sXrjO@t*^mn?Ea#GgA5H{Fx z2qXk3bIztyPL{TfbKaxqQv^813f_ikBCojb&0HjTzaVc|_&eZm7@c{;h0Su>F)Z^& zh_tZGk$Fc55Oc1_1d&%JK#3EeIU|j2+)?F?>hU~UjqNuanm0Oo4kVX3tytIc#t7Ru z=b1qOj?7#DO1Z;HD{pM(9@I%V^<+Cr*rqs_U^U7cCqSihR&M~~Mf42kPrU#fEr!mv z0-XE;bU|P)FE2q-fWFSX6{2_Mj|_i_6~yTatMf;P$bttP7$x~*Bdip5+DSP|fSA)8 zR_Bispu{-_0`kWT5O=OXXXPI)z+h)TCi(mc0+czAL1X?g0*rIkBC7I_6`tt09@w$oJvm(_d&7Rd4$bAEjkjwTIU%G zI6LPCu&sA$XwJFaCV+CI!$;)#=ap6f*ywPdoLqU>3;y6}cv-p2|dJ^E7>%|!V_ zAoRYL+Zug-dI(nNJ$URE2#Ai?tWO@C^;)zlI$E>-J(X3!q}0GZbZB@4tj_sW4u@7T zj8nW(JSHlxm{#l&T0BQ(GbBfoVHSn%hHZVUaDUtv^^cwmJpUApw*p+zdJRI4gon-| zmJPIG4RBO!oRUq}5~5{x$*+c_SVUzsd#GObqX}8}-b@519jn&>jFYTaZub!ReORft z%6QbP6nhgciUqa!S3Gq7DxwQjMw^EUUx(YQ7sZYo3@Yt*IWq7`jUo=yC&$FE5s9%p zY#PWW=Jxs-=kzV*UcDc{65UDpdodHlY?Z+W5SlxDCY+n~n;f>HmRLD^${sG(ghs}W zRQW_*?$zjfGCUglq8pXvzlbpw8>ljV?UE%ftnlyYj@Cjxo_dTVUaUYfl!O(k6n#6y zDdR6BiT}d$V06(G!R}3B--ZQ6L&Kc!0SUXI2U4HM%w zxxA+NL(qhxaiZpNkF)}2S>aa@bVWxB>5WdL*$Bd-_Z2%$#oIV)Z=(6Hrn2Ob(5{%jkhp zxzA^Wb-UBfxs3dBL=9hp&M!Vzr2N#y>bZdOtk?^nciX7dJmjjuW)qUW6u#{7V8ds- zE-ZCRG4=$RH=ylbs?of+H_XW73i_q0phfnEX_?#-f2k_j^Y(_y;<|dARtq?0?F|d8 zz$fUr{_Eh^_tjnFwAgb!>5C!pusI-&WuQ^^1rYYWI#vstmdR&j@2e?np1mPaKtn!M zrP`1MR=*?B_pM@i`%zkG(()ay<*jOr-||*9*>8EPI?ZSKOUkpn|G99>-Rf#1IBE1? zbO?;TTOH*$`fhcc-{`y5RKL;p`HcP@oUuZT{?(D%==az=_^4YRf^2d33hi!Z!-E%R z9*=HYq5bV_xcA~ro`+VbX;kNI*nDxpt?1^0}u{Cly2C|x=GEOz-%n)N}PC=K_cP8XYGsmhSrf&{|Rby4Tj+@GYh3MI%m28;o4RzM2yU+&p zPR8RSvOkP_+c=y_yQ}a zjQj;w$%xUK#gz|omNE(!f;4(PI#b<|!wqB8aLp_4_u*FEauwVBIy`cR8`*`s(dYLS zb1~qk8}l&6jarklYnZNjy)IC7KdK%%2Q<^8i2)p9YsPH>hrOY^kc0X15-trG+J*G% z6=t~2DC7?P`?8_6H_Yy~$XY8KeCiu}FRH0NMeG4L+x0L;G(YN=LYmswh)MMRe1InK zw~P3>0Ex50nXv!(63&U3LrUrfYSK-n2hn>IyJ`2A!~Ok+XtFDz@F%eBtnQruF^81g zXvn_WXPeq5vf?HADwp06`?`8rcqa3uKib-FHJr|a@{ zx-Q~N*X8SU-7uZ5i<40tK3Xx)edG8sYFg*#Qh4#lH2$;Zg2*%JCCDd;PnZ^qtnLxt>K|bOOA&vJwps0V6e|~E+D&P{e*onQ#neqeoC@_N@x8d%=(2_ zIE?KclJyJ!)3)eFX8pp*`kkquBFL;?7+F6;;UKeqVPyRX#jG6G3nS~tZ#osQa-TNT z5j%T1vjHo~`YFl!Darb&KY=5lB!&2^rzGpAB^>FzXja*3Us1G5NjIa9`@?_lhw8226hM83?xmCck$h*8Fh5F!{Y(04%VICBH{6N5-FsW+=(;Dar3C$?qx2?oWPh@t_sT zy~*#L!fL0o+FY-i-03D!R>b7@$l8w$XBcP&Ne@)fQeCGB z0!)u(&nciDE5P(v_Pl%&!j{8OijX;bf%5`Tkv$NS)2A07Hy32$Qb>fuy9g7=xi|M1 zOVR+6h=?$wocp8LNkBMLaEUV2X3Is7VX`{hst&HgU4+TTXj49SAEithu8D4l{RCxz zJCW$M+LZw&8>2tS6N1(2LeTHTpYddb^`h4~OHq_cQZLpXE6IWkCfj1~=TVUr;A8*T z9s$AuW_V&B$fhS2V1g(1VWb9Jg#qSwVjl@xNsviBJoFO2xRpcUF(mbV2Z2L$QjeLQ zpy)wTPZR}t{Es22$2Nt7q83R#(qcg-^;nvN$Rmexym$2J<<{?(Q0kxLIRLbI4I$P1R&cH z3rc(-0Z4I$K?x8f0Lf`01PMTLB0{Jkh6LbFltXj^@Mq{&tqci3txO^W2|!jd5rPCD zX(mFD0Q5x&5`ex4K?0EVOoSi-n2Zo40BIv4#3TU8hzKzWKq@d1f&`#1LXZF?%|r+i zfZRr!2tfkS7a>Rh`XU4gKwpF)0m#rW5rPCDwVMb*0+5i25F`KznFv7wkUlaIf&}0u zKqf+v0DK>uCPI(^bR&d34*M~OUXCFF$mOQs4xn@RGIVUcig7?WFW?g8V*(u)a_5VS zEui#xr#~L)#kQyw7<0knarlV+&h4r@`vH1bL*d|HM%*KAS8c*EA@-<-O7zfvOm|#7 zSQrOwtEQC&?->MWn})^(LjwT)Ui+Y2PXdqYEA$tQ^XWA?>+^3i{z;L_9XoUg;?ql%im8ih?023WlaAINT`E!)ur= zq1)5Sp@!Hf+u;eM$Fbyc;jd#__h&|d>CnI)(7Figa&R#o4LnXnc zo`8$SE;)ye$zwIJk~|UvB5T0Y8)lCl3KM(e8B$ILGN(-~_F` zT(1+;wakR&RDi`{7dYHwIrLQyTM|3dcCKWzPKV^#v2$(a`t*8no~~@^M$UAbC2PWW z+-7k$kIm9F(~#Mk7S|1_vU^bX;2?9bvGX-lrkgcKH)~vwb98L3u2&x99388+OKD0% zH*%hCWMyyz!*;&ildYIxIZQ@6({P_d`(q1irwTv;vx+&llJ!D6#{8VaoMDuCEFGkB z=Noe)$Wwz$S%gXRynO@s^rn#a`8t8_90Qk^+UU2E{Os7npvqdFpOf_*2zo8g&lMmX z_yqzcKblFd7@qXVyXXf5g z1c(KgOfDEFKuLhf2<0 zGzOSVE;uFYhiJmG0F%iDCYc;yGP&T}(NjUWEWl)P!KvXVAZ>Mk$>f65qAvqj8(=cI z;Ov}Vfo*+&$>f4_yS)L*jR7W;3(hNT1F%tE`Yf0!=4=WunOyLl$TO(3IlyFc!K};) zsQO@l$>f6BV%ydLlgS0=hd+dXC#(pQ$%UcP?l5a4lgR~#=N2-V?A!;sLv*hfA&^$d zCK1Rxa9_w|vh!!&@!;pYjXPod!ezwM9(L_uB1SQpTzo?=?;|f`Q&&{puRonvfJ+XvR{tKwbVkq z$Dq_-Fo10J1_U_jCPZRDwSgM2B1cfbMa~QgXv7>8WV{uv9Ew@F+YJcjOVl+GV5#1? zS84}z+v?w__f~K8!F;REhRuD{NvPXb)dJs7eFvQV)k<&>sQSgH=P+cyJC?EwK4;H41GXrY6IA!&Mm4MyLRIj!^Hy&NB55s3X-m;2fpa z!rIa5PFOWYt%T$;>P6h!>K5<^)M!Y^P=la1tZHzdsV=~Mwkn4`x#|P(#8e5|lCQEs zEmeh}_ONnZ0HLTd3ij9#VqFnK#@E&OXWMXs3afvh27r5 zZNw?R8@2K29qSeuh*%8V4$D-DnRfZkk1EyEt`&(>Mt8>nTS*_>_w2?R5ofk1BOc+C z)Ib(x^eN;$-p;{Q^_9H^4xDv>9B$?#S!lcJ=bQvYNjB~WbZf+I#HshB4UX^^I|5v> z)eu?dtiTxrhUy6%kBSK$?pzPHF+F%cJjN;!r_2*l7S2S^1zsg}WHIlJNu#t$fq^u3 zv;bHIqF`{isVsRKHO4r95pk=GxT1#aj6JQQaRA>VO-{yqPf4FsvbLauV>f7qTRjHu#B8n!hU*U$GhB1ErgHrX&eU8* zt%&%N!*e;czDFkB*mLu7;RK8SrwC2T8llAeFUi116jm0K?WIVzlf64c2)C(H062D& zRy=_;vEOIea~LC~x9iGhkwKJdea9hSi$*%)m}R8NWhL(}!vzo0Fp8XsysM!hVa~ZF zw($RqTqh$&ZQfZ9=isbdxS?o>7Wh;OgH0(`)@-z}sGDYZKb3*=r+hAd1g zNfkC{Xe(=791R|-8$6N>(qMMDo%D3pbcBELB`TX{pFu8e1GL}B+TR*_7uwSO)PA!- zbS^^|WSxxh9Q%P5d}XTOq&th&AR0?<5xLyv*rJ#hyugD{EE=Ru-$t6}O)G0J+FCSF z(_ZgH`zIo-C{ug&Q_|>F*h6RU(C8SNlk|jD#P=pjj+KBYBT4#{ZPih6WE25kq?|Cj zIg2ke72|~_($68c4M*DZ#0^Cw5duAiOT^WaMkXukY6MLY(iVjH+hVp{q^(?5HJ3v> zvyOtQSfeci=wY%-e~e~O(<&=#IEO}=_Ur2&L$a@W^1YB!yce>UM5$B6S5ZoSm&;De zK(~mOtt`F`Qo2!xaxbEF6h9B&#%i?%lZX}zWP~Qo=*xGka_^ny(yhLH$13-gY7bGw z*Q9b^lr~@KVs-yAi(wOIIXMoR#86H+a%G@{wEUrbRVwd`ZdBHjuS(_NRjHva z*-UkORVuf&kSV}&l4Ppu$(O?N@KV?rF1OW}udC$@ol6AgKC5Vd9EdT+%=%qKEH9Q* z3|h}VAymiPXV-ewd-6@OJiICP3lEjW_ucaFz8k&ra1vdB@XowQPii}fmJ4_Nmh)Q( zcIcrjzSve=ql5Hwa?v^ct*pgYHcwJ$)9Au<|uqdp3!H0tAUvQfA8 zwXD0s1C69)qqag48g*BAOtMjTg})_F=}e>U3ZL$8)Lr43{zg3+_8K+INKa|hV_{#T zLeO?~xEqhck9}7+YQ8SeQ&9v+=v&yTT^%kn#)Lk@yKP)x#S1V? z&JF*dUW<_b1_`(7mNk%sM$HZPO*U$7c)T2UO{3<9%l(a-8~&DQRO~oo*aBl%_663m zaJPwo>T|Kf>W2GL?*oi z5`H7!44vj0NgcaGNh6Oy(;o@taVr-#qIY|udm#|yYdDXD#^~-pFXQqE4w<1MR=~ie zC!YzKh+kmkEr*fUhK@oX@$-T%5Dk|>57$dElh)m@4)^mK;X%dw$mAo|ojm*G>#w|UoQgc`;NuENR;ely~R3=^g^V!MsdKWdq5 z?vGvlQ_$SyHuB3_|IWFc^%o9={-45~Q!|FA=%1P~Aw~bR3=<++|G7#1Gpn^wpZ>Xi z{d~=~Uq&Y5?c+I`wOtp8eLi8$mm7AQGNP2h3CW>(12#nP=qH%Z!`-O!wT;uguG$M$ z4(Z+hUu$0i9>;N=*)xL&4gdlK37+Bw5F|)S1V9|(B~T&=fFy`hI7EPy(;5N;U@Tw; znu8=9MV3LziL;JYvYq%_M@yTEH^-V%>|B<0IF5JYP_`3iV}J4$=lCqzl9SEnD6-?k zS$qHYs;aM<(Mp@l_s#V5>#BOMUcIYcRd)+t2 zPSg5L05|@Os`--B07Far(EmQVh5u_qG3s!l`h&X8jIIMAJVUM$M9LujwVy7#~mJ|JG=()ART9JnZV^B4XDl^6S58)vgWFPN4LIY2zk48jMk{S zkp9}gfUeb37IuI?-&Y5W*!sOfLp{~I2CbetyfoBPmzRcm8uZf8U}(6n^t0$^6G^66 zoZWpT$o*o+B9N6#Dva{@PW%l$@qQp)!TFJ|m6-TX#_DS&J!-6um3|en`t_1(nZ!Om zQCb6beWT*`xdwE%df8?RkuR{9Qm&giN`L2rE|V4!Ep%I|_=|`DSF7hZWz7 zIINfjf>$FhD;|VSUyIc0P}XI|`hCKRYY_>{G%Kz}PO>07thg2#^s(YvWYS^95g5Ox zB7RoF-V3C5$5iS1{ zrNbDGD^B07)j7m1_eFkvP*wVlQ}+w1v-d?>T&2A)a>^Tp+!q<*t{TH}U*s(JlxI9V z=5wkeuxF(o!w@f+Qv@ad3`22D5&ew;h4G6H;+2hhypBb*-YB96JVY-*O?O6C>AH-S zKcOcsqb{u7&WM>rKvs7~dcBrrXJpt*^v=jRO?35pbaR@GR_S)gL2G245}G-Qgv>#ZeTi33Riuc{Ob2Wnyez4U4V_TVQOy7xo#OzY9CYhVQWa`>@a0{BN~B zie2qUQ{eJ53i-EtgUEl*Ab-Y>{24#;Px+BQ>muhnI-m0+f8K+fZ-9DOA^-eIg?v+3 z9Yat2t3m#7*fFzg=^hS?YM7qC%a457kNmP9`4taxzA;ygdWtD#TJNw@!!^c0()dU$m;)(BubUZN+H+}`m^~a&N9}l+m``lK=UcPu6FB@=M@6x3_ zZGGO;)-Jwt>{mk7T>M`4qWDxf8uJ4*$Wh-1Lyjr_7=p16sZAIhI<3B|*0N%u_uM5l zEnbY~Pw0tzTZDPB&|xjuRApiNDjKQ)#r4GP#9k?VJaWu4xLs{6nQohakPD7^(tM4+sfHSolkWmet)J?s| zX=-(=ki9wNnb>a*^?1j8bEu!mHb!-G=!~{cf^(Z8dd_Ni1>^L8UOcKAf5^cx1RT}h z(qPSVOCAAXg|=``P*NEOzp(>+{G(D{p#RDps`3vU_P!f!9D>SQ8~N6n@3_?te+WGb zeYBFRE$eC{4(b#VhS14Jn)ofZiH6T@#$5e~E_KSOys8au9#i#OwZA#SS+vmm z+En+4rI`E?wvLJfWOr6*)E)Q7m#olT;vpjc>+@9|Ai1h0gxI7) z(a5c=651;v6b?F6=YA@5s~emu6~QR)w&g6fogVhDAZfS1-8_I>}GIrt3!Cj z;kwe@n-t~Sz&k(s?Ft#!tz{0YX6n!bYe!H5n346mUEzNnxq|Va49?CbbX)bWu5$M# zB{S;ME;DXUM;i_bk9SKq>pl`WB66X6y2s#I$MR=JWpBR7-s+0%ZIC*2ecw8Z*X0{! zgdt(rU5-vyXpuvKW>+S$=r2PjQr=s07x;u701od&B)pwybuNJ_fB)K~>j8C9U2peZ z@-}z7jE6?fVspUXzR|h|L6sFU>W2GuShXUKl9dGYkAg~7Y6MhtgfXo!!{I=pdBRcV zGKvwFORII&uJU3vSnH}!c~%;kcG|A=t7w(3r?faIM5~OdR~t=OU0kfzxY}N$bat&# z`gIOep%!(N^CGxdn5mPf1a@V4d-EnXuc zisC704WiRzMJ*&rtWYTQ+`zUKPe15D^9cP&J-wXP%)O`3xNN z%03EBhQp}xBX|;S@#830uti+Q<3jN5$Mr ziTne8O8yx?^pE_*MAAzB*~~u;{Ij2bj`Gh5{u$z*d-*4cpU^w;6L~lP{1Sdjf0nH!)ZwIQl~ilSeovK&>1>uZRfr1I!FDzm~Rp=T+|hYl+1<4e`g(JfEX zMg~pLrW|ch|0*w1G)p@#)26HfMQdrzWm>sRm6Kd;?Q^vE8g2L*m1U`Yl2%7g(=E$% zFnX1CcF>V#+6BOBf$ajUo*P}JBYg_q!DT)0hx%wA+Mn*AF0RIfU!q%7oqc>j6Sv|R zzD^H^CaDo+XF8}SuWX|(d)r$tJ3UDY%hVKojK(`~02M-H6EF(}%X9#ZMj}h6se!Sa zrdmE^sVq|d7*&3nxmACeHf9mWF~ND7YZ+v{P{lu$_SI;1-tY zP@jT#kRQI(N4KH<`#Px8<-jIYhkMT4+KVH&^|O=0*z-Qd>Y@S0zJ;Q(NlGkZ6dt3I z4jhD6Ah8j61wVQQ^u>6!_tUC_uL%c1Hc%@nM=8kI|;rsr)i+evT@iCb~(L(RtdipDI5bt)UGqa*SMT!cEo{wR9wc@m&8r ztyPUy<#@cRCu!T0v@Y6$yP%kD6I6AXF_%qJ^-btZ^b1t>9i=VNm!K{;1$>DrzDs4z zRQ+w*oFy8hN|cetR$hcDp|;4%CW<~sYoBIq+59+FW@+mrH7wI!a11)J^>VS3EthH6 zGVMXJwWn#@oje;L4BY!@-f=a1fQnEd|0LqA^$Pj&BqR^J4d&w z@mY78wp{VFSubtwYo^;FUTCxPG<9F4O&zrFasYIi?nYyghh->%=}v{IQ)3e00j3Xl zFdfCUaO43!a;Ir0m(9|q$QmffGOc~Lj~}|DiXTNzz>l5Fv^&6$#%0BgGH5O@|-tY`Y$#W2dRh@WT%}O~Z`I;RkmXn2u>oEne-+=pd{Qs6uv0IiO z@&DhzY4ISy_5b4f#p_F8AmM;S0&Wl>4&My|USY4#k-&<7zz=aGu!19j6+bkvQW)d1 zu*s1`I^g&#ZeF3S&EVxMRpuZ?HPQcqr~6|NqB9hF5Q>(h=%*1h@G$IXaU|^BTBs_% z$98Y!x0PN!OBC5~n##oWLH(eEmcKSOLU!ZSSlq3E5ohev6>G$#gZ z!Z^`EE;b=X2G1uxF-beKwDPxU?JOyqx+zlKMB6UY7AAIrHi-E)BC_L}YUX7JE^*CG z+Io#POYfG0S0&gs;;2qq+>- zxp-X^TYE42Is|PyuOg5f;7;8>N$cU*q_sxJ@t5Dp4zvT;mi4vvtJKOAFH`9NRYJ}l zr{)NbHJ9m@N2u`;+Pq8>kvxmo^O|Ot7=rRA-$duPbLZh<>n_vUr>LB{uwxx<0vB@B zsy%TPOcl(`BwYOrt?Zy}7&ZK>?4UJQ6b#;0!%kDp6)KB%h>V9LOV?E#iUQmT)FO`e z$|9MUU|p+f>2`zT6O02=vO(dfouqn&W9=0ML&T_Ir)izSAu%oE5V_VNrQoPw91k## z>ROtOtZKqwzMWuL%MvUz`}Gl$C>-4b#an*MGP7aH!|n%(qCe2$GZtAHop_Dbe3zmZ zRmjBRqRjJ3Jz2=o9zcGe)#q7A88fK#2JI=u#DjhyXA}4hhp~GXuJc){E=6P}f(+p_ z=^8s_Ur4I+1kCoOh++mxenJeNxO3@sDBnt2yWpnYCpj7vJo&??eeDsnlF<89Z_CY zhKlE}N+P#%h_DNRgDCwpD+?1RR(16`ie9FJiV{tiOe|lf=6BQ9>nI7O%&8`yrOi1N zZc$mder@C;x+$}VHkf4E`T~{1m~vC-Js&z$KZ?<{3Uo#PNs~1Nvce5(DEbPOy)Sz7 zCau1gqF+~$>Q$Nez^02Cz|^k!=V|Lp2>LJ6_Lo56dsJBVlAsH}#HdRr)Fi4j`Wlt> zQ(d@yooeJ|w+{o6rEqSMOSUi_0Y zPUV-F?Xb0xT;KPe*b>q|IxpJV*R_M`d7jI%W?nKaQ~*H zf7@!=lXCwM(f9_fX#ckO`?sX~_X78C03x7l&(ErW7547}M@tgDV)}RCqXmr)OyM7@ z0mHA)6c#o*)z2a1<_he6wMk_YSsYGho}}t!T?v!df|dOCw)!~)26;%n%DEs~($;o3 zvdLK6CDX|U^!NpHQhnjq@_XDM#{biWdtBJ~7w=gyPSE&&Xpb>t5&tp~y_as`;0#GG z1aOyO)H=@5DTGHewD&b9wR4?z=IHh;-FB5~ZqO|`T7%K&4qvCb9H(j|gLa)~c2!q6 zx(a=m&a|NAIc{03QaP;Bbq+|7JZo#F)u`D)d(b4r6?qEX+AV!lm!)Qg^-&uzgl{vs zCkboOvQ3RG)PUdls#BM%K)j8S^>A23>k)4+)bdwe$HEdCrK)Vhk&(W4yI)wBfCcrw7+;WZ%&k$ml z=F4)@*r}V?@Nsl{}>YKX;v_-A~cRYt){l+GV;^r!HV1j?!TyJ0Qkx(0R)_ zI*_Fu%XAk9o&6lE3{TRQtj2umDxF}qFH_x7I+`U+yphX5cvm?|<>7j$*D{?!d1N|- z(xIy~pv(7p%Ae-)8+mTJO+u;tku@_^jzEjcI)=We&8Yh|+Wr*Pf0#QJ4e!82_yXPg zM>I7<^_b5fu109eEg{CsNwgJt2gHSg)-CVwu<(6^Kz1D)nmKQZO=IhtT^Hw^l} zGuVUac7na$NHqim!hw;mgUbDY|7<~T;L#z_Wy_b@E>!W1iMAlH=iY#|%2!Q@O%Ef_ zbrilGQT;hd0fsS2N4YTKXo&)@s{jRgAY_1%uS1(iAai;q9J#0y%%^E>qzcJtj3*Rh zndl0wgz4?0(~(t>ETOO7M;}7=w@lyJw@lw94}Fz|=3ChzcS%Dm_=2&*sGBuo~ZCcHM8kQKgpgFP%3AplCgVw39NLHZY5^V(kqo0Ra z`Z}!?6Vpd$qxS*dT@(e=wP7wtdJviCvuu@RrhA>^JkHrPfrSN7zF|aOagosy!WK?P z^wGEkVo}UsJuak-joSRZ^mEGuleq0Pwc!^gh6nsQZ9wpxrLJZgSf=&YsWD4;EYtQZ z9YZo4B_h#3Q7I;89cInjc%*9K6fYxK5Nd&{@>U*;^*O4!N})Mwk8A=9HoU^}D7lOYWz#_uY9ViB1hM8K!UihW z^AWaQM`6!v*t|;L-yFKz;ctNslkc~VF1#M;%lTAtwsty|J3k+{GIObPwwB*Fig&Ko zcC{P~zIL^?aUq*a#*fa%lks$73a7F3)ZEcahYmCzXs>OYt!*6IZ%K>tlS^h2v&s0h zH0hj7&BfBzLM)N=lw_O=yHkuo_VE;Mv>fiVyH0fu4)*lh!$YIJW4%LzcIWs++y0_g zTKLLn?_i&Os&l0KOy@|CwHUKAiRAtE%zSJ%V`UQWh}&7~d@K{UFQn#k3vsT|J7o9V z(=#|`_YMw^k4YOt<0D-?cK769=Rj|l-QPLZGuSn0#V*7W^Re@Z`9yZfo=vB6i`GIa znaHNnb|#fePsIgYY+-ReZf6$bQx-Qpm70!EUC8pK>|8n?n~qQ0%!c_?YSB(4HBhj2 z4h;AA*rP26j`#3+Uhl_-hV2t0L!h(^VGI@~kZ-P6qtrxxSsST>PLT8pVnb|#g+U+4h7 zSZ+S6IxmpedP6L)0V?N*5#(A z;+YH>!2Gjwkn%(Lr#hSgOQz$QY&x|h7+8RN2k+_Z@9nln#~^#$l5|?J#xOVm(M!bU zS*F2QE|Vu;tcbCBp+qwq3_z_E@x>kURb zz9@sHi`}{0oFZZN8&D&u?1hcNV)7Q#sm1w3#>>RY?a8P^?CG&tVh&lO;IhPrzPPuiVbZFX-@*MXM9Z3h{T zM_05|u~sIg=ZG5mFqKZ1jkSSXw*cM>vw7zGg32p1zS|NBwpz~}I%e9QJS4B)|hAqS(hiPNW z*|sdiE*S;(;bWy5?HRLA42=wQjujqkMej)O$x~y@;(T?w7)xYDw7EOVWO|Vpej0%) z*hVIcZOch}5k6Nqk!R&cd%JsVGepk#4-EI5Y_&T(yL?h$^fj5vCT5mgL6}cX-LEv< z&;)le&^riY(k&dl0IR^##tz9|%!+E6qJu-7<6}dk!<}aaWoWgO0C;L>r1vbOQAUtC zYI+I@7*&edJJ_paE9kmM$B&;G8ae^5m9$}j7h>psK#sK$RNa7`U>z#RL+)NstA!>- z!^rsHpr$g9yRHIg?Nr04U5kck51@gNDYibDpqzR0 zSaHX+=@cu+va90@#~myD87q6ih9{cxB566mt}$ji)>J&p8!Ms`Y(}K|95BpNIwI0o z?fDePDvUIbiLPSXLnl1u%g8{t@{2y)_YMXCQl=Y;l#2ildmI#tF-#(Pe6yOoUA zPtC_;Nd#WX{z()7HW)q7VP1TG#t{$AWU=|m=d`{-pFDw;sD{K826vvtVfzHLh{2g| zHPImqeNvCC@{dkzR9Kc};1?5o(e#4xi2u_*$ML?NGRhd+srhL;H8X=6A|0%gM*7`> z);3B9T7?FbU4!nrJ35F8bbO;N0PN=&`yxceJ<1Hi*apm?iS1H31aVA)39{4$j9X?Z zomiA$Oa(%1tr&X4VmGGAV~9kbQ?dE^^D$`uB770YabSraVYaBC1`$J{9wHJEOy~gu?rHei1_$8BJ(1#&Tjn9(*}DgmxknF zGL*DnO<49!FzWJF^eUjCIz(kM9IfpMhAD2?YFbs+{ec`jX(6_{rlsIzkA9xd&8P`T z>LRA4_CjhpS0u=C0v~5I9fG^ZMqL{NdbD90mC)X!Zqtbjv@;o>QZu4JFfD@aT5q5G z5F=pBv=sDR2J2Z<3b8^_Yugz%{;A}21_J<+w3+r0$7&|=H#eiknJw_bd<=F)>7`BOR|k8>&J2z8S*imnj#F2h`8E@vKxWdMQBxm_H8-Vv z7+b0Cp03{GnA+bn)ISbuQivvJ*z}+q8!-jTtmYEhgQ;+W+i>FNq46=E%WLE0uvi;1 z9q#HF!7B`2ms5zQ{u4s05fkzC+DHZi9tq(vO3q}TN5f`ot;R7wyv!jfz^1K$C*Ya6 zI}2kjGZQgy88aMo0(a;IH<8~wL?m5U(%27ko60L2#b(Lz%c|puRE%IlmcG=1(JhL5P63Afx&WL#7irCIT?FW;%@tWLhLbn;d?z#mr(F34|FdrcxQ1>@+`G z%#h?v%TOwXG|iHlLSarP<8NQc#*p8{?0R6-r`B_raQ^e9QK(E z2&c_c^JI!ytjvfCA$Yh|1I$)!fr^J5g<}q`Q#d^3D@Egt zmZAYiOVNm_HurL3b2F7Y>+vo~3(5DNjI*4MM|?n1R73 z$A^X2T3sO&-IF|YI#3qtCR!g%-J(psL3Cyhu{0*ZDof)=kQxUYgd#Z(cA7;;xV7jA zw-z1Y)}kZaT67#+i;iP!(Q#~5gX8cXTTor@0>i|+12O3Rf@*h5~dpW)<=iz1U=(x+ITg&Zef$sZza%9R}?_Zgs#04M6XXVQ?@FyxKhc*`NX4gFy1kSY!K zXB+`yelHoy18z8~#dKhxbJ!=SNF1roIwkd>V`-zSx3k|eofbF9G#laMoP#hdfTF*1 zbWA#$H)lq$6=OB$?6KWq`A%CM)l)JJw`tnd1c}6WzETB?jG%Bp z&XjuOS5GPf%rwdc#@W52vH8WhSixSk=i9wQ!fIx7I-N>8eD_;oS>XxbL=H(rT@WU7 z3qqyWFgTMM?n0pQ_+a1Q5R%Xmr!&oPBvWx|!k<+#-S=`c{f)kk1qN>Q5R8>)? ztar-r_(Z+UFZu0xB*AP!b1}2gP6 zR_lDID1fZexrqB1z<{Y!7FqL8 zMJY@kbH!L9R|t*lyBTC#EI^RP-hocLvzw>q0mNd_+xOco$Aec!*~xqSwdM;4D&Q&) zNcNH(Ox%&z0QiFX+^1kj!yVG0wV9F!=mHvR4%-&|&cr)5URS6mvDjCmqvgWB`hd(B zU29+#4Fb3WnilMrxP3@QzN+aUPD?K&85X~U<6Re4OA3Fl2s?xAJr9g5 zc6-_9u`WF&^q6o((FGRflY;dU6$I)p8UE-&1vsbSDGmPwKP(9!1Aj067ozi50S{T5tYi8y zk$6~@e11#A@6&KR>QX+R)Nu2bGXwu)4SzULo*(PPbOxVB`E?BsKI`&(8XkOrCNr4Z z2|m-a68vL$@Oh#;G(7lt)Z-c+eCF)iG(7m+$w($88!Od>2Wlh6i7ya*u{Lq*cTJ zUAO;$h6i8s!94}SshHQcYP zg1?|Ie?{Q_vV8Wt-0)JSy6MO>n z2aA;dm@XfDr0xqv%73K@{3n1{*6^X*Rk;aW{`&&gC!Rwc zp1;ZC9(*ZH2jDwA<;>qRy1aRo9iG-HpL+#vO1Z~nT|W3mmtQSX{^=s{KLva>KPoUV zj^AK7?6Y|xq_MZJNIO+l@bv~i*6`pfm?}#P%R_S!_;G<(S;2Q~oh?$HpA^n~UU^vY zh9CIDpI*l~DbJ6uWqN)?%gJ|PPx-S? z;Of8kx3>s9TLk`#Mc{u>1pXy~S6Sv+g3sfeKYvxE{P%VF;ERdM5uI?qf{!4t6}W2C z`+J8jAAGsWaFOzrVpprI+MTME2Hn_Fk@8RI_Jc22_(YNNFBXBn%<%9^HXgpu_llIq zoqD1#LA$pa@Iro}P2g2l@bv(FManPe^1-)+JzS*x<3-@VsoM#@`Q=kZ%73v4{B^+D z4%BM<0Jg|y1;&f*f6(5p75FCWv4B0`(cj?s{zZ}U|5gNE2?Jh89vX_k2L)bby{hBt8>+ij zLc@daws=>OcCHqIf2j!kYd!VN-_I6l=kJTa*Wt6Vb6@mX4@LIzZ&yn9wUkJVv@IrhzQ3M_<0?!tKe@NgMN9~t?Pt){U z8XkN#TOhR&n4wP<+H-EUn7X+~&dr(CAahmUr=$~CoO|I?fvYMlWiAHh^xj3g7T*#c z*4jM_dTqWlv&3N*oSkL=f;m%v>Wg!5I$ebf1-2YB$Ja@77roVo6U2CBMAOq0`d zQhmBw9$c|SErtaPd!PylC=?x(Ur5165Tuut2)a zpiq}oX?MxWwsC8<-E#`J@A5u`Q{A|CS8q|X?34XN$2C}prtF|W2_uk_Pj@bG zyS#ZpvreVg)IBkJ`Oa6=C!OAoVk?AG(1VPdch?T`dT+<&M#zHntBux9qxp$rcmLM0 z&i>I(dwf`(X1RhZ3`3f?-mrE>)S(lBNOj(loTi5={4=aWd@KH$-M)O z>GR$D$l{mZ4aTAyzF%vB6EAY ze_8~en%IefJ3=}gLo4DtRxuZdLMko>#u z3w985$9px~oP22Xa%>86!NJH6-iO1HN~9e|J{6e{^q+vbhZFcMde zc~#6Isi5#en3P63#dw_5-pc$Nzj zcab#M3-59(qj4w=7Iar#og$3DE3-nTZ;i|88MY+xxZsA~sX08z0*|0@F11@QuGo46 zgs$$$oq-M_+a4R}!VOy8wp~~U_?~8`G?T?9TeH#F4oBcU+nHp2*v~PeajLc@+U2zz zhT*dR#9viAGG;bgIbL^jddWt|RP_)5QVo4>Tk2j2UsYHR-qR?eZJ8S_@_m|&$YR1_ zg<75Swd6>kUQXmH#xVFFa$u~s`?Q6?wk-z@x1l{>#@yK9Lu%XS@!$wWy+^QEg~e(V z_WgL|M#k5Sr>b8-JQtXj;0nD%sOfxu@GFW}=pK<^)4a{fX)k|78NC@%zURalRpqVB z?owa3^wtj_3~2L**BeAIA|0W5hK-@_s<7A7`}Rf)<9+v{I$bJ=SUrNnDdU-0sMSup zcWeN@DjlDN<&USKt$2t|d`xa$2{6#zZjom-3v-kAum!m2Y0|x?(V@=ejCR;ERp7Nu z+_dClay~+=`#ZP_*kaWZBQWA_LS~O=6f?*q>Ki)1Y=<@v<&N;{VtMSa?O8nZLum~R zpYXUChx28HAJI?>^OJ#$IF#g!;2gV$|kmKJck z7LM7pI?kDYSpAKs7p>jpz$74*Nw`K;9>?x%?#4`ek-6w;JVN!;BOpTmuL zyzgsn8g?t)Z>Ix>Zbl7UEds!c?;ve$)6hV0sQgSzohG%qfUpL;#dpye|iJ; zpV0NqvDRNaul^Za|KU%6nlki%M%OpTJ-WV5zvj^&!*!$zo&LX~>zm_m>WbV)=AG%k zS?^B(##Idd$B<9uk2$s*#0o5J=)ZD!0KY%=(EmU6LX|l_stcQD3?6gjcXa;5Q-5N$ zs$h;E*Y%lxrqj@`!PYO~508myFRGJj=J+*T(BL=qP5(cr>mS$U{zlg~M_zB^57*y- zZ?OI~z?iS5eXABH{Hc{+i{;z<3ChnCxah54TdPW&V^CnsI-oiJMzFpXShJ4vm0{JM z`8D;-`BQ=VW}VF(k=FEmg7p8cu5b8nJ*zRdq0MM2KF5OaQ{txv!B2m_n8a2 zLJ)oSrs(L-wPlNoLXN-ail~=wz%fUnIU}quj&{qZ_dr}uThNm{Ajhap3(K6 zd6V`34s}^}OntL&;xoFwVGPSZe+*tTj;{m8{B!E-{S}}2FqgKhJ?h~6n)>GWFSz2Z zZ}w-rqU%=&_;2c&V;Gga_04+JkFF_{hE79(spp)dGQ$l0&N|nVs>GrxsE@UQbKVEU z`1c3kQC&Z%e_WP7=D1$hS5Wu2Ue|xj1<5~C&wzIossFpW{!fNXNp%d?Zz)p$6R)ZA zA29>3n+evxt4RI3|5a7kyj52$Qom2v5Att*gTnOfy@l%=I_@b_f2dQH_=zbPz;D1a zy1pL^-fiBcO0doKeoQ?B8i9(WQ5NJVBK#4I5 z)>+!BZPi+>yw*BU2T*HJsl}nbw6#jD!;PTgP^G?TzTa={ea<~MuuKcHtTwBX=s1C zrRz_M<6o)vXZNxUG=9qDY8c(?E!Fk9m&a&+x12CWt#2Bpz#-uHu{7+`$yd2Px#dhz9k<|6U3?{Zi;1oDfo{1s=IgKgoKP!bCPO3e{)rl$Ox252J zF@^mLQpjma!M`{K|DY6pz9I#GuN3W_l_DMJ;`nDe%2h$f-ez8&tIp|`*aFBr>C%| zQuuR>*M}>QmeW9d9t1wu=wn3hSFpQ&G3Lx!xVXM73o;YWIbz}9y z+NS2}#+fHhUsPXLJ+pG&qH0C!kHC8Vms;Z{4uC98~oQC?QTA?)8&uM6^Zf;%%LmF%A7LsXyiM4ea*)zGR zxxS%i%EIdAIh75yqPo7Wxq4~yoVw~Iey|A~P4z8}Rn>DAw=`GJnYV0CZQcCprTg*J z)?JXAgLc+Y(BL@`)g+>|mGBHfk6w$gsBEt8S)PQE)Yfj6_9(yh z=#%-iO;z=Xg{u8M)eJ50=AuRODwT;~l&IIc8i_rBD+_PtwRMsZBs0Y)%fK80JZ|0ZoZAQS< z)f-K9^XD{FEuK@eWKKh6W98x|1SW=2RaJFUlShQAIuGzT1>;4YE2wHweN*-R%xLtF zs_Pf@MBs2zQ$<3fr-YF@M?%q6kRZ|01@(=KE1P=|%X+R@Ojk>LV5zKI)&n-VVr?BJ z&#I-Ba~9NMG@=d0Vgze_6|mU+ROu;|)1d)ZR4r~W7BpaPYhGY1u3pShh1$)_8ZZxV zsx%r}Fz&!Ozoo&zRH`M_Hq}>6nlz`WsAF-130PF2G)W5JR}3`&T@=&QN_ zO}k*ug38)O2FDHr!YS1>lg5-ZR!#6A zKyUp<@pB?k0G5G67^Wul}vf=y$QS{G$jdpN|8Xi2`+w!`3TQOu0v>KLB@mW z+?8fvGf3RBgO}h58Ze4vb4Y&NXj%j4y=!Z;4I{%Cq;UlThm1osoG)34 z>Bi9-en8+f<9H3X^sU8~*EVJW=7%=_OWQ}d;m5ZDvW!Yich5!K=XuF6av8?M`rO0C z?;NV|k#5g_7v6lIqEl>^x|QozAHKH_zukwQchLfCauhe zch4}0kNNN!MCeb251;8GQO@?^5oq3Lt`DE%VGX0khY$Pk4L*FthhOT$=lbv~eR%(R zb*&Gd@8e(R!}DCm{oLro7rIE4xBBqCeE7S3czrY|)Qvv8KB5%-!#;dppPbD;d_Nz4 zs}Ju#)Y!yoFyuk_)^`|xXh_z6DzIv@TpAO1!k zexeV5s}Fy;4}X^rU+Tke^x-G_@DKa&NBHoYefTLp{8k_SNFRQ?4}X*ozr%+=+K1oi z!%*7(@P>X)G5%-x@!#Kn?}6_<@Vy7V_rUia`2TD(;v{e-!t>D(yr-GsT7>AY3o+X-_E)45LIn+bF4(z#OLYY6i(+SwrR z6@6|O@rG&Xf>8ud=M})aG=`0htkubL;oh1UFPncW8&Zxli2y<)F84>s_!rYQ{ z8Umk6I81oYS3nFqo^XWlPJyQp&LzBE;K_u!<>=fj@S%jc)#%(P@JPbkVszdr@L0B|6Il{+KYg5S=9g zzeku`ht8j|g)q-&rPbBVjJ#J4*yUpD>s1ol$}35$2M;Ga~R=gvSsz1U{AUSi*bu zN&ge((!6u0z|#niBfMSU$%MHS@7yf#p@g{v@7yTxNWxrtcit-SV8UE-cdiq-FJUgV zJ68&vN0>|O&IW-q2ytzgt>(7Gz5N$Fqh7qd;UlIpKuxBoq#!ijC=pM))&undRd) zk9#)Oe&ofN1iA{V+6?2<1!KYkSEC9hnD!%YgMe7Ob2E!cdz%X}^~?Yhr=C#P&hWsM z67wU)=nZCUH-3iCHmA|!S^U}#}v)*cRZn)AgCOx@gG#Yv>Zh?zc zy%gK>COoh`)>aa0E8p=5Wp3gH3gW%cGhjX$%#XXcYY@$yYU40fTFM;ptkI6;;NpFZTY7iYww>y?jH%atvF*5RYuyJ zH_;{S4QA_Mf5nZoaod?? zQFg=^!!xV)23m#?p_<#C{X@)CvDOzzUqPp$EQh3Z2{G{&)Qhz`M=?y=oWogw>*v(h z3dxk-UN}kY6Bks|x>l!`;t!*6mCZxnYh@fykoFOrnsC48@B0OAlz+;;*oC$^#JA1*)Zfh_P*IZ^ocSU7>`j+Yx$1Ysueqo7DnZ( z2=G|zmQ9@Y9_LyB5pB&@4c`R8BB^r$p5k!zj!l%}`RPYu2c*GCZ-Qgh9&`2P=1Gvc zQcLCJ?n-^@3?+5Gn5$~t=-S#DK>hfhgQ#ZKj@D_V@yw&#`zh4iR#v)Zb9i-MEJrlh zy7_S~W~h7+4QYLngjj0@19?ZRtt^6hsfE^jyq0WRHt|v9T63AU=2daLvSv{br`O;y zIxoa3M(*Mt^<~}iogL-dg|Y%uBS)4u{K|LAP{uNhN*f|=v$n@tx5v!QL~q$?sRCoJ zAgyg`u+{3RGMXgA@4y23r^Q^v^eu? zntMX~P+0pq4L$=;*r~0@42||A^?<7081*exJ&(ly>vY5y zC5??@JvM};Wx8THE{UZ?vlMgvi#4e{bV@juCgP#9;!^38P269&W2y2KC8v^d$Pcxj z&c%6M$m<|yvDwgL?6Wg#Tu($Kor^0!v4 zcq`DH&uincSdXrXJFE7Z7Y^Jt8CCXlNL~|nd%Z{bSXA3}kRsv<2bcSZc_f_^Dq}$-WpeRF;`^a)q60r zqQ1L)39r5dz0pw~2fxu-k9$Sr;|6~3VVPlW71zM{DatB{`Wo&Co0{`Yxr@lXQ~BxZ zWpg-$SN{Umca-mDBX&*uMlC35o3(qtCG`2wx~hD)jO+uqs;#VIQu*%X*M2iy(*AGS zqS?}-ozkK`(xM-KBQ3MrW?}pLrXvqQiLP5zaD2TJld7soYYytJD&O;sTrqc2`JV8l zXK?o;k@Yp1~tB>!d1NXWebN~qwt9!jzJpd<0 zHs*?s_&mtgU3p+`f2{6Hiq)^F*EVZka;$#1>zk_dS5>k4JJelOzV92k09-}N{X-M77 zzlaALUoKVEkM~ut)z$wA+f?;2sNS|l4C;vQo4_h-=0X@OVPUk4fvEc-s_i;5VY$&F zGI(Sq5A%3Ae5+)=2~7*aA8!6QJaP>U`ZydZoO2v;#allPpZ6SK=M2CfhtJ&daV$J) zbL*OOD6>s8h94{&8h&tV+jW9#U(*1RIvM*!;$;neC(rh_cDZf8jx25B&Es0P!n9IZ z33bF@VujWaXQ*gRCSMVJ1~Bx?k5C^e)9{W3Ml{^3_|iPSv^iakd2AW+q|NY1VIl#B1wNX>-) zUHw$&@ZkPme&PpjLQFeiD*##{nRgpBdp3*j6(=?n&c)5j(b)WY zv3QHp7q5B;b}R+c&BD|XzXpo-pWCD0SgJYZ!a8m_oP`=OmaUdB!}+vSZ~mtTgO-@> zS!YA>vMGmyxW?|@iToTOF$P=%FQeSAW`YS(V(>mf=tj=t!sy-Z~M>OdYShi~; z29R^7#=P+coXNiT!jWNg6R8NJskm>~oQEY;w=kAlH2z-T0WQ$s2W)(Ya~eQ?K$$`c zg!RRJiROw!Ew~0~uEf-dMW9-Fwa$7Cxxnoh6We35_Ib@%#vHb} z@vBUE9xUD%d7Vujv1-L@#znnQ{XReKNz!;=w6m=uiehhT#B)PQ>x$R9O?`Uj9P23G z!=}YoHr`>fq0dFe9drGHbhW)6XYRltHr7q(zs1d}LO?`Z}&DXY_ zK&5TY8nAd?yb&?g$yZb;;UXNX6<$vXe1aRTn~`3TJZcBs!Y)6~U-ul=9fi86HMe`M z_Wsrrw}KX*$cSh~4zzGecOGVFy#f4N3=H})o#$B4(%~4m@&iwNv={|uKCZ)Ccn`<<7oA)1QUa|%6Glh~cV3T*@!udPr2>1F z3hdn;;uuIeL`y=vc!B+MEh)_A;CU%59q}?6*5OnGu?<;88s}_yA-m z`w5h%5!SCM{{$FeQjeq}NH+|Lt zM4%}XLH;&PPXoWd=?8o;aAyC@`MyyfXYE70S^p6~Z5wIau8_AvYpP!;e*(Xq}CjABAJdB)r$Mn})Rm(p%|DOVlGVOrVAP1p%hnn`E_&Vgampl*RNpj5gk{w|DCfiaMCLdqF~|E^l{jDe9Xq4md? z6TV2AWL^M6{2_SiyLR@ES(jbrn+1A9Ter@B1-@}RTO~;m@N-x|6Q+)^|f#RUKvC$e#asB zHY9iNl}ldSuUC$O%l7M)XIb|Ey;AFoC9f;5?N-U_l^=u9L$3sYPU;oOAn1K8mm*8k z5$8J%X4IX7=lNDElcBy7uZ3cFrMIa;Ke->sct-F^++2%hVEX1j$EHP|Mx&q?>xh#T zW#w#+nD)YZumaHxne-AD)vH$QHJT3w-(GfhfSu9mJXQ(DHs^X2-ZSsl{-#8|^|tII zMw1`$gBP{D70xN5tRtQakun3zTe4XAp95xo;F?X8F@U>t^cq?UF>0^AA)wV7D~0KW+e**ZjNTFuiBQ z4vy<8In!h+3BG4o@6oQ^xLr;R*Q_*X6{)WOM`1gunc7^##Q$f4PyD}Hy2UvXnqk01 z7U)JE&_6eab(8nF=ZUgv>v4O9R+>L`xC&qlAP*wkGm7g&*NW6_WTbe4dqmUS$qDH-P<8sC!S)h zzc0g*p!K>b-0HNpm!Rmj2wn9UX-0D~bnZLP*VHhYibM^oFot(Rb7zA|qcm>KY?4+z z#=>YG3Osd5uPKrmG@qj)cU$9CUB%<}-RW?I?z=z#iHcMz$`$3ZO-iucrPyke?zz+* zUi~{ZS?7JitAE9g*iJr1kR*k|4;ok%t5;OR4;kTyHV@;!Dv7f)yvoon!rHE*u$W3i zG1DO-|NNnF$x894UJ5_NE>K+bORv)gY8iU$yUta-ntaU1C z;XJIvxfe|QAgEB~$AG+8y9$Z~oqPtLj)r-oEXo-pUX4^zQqbMuAsBRTpQ8-%ACHaG zhCB-;D(IGBw8*3IbT-f(ijrpfr4~>IL*14XYXNIL0h}|QBd6pe@EW{0aG@MIU_Jc2 zNJTD3jmd|YJ!*6Q3l;tkMD8?*@f%V%w4ExeyNfdpF_0Qnv!p_ z#m`p@i!2D*-d5JXQ{L?7dc2v-6>R=9)QZr;(PQ#T98;$_|A?)LC0D81t}X=%eT5c$ zHCtN1z55ST6QyuJAMd8dV`(IKMS+VJrRRBXbZ5&QhJ1MJ(M6?Mrg_UaBQaFdWS zBnG3a-L>IVW$2&D)yjSQEE?LL{lXz^RAPJf0Y&RM=u+G(XZ%|p8z=4|WfL5utHf`8 zWC+JPH2lP`0se6{)a|b!)6=kCX&Bi}!$_Zo$HA=HFiteM zd%^8Us7rJ7N$i8*>*lLpK(+GK2&HG|XxA*&r%%!lcfR)YJWJz~JK`o^BaTuXF~bwS z?R415 z%ESGE$6E=McGK`B?T`_@N@*~I(09yxr`xU5~dVBA(;z%Tr;y8gE~Wpr3R=UdPsHC(*ucnR;wJ277V~CaatBLo%)l+$=)b5D?lvNpzTwz8~fPiEY#_=jYr2=m>mG6C~ zECOeVSt=E{r?n#Zb?wEAfjBncF80M!eC>P-uIg-6?S#&iYdPOzZ?Vk%mL&FEvSSs3 zdpayCVFWCE4I7e$O(I<&QqW2YY-P zM6thQd+mN<;a=S{>U~2144L>1PcT{>0}Yf(ragOaB5QbslH;v~K0-Reea-z87{LBw zI;49q^Bw&XNWHs4OO?IB)%rZ)msIInVci0$`mJ~NJl|{o1%>PG!PjhCTRufo_8NGd z2Aj67U3m4Pe6M<+a5EgxsL_0;?B%=ItDY=wJ7!%(eaEDy)V-IlfB0m&VGAc3Z^`-A zaOIi}Y(4T{VDVx+z8QUg6_yQdzTWu^8AtmJgy zI_b&qrHmzvB|xh-2a$Znw=vO@or!OjIqN~wBW5C`fJ48u#di)qJxR4;tgj6fx(z$X z-R9(?zSoAKwBtFoNWmy~CQvx^wK@~!&KZKDt#BBwx=HQ*BkE;>&c~@7FB3RjP}){# zCU}xwCaBaV;R)fn_5ESWt>wz3i@@TUv>qYRdAOM5{7NL>iEF~4U;i=z*DKrQ{H}05 z1!OOv0QGHf^Ev%8!TAz-G`~!gOiNY*FL*~qKR;19)qfgywr;^HiV<}xdEMv%ZH4cm zUR!o2uHBWtFTUdo3C@#bDtwwuUd-_5QN+nfRTMPFB~C&-2WDyY0jO_tE&~VORd802 zHR-K}_;h54)IRGdwSZjhA^66^Qzt0lgM7l@9ZFnB{7zUYbvh+O(Bb4kJU<;y#JkJT zcaYTqS!#*co_*CmMu$vh6_4>26PX;%&47dCXl^6ZWX|)bqh7P{zGUp&CpO7$Vy4t} zeo73^Pg!7g{lPA75re{(?3bC^^xdc@rtdlqoaccP@5SJn@Ua?~@-6l!exQ6X22FGK zn$xwQU(kRyr$6d`qesLtrpbQ`fnGdsc@(o$B29jcpY|)#)KsNkOZhfw@)~$BX$$>p z4?+LLk5|n?0@G{Oh9Sgt#J54Qnm?H)&!Gcw0>E1L>sp8SYTco0UGLT6jJ|`M`=!a} z{Xu$r54sso@{ahkNO$y*CO=}6yT)+mgNSE=?OG4Yu3LU+eL$7`XM^T?125QU4Oy z403x#7t$Eueg!sQD(;BauraF||DcKNDcpkRVY zc%aBvKTF-?gx`Gy>Kk>#S?rRp?}m#WO4$uRLDY#+XvF2X{}$cwFxXRf!_90_>v!*l zFJN~&7U!(4Q-Qc}6BH3CU=wsn_Q4=5bg?LuYrS3q9 zuvhd8lX^+k$qfpJ-HnNr1EyW?MJ?_X)T;Ybn82gXYf(Wx*dsK`T``7N--RV%Ko422<6c-Mta=yLg1Io+^j`O?t~+ zFuJec^z2P@$Ny<>2H=5YZ$A0^@9NF15B#saxd!IA`>gNc%@6*&2XA6>YT4PttHVpP zxktKKCt#xl!dG1*v!%1)7~d1|KDcDpa?GLJOziCGwNT93@}S3li}RPv?T?5f_uJ!P zmgCnPz@;{P*ZA4^&!ad|zwYtW?fVW`v~>ku^>wnq!<7Y2Xq`RNP^zs|0P1bt=EN2)5wlXp4$0x4}%Veay1(Ti26qBm7Y3nweGZcr};YV3kd)Aofbe0 z_pmYV-f903x9Pr>PP@Rb`y%SzztheDkK1WSsC((O52xUg{;l9REn&SYK|1Yaa`x0|?`=%(v@OiJ^w4RSqH_<}X))io6V>vE-?_=u7W%{L ziN30hAEG_G_zD6C1;6OauLWoTVbUPYO$;QbtIXHWd7vf^5lWcd=$1E*??F?N)}7;! zc2fwhAR8c#V`h*q;;$`Irp<(O)!KP@V#UG1B_y7I`1WOcw#ns-+BE#neZD?v&JoYS z_8&99gkupWQ!DXriazY4+t2aBMO3#p@H!xK|3R_8e25u}`AG=kqpy<)49?WY~T#Ux9Wfx%_btL6?7dl(N?E z@M?T7QVNr*{r z-uo{d1t-xPZO-Lj@f>(FI;ZnRFnb4W{MY?F@{dWrALKSC27D`BxfA~eg}Ghc(062# zafX4U*EM}5fSi0_^vmlUuhJvM?$@^4C-C{O=Sc1jKgPB7MNrJ=WRvK`+Ot4Si?y8| zjJ2Av)>E+DnE}k{MX}bYI9oiWNPo|pX5gFLjkn>wQ3~;y=4=4M^Hr27dw$=z%~=jS zeZ2Z!c%s9p1;|f_vrymRJD2qRBgEqUo2&GrV72Na?@@4pWSyMRel;Ak-Md7-m(v?u zo2cvm!UFd^=i>A)nK3UGW>Xm1meL^b3%u;-a(L1acYJ zyxvUd=8f2Jdk%T(p8ef?^{;(yz6OADb1CY<&AHN)gqvTaZFqmkFLg1c{%_qJq(1HD zEPd~D^RFk zjh_0JX8t@OgeT4Q_eU+MIFwYh%b!bRv~{040lHJa%e zevYfV5Pdj5>hqFr8C|J=&lJ2TOHXO9!o~Or+oblm?MT?AHLBj|K`(mr>&2;{GtMki zH+#wu*GD3_bu=1=z*Fk#>qg@zF7X4uQ8cFo(a4~$DSKK z+5OSrL~kZcuEOtQavsm90w)>lCbOSmvu z7Jm130fr!4+)~%FFDUqgAl*-%(2(>%`8_v%XX`3-=@`uF}+@XyVvbaL}s+RDA?&nx%}R2HO6XF z6i&Xd7QZX4Jv6J14d8spU!ILtOg~WvC#TX;QTeH3-nxM|9X~XU!RqUd8vH)QL~)CnM@O#8LW$8uKSCzzER$T&TjQ8mwuyqm5Z7x$H)&y%TMvT z{RJ$3yBGsdewCQrO&6XE2VG!`4bjbZd9*{BLMWkM$0$d_SMl;)I-U zs#&$OTfMK*%tb_^uPNaGG*tXzglJ@D%Rkl@Db;VI~WA3xZbp&liTLuwByM!;HDZ#p+ z8oLHQDY;Tn&-=5>Pd)YIQ%AA)=WtOs-+ktDQQ3ke%e-?ZN4pKK`7N?C!*7XWV4^kA z(efa5yP~pjAy(sc%}LMX{q?9W{q}0`!$JM*BTBKI!ar(gymC!f*CO11dVN>dOqB26 z(A9M<${*Z>174KZpxlA-zi;m9+K2Kdw|8|#ZNn)3MORlD$_szl)ioF8N*vj)L}}r$ z`c{-@q1=peD$e6~qTGNIKkseKN7f;V@(Gk>C@)8rWhQTcKP?W2XS3U;i6lBonqYUGx5* zD{*h*MT;v@PX23G*F7k2N4X7U8(wGGjWX}GuC7SPFmC!sSJwoT@4k-yLV4KEuC8X3 zY5zpOp?nYJ11SISW>?oMD1ZL1uC7l}4tuMss{o6&E|e2c-uO1^qnz;$>Z5FY7xhv8 z73BjcSH)2uWmzZcqkIo#K_-5;T}=aq`J+<}b7{ovmz5q|hr|x?%*Wh#ZCBTD@*I=S zx6h5C_?v*gx$9KF8#$2~IYq~ZGnWKc8b|j%V&wRtgUJ`g-#Pd@<+`q}^B~WdniILq znx36jzRI>|n$V);uLP+Lv3e{@kH?xO^e9lb;_rUY%l$I!G9>`CDE^+t-^+;eN6{~y zjAO5~R|V{i>5#;B#PN5*&%3&=L+SBY>pVMxkiQf3lalltCwf@F82Fsqy1MxL_FjG4 zNuvPLW1#Q7qpRyu+YANIKh2}B1^pV(-$m)wx8L;i-v#`c$hMrF zRR46Z{#MYh1$}E0{V9(g2Ym|0bWio8s1w9oumtp;>Qf}!I0`)dFb_OHgxjCieV&dJ zK)(-kW_1(vdp$bmrKw0X#ggdLJ^GcP*Mfd(68%Jveh=ukfX?p`dh+c(o{zSH-hg@N zqNMuEy!yLAe*yH?B>HNPo`resaLiwlqxIVNfY76;GYa(WpugH(@n@3~rO+_yOeK_Xg>yz5I-fLe4=o>IMr=mB2o`<)NpHH&y z8PC3Tpg#uswj_FoN8bo~E#~@nlIZ{R=-WXb`#9#lB>L4JeGllr0DX6o{qK7ANAPT^ z$CnshNUHy=SHA@G0eH5gs$T(mC!RT}>NkLX1D-_<=!b;=FR-bA{$B_ByU(PiZv_2t zJe&3;*|*EHZ#(GecxFADM1R_&?*V-y=&vTxU-ak^%x?>}b#+bk)0Yd`hyqsv`sJX1 z;Ex}Ufwv@tqzyB{bIPCbQ-w)BuJC-^4Ekl;Q^)YNpuYfmPccjz9svD@7rVMH_sgdZ zD@29ZxdS|3;8~rDhrZqio^$cMPBrKE$MdA^FRAHMK!4=bt}edh;`ODq&GY3spr4O* zz*|Z5H$3`s(8u77)l~I2fc^&Psp>xp`Y*7qxGYKjC7%4(Ko4QP@wX)UUp)Fg(4PYR zrX>2c9=(4M&kTHj>$getUwiZ^pg#vX|Cv&+{r16LKc55ot61kOOsYT6tG^ud0a*Xs zokahYN8bSYouEIKM1R<$KMMLWSU07r{~G8ofZkJmiv0fby$8Pc!1o^b-UDCnfs$d0 zXXj8=a?0oDUszA@j++OXk1Tf?6&Q8#!KS3Vo>Rb@X7V+xlK-#X>z zVNK`rn;)0{@2|S*3G8TR(>2C)BzKV7OlKnv?v8s40%81Vw6 zwAZz3kA_ET`hU97wfO(ni_N;fx+|U-RhSvNJYAOyba|mJFVp4qy1YY|59;z6UB0Tz zcXaugF4G1X^690^;kult%Ne>nU6%`Vd7&;Z)8+NLyhE1{>hc*~zN*W2borSs(*|q( zx*V>{iMpJj%hPqaK$jQl@-kgsugg1h`JgVJ(dDbUd`Fj`=`wAI*00Oqx}2!X8M-`O zmkV@xp)N1e<@LI}LzfTg@)=#es>^qD`I#=$^nB4vm&0{AQJ2a(>^tSq0OxJfr%#R+ zAA8cQ5z%qu#~eClT=dYAL&uktmW(q-f!7j#HFzfJDd|0hbR~JE;$ItfCy61&inP%k zs~)GiQT&JEd$LOY%Tp9SdPFxy4X%b{$1sKYpv9Qb29UsstS8F?)gV}}_Qt!kMktuR z1rtsvkp2vcfx(a&++YK?(zoWIFw=epD8O&=+rxVw&kC0FYbb~YoZ7l(Bd{SIl##ur ziYVtfK!G1)9`=`xS)e^4@-w9NVBKP?V2< zcF+j?jH3D$EaUwONDTBVxDxl-p9RoEPB54UUgy6s#W*=xH-ca|FFCk`bAO5Zppp9? z3N-FfHZJJ=5z+?P{AYx7K8G1jBdBSY@npd4WS^O*qqU}aI^ z^IiusryRo5r{XSs*cg~$u7O=Re}`n#EQBqVxfC|q<}e(V2Fzw$9djp~mu3XGOG+PY ze}W?CUKp&zG@VN^XMn{pzrxitpNBrn2>cg{^yT(skc-yCLq+NTwr&Fud>IPTKeMui zLy!@?l2X4=P%yXvE=&JPK@lT^_0j{jU5k3TtlX!ZrccFXfNjEba};bg%r_9prg<9` zn-hQtm>1zbXm;TmF*l;`qUMKaW0^S(Em}D^B<30!f1|pYw*5Pb{t|7HE?#I)hv@J- zuyTu!Nx2OklD^F6wsV?4S>1Mxm3C&>rMbQM$Y??AkGd>I+Ks_6>kD{(;~M^)mZE0w9w>PA0-i z#%sn2!-5#EpJ5WX*mTezhB*)YXqp4qRP!a&u+1fiSJONMbu9A|P;Jverv=R0pw}^n zbIvtS08hF(1(vk+__1acFeT=%;hAw}2ikS0c@Rebcq1?# zA~LSCABR7RX22b*GlJ&XXpTH{GD7N^V+>hb*`W8RG}NHZ@3Cfyu|ZVH{o#bTnr&ug9h}2$V}ebVcZ3-f}ZS~`%T1s?l6*w2s{gWvVR&m76|(UT++_L#ga=5 zstlW~f%_pP`_{-}ay63ca*sc#!TDb97TV;jL*IvY2@rIi zhQGtRW&IFwK0*EP`ym=t;9P-g_yb`p3f72= zTiGR|E6Y^Mf)yjcnXM`YgQ7Y|(IUb7s3B|?a9L9nJdTz`%mT*C(BKA04(F>3nfupn{f~>E{pR(CtGXtwcSX3=A@heg$Z)na-!hU^Rx;nd#>M z8e;ak8?+lu!zPc-ZnW>?oeeWG==1PU(=G!#_W__YPNOpqHX|>SX9q56ALF88QSK6< zW^>gZ*nU1Jh`BO0f+y=NM0vzA(^i6JQHhatKHL<+g8nB76dMsKFw^ev zPzA-DYae)s2wGqi{2SNozijmoSyc$5-21HTzY`^6D(gs!9%!b0;K|9l9L|m8nrSA2 zK^c%o7epLWCZi$`oqrX)k^Pcjk0e%x^%khMxY)IbGwk2uw%|_Mw&`4t=?IvnEXe;1 z^z3`GS$8SvvS6VQBQF!RB8QoIL|sjqxMNt1)_mEUK*8MzvaFH!kQim7^QtjXg-gsZ zAua%wQQUrMeW%grjsmXg|3x}4hCL4K`K7qc`$G=9;VY7q6+59K_cvA!9o84pMUFKF zkdf6JQX<36v_pxfL9#wG^4CFM_D(V443ZL_se~eB$?&^jN&cVBtlLmBJetT!o&Alx z(HMLAwWfqkTLORZIw&*`7MH(1oF?F#6{af94Sa4!I0Q!Y5-+Z=8PImHA|9>^qqx>E z$LCO+wSGPrXQ7?uz_c5*tYbBsxuF10(_U4^z#(G#`kLNcn-3gCCs^y}8Y44kNM_ok zVXB6_`hi<>11e<>RFz`A-yMRnGf_s@`m$ct^^1(mGAg&%KYFo9%=`f*+Uqx7Jm7pS zs#QreA~jGE&Q`Y01o95d2;7HX1^fuvhcAas+=qAH@h<~DOYOC@)LuJFZNanDhCEB{ zydCbmt>L}LKtz_>d5=^(Z-+Z?Yh*8;3}gjm=k0LkZH?|X9Vllxra0@yK1+C?gRZh} z>L>Tykz2R+m3!{Ut=k9k{*Yi`3nl42Iqw~A$L*s0Q+UtqxZStl0^W1!XZI`MyA3(A z9S;P9eaOr0cpxY1b`T7k+wnj+_qVvmcKjn0PBkyD_NIMkCb#CWoLlozfl|~jl&v}X z99#2W1GZ#qZpqf%lC8NVTXRdc=9X;DE!mn|vNgA4Yi`Nb+>))iC0lb#w&s?9YwqZ+ z`B6}la}Vvo)_gbHV8SYF&8go=cemz$1rSK*L!4XlKLH9FnXJaG`R~D+>2A&62C`7L z=IogCVN($amTb)}*_vCjHMeAIZpqf%lC8P56EjGf;pnY-8mbk_)?CCiHBgLf%`MrQ zTWV|W=&kvQAop>%<_`c!cemz~q#f?ooKP^`-I^1M7@6+Yd^zgnvU1;Ynoh+7>;g^SV=h4$$Xt+wWt zY|Sm%np^vC%`@Gt`5@Hjdpv?!jJwI^)M~Bdv9@(5u%=bk8@JYITmx1U~{Sp zote1_3JjY&!_YYe^Wd7G&0~bnd09&UL~I@-gyv>l4xq^9F+ylw)&>Ako5u*D>RwL( zD7N_&2`$We1we_-c`j6&^%j6qo5u*D3$p$Lpv>kmLa45HZw$DY&0~a6L)It&6*i9% zLXBBd0L->|j1X$hIt9R7o5u*DC0Ppq)EI?wjKIJMP0E4MmK-BkOMx&gIYzML7{OA< z2o8@CLPy(dvBRT-(6s);Q7xPI4v!H+$3zZC5#UBGbT%%gT;}p_KBZENDP9VMAtlfk zu)|}7(2U3raUZx4mk|D4S$|F8cX)IVI_{twK+ER6!()Wd4Q?)Q% z2{=ll88k|RGg{WBT6y7D8f4dN7*z+ml7T%i!%Bv z+=duxrnH_7GXnhqhZu5#Gy>xYGwKx6c+@chQ;B5sC0t?zP6sR}2N^g<;8dE;V+4oW zxy+mUT?It$3SxTrLTd256ZqX18_LvMIo(hZ7r zD@+pvaDfkq~4X5rw1 z%Ug#V_3V~BKG$;wBG6W6uaCS2g8lFy5Ux=Y?WYkx*+0o80Rrzru^WF{pu>9E*V=p~ zI+yrDISpYr=5kT0jkJ_n>6_XOd6*3l;jj9??4^2?E)Q(%lmT@9p=L8ppB@leYNqMa1Nvws>Z#L%vjMF&)AZ>9 zBYB;frcV#%f`-$B0C@uJ!az0e7yy~>>A@EOa?dAv2`+uk#ImM1e2V!m0IDNSHKq3q z<@(bU6ik;cpQ+p%NtZsKWrn2F)31OP;nNkT?)5swiC(9MaJ^|?0u2XeV{z1Mo`8r` z%354y((4zhO1jsVD4Oo|rDlPz*O!?EzFz-PQm_Bmj3jz}xv~+xelgZ!D-a3~uU~A2eZ9U?(R8n0V)o|RQTO_#Nxi;G)ziJcI;q#!n7z3^)V+S0(yn{`as}yL zU#lS9>#b%#`bhWs6=vU40O?+DQ}dVZ^()O@Zm*Lkz<$i6m&5I*y$3)pw?ly{T>9+e zsy5uu+5$kizrW@0>j4T1rWb)Re2^tWDU$ver43Y2fr^8uf{KuEA?qN^UQ8_%?Ce1> z;Ed@F+-LJXOPw)gnbr~L0cR2%pIbQOE0A+|UzS@Iyb3#Wdmngnr}kTnnHIZeT0Sk8 zPu-wB46E(j=|zp8MC^X7e~bV{_6LxdTP{%;wNHYbxibV9YX6>;V>2Ixuwwf*0xeAfC~F9nlnj6&$j0u1YoilI@btr7zF5o0LN+I zWk?Fp*Ev6e=pA|Ef?r{YYo7*bdE?W`V%SwMCvReim4fy)q#Q0l#BN1<@=66LvL`@5 z-XsB{_8V|w-edua?Zs$Z-Vp+n*f$ZFA^;jkX-5iBW?x4EWdg+P_bFhi02OvNDboa) zZ9hkIj_K7KxViRLQf3tNM^R({oYG=qb%T8gZ97hYW_uTb<1;xaEwz743r@^C48ThJ z2-Z0%d^~_l?JueHyZMQPqC;c)=g+88S~4)XLl^PX(B zqK;VEdr}orW4QA4nW!~hjluf#nac9qiT{G*5%z^A2zE~b`#B<|aAc5EUnXu%aRJ?D1gCwU?m$eN{qV; zu-~||5RrwYqUI@&v>Y*K1c%V>!-VvDH_~7PK;h9s`cF5~@2TrZv5Tz}T}F_{^}YU( zLst&-u*G-awtr+IuKa_wjQhx07ze$7VdXFo&LA_V8@U*Ri!lKe_RZkX82l7yg?;2c zkLi-$NS9nneu<#q4v6V>q)55l#j3f0^04Mc%X{Cd)I8#D)-0Sj# z^KyvHI0iO;Wsc{)wSIO6pP*lv<+R9JKQn_%;;+mK_Pn*eqE|gK$W}hbthK(z2z-p5 z8@d|;-ZS|RSn_kWDj>ZHRS&8HX(9uSvQGu(J@ZHTI*z-_)}c zO&xmAAjG-3?QkXVQcv!=kSoocXpYc*a}cbWXqKtCsmT8vPMU1Wg2`H6ZydUaHol$q zQ*#^w^mE8h>pt-0Y!ws|=`a<3cN1#g4@_r3Tq z;HaDMXT+|#I{S^Ws_J#BK-GPydRP@`x<_NfIK)<$ZUTq3zN~PaXV2?b~L<@}F1r051s z_SHU9*FJ_7??UG?Qy0LvI7BjaTi^r4fYJS3+ZHSw@>HfSPi5-z4+C4CO4sG7bX}fG z*M)rPx;&Mx8>P~9p$(ke^oz2uVMth``mCiGmAVV*)LjgykWSr^9MY*fx!0*Xx!0*X z-j5F2FHw?8-R1K>^g1+PYqgyB+t4t)ReL(`^;@+Kyk{B@Z`EFn`#$blwG+w9G#=in z{T&EKK)+S{1nz@IKEF#Gs>XfVtG#0=(0r!x&PW7!5}HWzPWqzww4` zZ}o<4h-tj^hwQVVrq4aln3cXS5<nH3@kCJ`=7ji?)`URKUjO~7s^$Y&nGBA=HX8o{W z%sL(F4d+T+gLomAP|#u4FNha%2}O)-)(hf=+^rCj&&q?!QAg|?V9y2o-CoG;tFwOD z%=!iKLT(;KOV*DOvCzI9aPJf^qa(k;6a`#grgfzp0RLll>WuldPX9 zSwB;kFVXp!0iU0h9%Fe(yv8 zv4GC+%>z&o(D}Va0J8%+zjrx+xdENu|F5^Lvv(E0BAg z-#ebwPG+_FUNyOsYBptsbbgPlL)dVJfl`q0KqW0zby`3UGde8s5*=jNKP8e;B1pr& zpD+VOG4Zs+u%84xghn%Hlm=-sXK*e2zgdrAWO*Jj>@SF9I0+K(O5!%mh*C`HARG2T zz(d$HMwb$P6d)~k0;@38ENML(X4t0^$&eGIVJ{@isMAa$cL|a5Y!siXnpXlTDLv-* zeg`1`He3pr8NNIk!yY+(-%-1K1@n5i~PE@}*u)#g&QxDt0ECL6;o zd0c(;kz`|dedOmL1ek0LU!zKNj)l?EoNruq#jo=6=udxupp_&uAgmY=%gO&%{4O?K{S$j^mL6WCm47on9GwzW`<7c zQG0`#p_6)qn$3*W=zhEsOlYZ@p_6*_(Mr_AJ_fG@Uj}HcnW2+Hx*012tL#v@1ovK{KR@dy%t6sO)Bk01d^P8}gg0Fo0CLJbil z0Czy$2$cZja8k;U0948(LXZGtB^@D10FtI71PMT2gdhRvix4CLSx-j@5`c*aK?0CA zB0_Wmkc@~BodBc)9U({n`XU4gK+<%CAOXl_q>d0I0DTdH1fVZMkO1^W2oiu?D(VP9 z0+8BugdhP(NJj_~fP{2}AOT1p=?Fmr@Gd|)LXZG_51cwekN|WeggiF;F`HhFAOUzR zfc$%b&K^G)n001k8+l&DCCp<26&G^ni;GR5^y9m$TO*sy<;WK~+mK_5{K4(2DMJB0 zs-U2A^>9Fsxm`5_TjI#$3Mx`V`w7)?QRlWOXqy$S#0g>#6WOAmQs+vji#(}(P^Kn< zr&JdoV`S5o$kWJY!mxZAl>IJ_BqAMVBZ4%40yq&?XW5r=8d2-2Q}3gkNz5u`l{72yRjvLfxdi3+x05Jw}! ztrebvgOd~#Cn*?_q+n!{fiX3YIpd%G$e}@^x$Wc~*Du_Cq5+g@j67j`O zU-o^OmCdh|mN>VJ05sJaa6C9moh#_KX-a#UdQQwzGGkb-gT-bS*eCOjzRG4xBBxvS z6>QcULomxm&bFBAQ_qWYRAt@BbKPdiGvPe9S)9!ya}-TCWUit`RYNMRe$-v;Fb5l% zr=SwmtSZ&4QipSNWWK6b=5UUVR9k&$N=!9!fof!h^UlGbEwuWx6|)VS$w+%9?z3q> zUhuXn0pv5QnEe@9FR&ua&)LiwhMC7wK`M8?F*k-hwYZdo_P~v~dxu>Jpn&&zDuHhE zoV`yi`mHE0EAl9)@+{BG&ioSyhCIvjas&tlruRp^a0a;|IO&npdx&-OBKGA#_W3*e zKM$helmOeCm!HpjBk&OhTV8=gUNCSd##vsW$jLJ7r%*G*nt8o!o)+5F+~-HQ+mSym z$Siw+$>jX;>1-L^IshhrVu)P90F%l2hYJu1FqxcRDnLjV=0z?B$Cg)EUpg6!} za{dtllmwVe&YvPcX@JS({38V@3ox0SUnW2-@ID1h6`&%(WODvA0cHo7OwK>1*CrHm z15768&nRFXt0ur?a(+y#ZU``$oPV4E%>gEp^N-KG1x;8QU@|#hCzAtACg-0NJ{got z15768pB#J|(pCkyy~;l&{0e}z0Vb34&&<9PZ0iC{Cg-2s`*l!m3^19Te@>q`fLjC1 zD(0Un=G+xvGCBXe5a+Os0Vb34=VTm#W!J+2CX@5$ifx+%OeW{g3%(BlPa7d7lMB-O z^o5{tOeW_al2gEBvb+jm6FuN12&7fANCf3x+!rvJZ2y&aOeWj^!ksXF=`!N9hh1At z#Gy~-yAAA-m=%>RJHG{-`oWiE#R+dLeR7%*Ev4H%(EQ562j=1+k2 zdKOkVjJLuSBjLB+LlDdtoBi=3gkj!;t7)E#X~r@ygGk$a5~DO=zK&VUF?%7B)6Ct# zq??~%h7Fn-Bhf4~g8K|}4diB;MWAMx4?LnFah1a~G~d&3@nWpS2Ydo?gS@IG~miI)vyhe5;%d#zNjh5Jo1LLtYT8K1KG&5d+h9DV$+sOPvL1ACLeo^zmLu*k2n%QVOAIpuAEZ@Be-0oV(3T3h#A(Kk3dr_ndFv z&bjB_`8sIcZhj9mUvGXIkZ&;m2)OFZ_X1kIc>#SI%oONsG#Am*WPS`io6XG_)nXQ) zCn_R9ZZ)^yd%)ZV?h4HN@I7dL4&o1)&)|EJ83GN<%)bUb5%U~N;KTU8!i?i;mHBb> zTw|2H8BOI?ruBYkr(~W^K44ZIglftJn6h@^TT5X<2lTVL!F&{FtNG0%=IZMJ#R#na zT@Yv#teymgMrif(5WNvy-A;$<)o-Ii`|6j$If|n{1EZ$-Syt~SF}T3|CB}w~^_7wE zw*k1|-_XrmzJ|UV1@st^8LgmogHQo&FfvO^X%ZGSthc~-!k567xxylfDj&l4vQ>YF zuVL%t$1xh8_0d(~%`pE016E>Is<2CYe#|Nvc8&0(1Y@;jp|SEYd|$hYMue@qY#7zy zw-Ahz;LfZmqwhw+9th6dz_kS?obzb2sF)A`A-FYbt;1-jd_TT#T9wAvu=RiqZEN^b zXepqKZEoW{XB2#oPPWScZiGKdXV+WrMYq;Jrtfu88WOe!Z6J-IA`nn8UX80w74%(^ z)GSFVcpDMh!Y9ZA%hAE2qO$TBMzmVrU~msBaOK^wwN*7GR8mps;&nTtd=To1e3t!m zlv?Q@o>4=m;(kg+U&QlmIC&dg1KNs zZnjhR)o=ptt%f{-^XU5};v4B2)9<3}dlm-caXT7(j5;teUU(0`$$WCEgeG`B%Kd zTt;LMQ!gq5q}-_MMq_&rX0>{tHinDV5>!z9Jp4KOZVC8zynr2XmcNK$l@}TAhp7`I zrhi895Rtw`l1??VBTYQKjq~!&^4hn3*Op*ms!@E2g#A_790fa$B#d&} zH&MBdb=pXmSf|9Rw2B?4VUBpvI7DhLrVULM*w94RZ>8P=2r@9qVkmzGCa|WCEpCCX zQ75B#4e8O8xZg+3{EvC1v?_a9L}&3Ovix*_9f&fc)JF>$HBn_0(-WjodV&-PzioGL zbhVcDg;Zf*$WQ1Zk140ED3wn}NNGW+g{5p1({7L|>;|De>!?{;@hoH(O-c$nshM4X zea|6d1MRVjd}2gjH#Yn=-*OyhOqpebrFO<8d03M(x$gTuPF zv4OU$m29Uin*q{{QT{GCR!M6G-SvAbwbDPss=&3i`wB1|Pc=Vi4_`|=#Y(YL?8A0b zG3|FN#eO%E%2Q7B!+=}#RvFY@pl1H}ZG6MS%wW_abr#bDx)pdpmj?eU^&;VHG>UuR z1x4+0bOnNk9LiE)0g~Dcqv) zFcBWO&|641(~81xCZ@1Gfsw2W7g0FHzJuuJ6!bv_eOY30(WnTQ$k7wfUG;YC3<)t) zU&+W`4pV!p!4&N!ycXIs!_;R02~0f^YIT@;BGkjH zbc(4bLPKt*o(R3k&D7^ZHdAj_&^=6jI^<&NJ-~KJ*;VHS#^orYbZLW)T*Ey_NRsjlY5uMrPa z)^&w8N!&+*w8k_L;^GXOJcx%O&BIA}BRH%H^(aX1w;^rYz&zB1>Kz_xLWg->>B1nJ zS50V85-o9T3@s~%Nzk^I2yJ})RUs33#~l*pH*C;n0h)>YRpDk$EJYCo-)qh(sT8>F(VL1(e8eac$y+^1T`*1WOx#rwW%-c|4SqC>)yqR?|FH*rI8sJ#NXul{7%n zoN>{703mLF;XCL2H1FKVH199m<%8RqZ@_TJ{RPgpU_2MR9_5gEl0QAE@8OP{dLfVj&}3j z7YvcR1cmtusw#0W7egaNab^Cyo#~#8xeHnI}!BcI}!BcI}x<=9pMZImlF&MNEVT|iFQ2y53zzK zcTEXNF1!n`$gv|+4si*c{DGc-NK~ZFLtZ=g;adMxLLY%JE!9N z#c?U%r{2NA@_sQ+{z0$Ai2g_ce3yi01nc334~r<(k=Vr-+>Hw0vRE$t={QPt9kJefP^A<30FGY zC2n*Fz+K`1NlO_5~6QCgmU#k_Vn7sTG)eGCP zw=oU1qSgs$wW7^UL#^m^(@-n=-85|0G@J~c1fTVSSBg2=(GK?)uwxO(ECe9>@Xtfw zXkL6b5Es(=$O{F!{$pLeP|ziH)gH{i9$zeo@+9`c@!&MX^^JnnJh4T2NRLo`vtWhP zw1zLQX~Ep@Pj4ITs&?3$%X)f4Bj&;sRBfpcZ+x22NY> z;;01ikET4D7mKfF<%J74&C}Ly_*=N(5DAbrap^OE)dG$eb!M;>4W$3QS!!FfyB|MB3DG2m{Scg#A${7LJ>H_Jiax5s`-GJDc$ za-8<0b;MnToU{grRUJ4^TDKCXG~*$iPfJD+&w>W5aZaD2D7hPfqFoaGqM9&#*+#sq zPU)-NQhpOnUJn^yvQUdF-Zl>qw+iG_mA zKLk9%=7#}0*w7P}{}}KDn;*&hqj+G&h|ps`pOVP`uGf$Jw>0ukd69q0i~KLV$geuc zUj^Y$dXYcnLQane-6fGfcT^&;vNQ6(YUFnX>@Z7_?ydm4hUWa8UgS$&_aYx~kdxR4y~uBNA*ZL8Y6Dziec`Y~{)#-n-aZB7 zvc!^iZtW5);FMUuK==v-VrneRh(G4Vb&YJRfq-lF9SHQeC#r#fXZ9Tk*t2gcv4R1+ z#H#)U))xMkIdMn=|AmcY21p9WtLfqmRC-|&8hxAU^)=NC^~4WMRZq+!jlT%z`kXn_ z<%ji2f^~8mUA&%d8xX9!R4*5-FS=lDq9@1RXGW>}iGvbg#P*n<0w7g=e_-07csGi% z56DdzR63P@8KlR}`wqyV{NrKxYF@mpiG>$8_c%ph+#FO{opVy$JVuUAuSMgW6gN-F zK>YYSf^@$lVJh(*HzFs2cAv>g{z`|$^%wF0TvvdL7bEtWn|_8?#JeD^neEqf%Ch<< z%>|O_=TSJVF%KzF@3KLaHZ$34OxMJIjoIba`5LpA$ksu1jd{!ts=#@jCVJY~ybr4Q z<+JS)_?W5}NVUOIhVC>t<>yj6aFtYu{3U%A0 zm3zT!hsqNt(P(bPPLs985Vhb(gstU9aZRXuC2ng~;L6_O8;kc8)2S$No$khfV7a-a z%EXmIzEZRNMnOGy3)qe7D;v-^jHS`y{l!)Ui;W5_U&DkScg!Pgu<>Q}=1oe{pdQp6le+ng}&7XD*)Tld*$0%Q(GZ; zLdMoYa^L3d?e4oh_a(AMX@mi7l$PJ<3T*QfUh@oQ8KE>w7yBVETCMA_w&NnLK^7SC zQ0%qUWsVh>XtRyjN(Sd%Q?${sL2Gom?NM2ywqBcpGTma!wcKq(ByVX#6)b-kzCCo6 zZn1|}YICZxiPo06+6~oZnQOFVu4T)F!L75|0&3ee@G5xe4>tPs5*dl4+VPtjGV2Yw z%&u0!Wfp1#nVs8aHrB)O$>Bh8$(AbjrA=CIHlv$&vCnT|HftWX_HuBNKDbrmDVMe? zCBH4(!L~b|b-nbp8>EBPX$PzKJ6MBblh{4Ns#6|u69O7mlWf_sNw}G4wl9GTFMln} zIs@`crPY1O4Q>bP!{v@Uz3?63zHtul`=8DNtY*#v+CXi^7ix9bEqHCd&p5)4peVN# zN#~8KP=(lqZ3XUZpq*!#wrLx7iPuFVYMgWgzqpobSC48>D9vwHD;#fMDRW4fcKULg zI#!mZuEOm^j%%*c$*EGy$~IKT5z$1hvRd2Lnk*MxYa<2oIwh^s{&}7D&-E)!BuwzH zAXd92LJsRTlNvY0H6d~?&Ziq}Ty7_?b^LfE`SB(kbwrXc-wd#+${eYU&a;J9m@bk}<6t_^-KZA4vYG&vSXJM~<(jdazP0uyBhn36e- zbkpkXMG0buO&sfl3<1lqw(wM=l*?N=PwuiWGWTwg?JhP)k=XaRecCJ3z3f^pufEX@ z%~36W&yyX+)ziqJL>1WY^@rr}rumCV2_2}6rrOoSTcAO@(T=|b{4L?{1NeIse*trS zU^yyN{ke)S=3n6-Zx#rA1K+G4;$H#X_$_#y{#k%oK(nWUHS}*I{cEIud+A>%{Trlz zr|?hQPXE&MPmJOxkoIf>1bi%Pp-YR<4@CIk&^}QXdRQ!L6SYR5z&t9d=$T9|=NE5**xgChJ>5u$5X zMR<&k!O$gvx5|m={_`S24adbMKnXP<=HV=KT!_=5=R(hY|C)$=pCDB>0CStzjH}k4 zh*i|-s1P6f{xy8WvTMQ|3j`q9pQC;w!9Nb3atgkX1pff|*Me`yxkvbw^wgBe|9o;M zT@;Y;1qok}pap3_kOl;aT#yG_34NvF);0^@0eeMeCR-4ILG$m&7ipW@DS! z+aNZfp_JP;p^dF!N$l;B?QPW8)qZD>xB>7d+C(P}BU+vptLd;LZlD7|Y{xNhMcieM zi8}P1Y!h8sed|=;>wojU6Jug-Nz}t4N84}!6-;D3Ff#>9VkdxF*14l>M=+pjLY5X` ztLOny@(f9<_PnS}queEev!u0MORHH*t7=K?Aj!0e-3?-+lor}HqHO~~SQ5K?WP6+N zwx8<}*8~2^HqqfofE{f~5a%SVZ8$<&ZyRI5p7ID*b@d7MH|QE46EjQD!UJNc4F{GL zNUQ^1#t+VbKA)_%JtG->jU@;ox1JX@MD}Z9y`(yFj|c%AwZXONumsmv#=7jBFnh!S zEBb(_dR-Kq7i*prC65Vl4H0HmtZEb`4~15WRZV=f&eY?j2F2B4uLXTpJSEB`&`5^# z6&(}TJtE3OO=2ZABXC5{6Xx)kh+c!wguW!g-n@1$wAj=j>X$?lnr=cgeOB~?V}R zA#^|&M;_Y{NYEhV;lQ-z(MqxF0nvU`bZU8cn~sV>!eq;Xm<6VGg~^eJgNd~A2J$Gs zSA>^D`FZ+Zb`Qy>?p9H{Bs1fZC>;|euZyyuiDhYo+-oBIvM`?#2d&~Z5qe#0I4z0@ z^-CfQXF(L|5#kk?<VESd%cnde|u?j{Wx<`bkLS;e#5)$=oRz+LrSrG#0 zhh&y0yeu8z0TI3+TQ)s{9~s;yJ8WDjZg@nrT@?pk6Qx&0>*GRP5tX5Li%?+qN*jha zE0!V4!w-&GE8tO#7(7l15vZ+T#K)P3&<3%NI7o{XbdX+0K3>I{hkTIED$iix)^Y%C zB%rrgrHUCZ%wtv&u3VZGQYBDmVl|fAf(XXp zfL@cd+K~8*uiY)yH9(eAq9g+=S{Zu3SVqzhO$zhvaI~ZdJ%gfw1izulwy=AZQ5F9K z#l2;JFa7GO5Z0=rBFw1|_Gi8#_E{zMqWX2J1v%qSa=ZvklKRciezBFbRKeglfF0LK zv>!wSj&qO+q{X2zu`w-{eN2>12^mwXtZ2Qs?!2rKkBe0tzO{*LxGcfEWVdswxF*(J z7HgQhCI6MNM^G1r?t#NxQ}O*-8Q;gmp>vG727J zx|Q8Vxei6!#!Dz9`-rI>W1<3yjiJ@qiN9z+CD1lpTT<6rFNtPiVMzr0L<#Kdf@rXC zTzOuszDLyEBi1a*S;AG+o|l!l*!7DZ`8AkdPs}63)|?k*kBTCa!iI8D1u0}iv&zH~ zgeruYF{JuQnwwlVCTj4lq)n{2TeczFs{tdcmY$3(5fQFga%L&d1tj*4=LgKJvC!E+x~QZkNW!f^-Th*pa! zYk57C`4)k|8lEAWX;ep8B1?2D9B=72wwYDuT;hJa5TTzc^BJ+0g^s@_R{TJO&d8F9 z%tZ#|WoojJ7F*Gxre-0`&8A2|!Dq$RASNE-r+jvtgc!hXd8E#(A{sMr|usN zJtww4DWYG>apmiDMSMvtdy*ZVmQ;N?#}!G{mzAt; z{1gMJgk_=Qd zf0Y)wj!Fcq6-cL_AZH=sII5PO5TWy8m!w3|#S_byM8mye-4*nNQ)VQ{t71(?mRkao z=`#HM;&C~9XhBF8>z)=x2&M$e4##gu*K*Jm`e#MfILHcYULis+i|~V?eb+?kZ6frd ztW+=Y#K*iO!vLms4ZkhcJ&&UQyjcG{D14VJ%bsVk1)i5SEGJRH&}$;xD{2C*DM)v(nEZbRn38tqEppT{Yrk3BDG6+Q(Gh9CIDw#XsA6DmqJIN34B@ zV(lpuW}3fuJN&WaFG-8IBtvO7fA{@6{PpGI@2upnnE1;Oe=CT;apv#3YRaU}R*2~{H#oyD!Umr|B#-6vyf)(-aG*wGny<+-z`a?N`4npClrNZ#v6AE(&o#>M& zxoH4pUlmd*MCNZ7#~u;UB{c|Tbk0HEcpH5Zg+UgQuhUwPIH#iRpjD-#?K#clW^nwp zK8c?GU^d5_Iru-5o8#QUKR;*rBq2usLpjEbh4aht&~0Kh6=zuVLIHOkL9OkCID+zM zQfzz8UfQ`LHfF?*w7C9~Soy42oe?XbePZ~EsL9Y$4KFZWp_yIeZmO=#hs3caK%OSZ z9F>X?m99`hg2l6z22qNUZDK1x!d$UVp`fkq5jAPiKy5vu1sDR?>$N8?YXLbX>YBu6 z6ra%DX(1lQeCz}VoygNvj@;ZJj;F;5K#0)d>+4+5T7ND>$5BZr3hfxJsGQ)q`Iv}i zL?f&NE3~M>&kFOJn6p+=L_G)ERUvsoteq0Ou{?+guqq_io)CK`1!|Xu^J4F$K%I+P zv*{|;h*)7Qp(zFAx#?E1`S6%pV*fcn0R9?1La-Gm?#R=!o8NnG4#hu2U9w5N%X1y zJ+A&osedKSO|Rops?l08DT+{NQC~aI=ZzUP9~A2!6}1l$Q=z~HOoUI1+deDCCq*sh zGpMUkni3?`cp0v?thd5ksAygLR+k7L6ewiNDbP&2i@j-8?D0_-ds`6D|38a8gl@ao z>$ajW5EutEUjvu>DScTBZjjMo(BY-?6c-{iV-jmo*b_GpEtjkqNZB-ib*_EL?WpQc z@DgAElXPmwsykN!S7d>Lbs($&W4#VAv4AW~>@#YC`KTzfB3PV;KH(TkLfkEuA@uf$ zqthp;F^qjvqrsAqptO$-omKcCF+epy+xuP8WU~!w%118M4BViynuI9Z1tet zq)@+wR$^9CxV&4}fn*Yx>|@Ga@({w!ei3bkG$>kgO`Pk8oHy|oH=Fw%mEfg9?@cC{+Bo|)AZVB6TtuE0B@Z)^D{La6E6is(wrV18KoDG#@zPJ^jkG55MnsaaI=5gnk!4v#p0L98 zaGnlc708HEs%4iiiOsi)>y(=TH6k%$L4&m%3vflR_@fhUuaTUxRt1XBib}{o^hJcF z7sWCTF+Jke&`IFCN#IT#uk`?M5tawB@_Z{rWuEC?p*oM&Z0aGx94Ozg@-03?Xa&j^ zT8`)uqg;rEFoSiakT3yC;R{8zUDuZUGBp3|bULG&$&iYuZnEpA*A z>(ingi{W6^3VlJ}VpOKF;!UKfY9z(;DAq_deD4oS$hZ}T;7rxFoFPnE6_n3rDHmh8 zqFJm&w!cR53qFfdi=@#^x~RyAmAKP5En2NAh+x&rWRJX-aa_i9(1cM~x6+2V@(jub zQKaT0%MiWxA)c?K@XEaZdgyi_-vS*b-@iG!Kn0dB2RmY&M>_iZyLw}T1H;`T-2?rx zj?v>SjYhsJO>||ryT2!Pq+{sdv5uiGV<8?(%_MJ+P0q%rQuf(Qa&kU4ekztWQZsK& z;BYFQO2kgj&t~Ql1fzQ()^$r)|46L6e-KX^#81a(X5*)3W@pmpVpEIrnFV8RJ~@+~ zUyP;ZGmGO11{|MTm`%h|3yEwDUk$PJ%}U24jbY27sg!n7W1tMtXWN z5uZp*#OC5N$=P|@teHayeFOai)H{(JpP!gXPJw=$jn603iL>cgDjiP~OPX`n`9xwe zu^3C7P9)PtdS)&Wn_NsJjP$t$W|{>zJUTqs)qk+-AdR12NG!(FGxJGfVLp|foL{`% z$fOdB6Y+H1#p0pffsT=u=3W-IO+{vWJdsLCA;)5wnPhr5h>{ef66x4PB9&g8KgV!L zW8M9?bo6!~j17-;j4&i7P}0g8oSjLf0gmX(5)*Vhm5k4_7^dUNWMVc3if4#)ASI(v z+GuWtHj+xy5LIF!WsFbHrxIW>9-En$!jabEk|EiPK{}CQOD4|bR1B;WTRU>8jIQi~ zvB46@=Q9vLuq`akFA!5M`bKv%3rdsu&hByl*xi3P*3sD# z>+b5@*|eu+7XfzZUn(XSsbrUop||VM2r~m4?K(aZ8wFT+W9JBrBaQO4E1%44CjO|y=kcX@R1QB zDcefU#AjIA;Db5pA2`(8adnAGg)7~+RV z<4rqd+^}7bqjE0t9qX|*Jnls7tV|(|fz%TlIOOsckD?qMkpN|k=<7Ic$bhx8RR#}x z$jH!W*O7zHAn8vWL?I=uW0`8a2_lw^%gmC8PL%>wqM4Nmg`x#V@7y|=LKKZJ%+N)R z+V(v*hN02^eq|h4Xi1t1sl)nkb1Sq#!dI3Dj~k&t(%;e7h1i`MUz}Osd>{qX(kx@7 zMo&&F)6F`{&NHMBnGw534ETjF6x!CPGA4nx+q(QA z-^rpn<4WhgBcnp0zru3-CMV6xX6DZ%QAy0rPh?=Lxg>695nCxXjR!}D9Ty^IRc`i| z5EC;g7*;Yd&e;-)#*^1ca5`w@q(CB$#ZnY<=93dCudR~zNawQUeNY*{UnG>g-Cm}t zip6G9^W%H=#8Tt&B&R&q+rh5R?gJ=VZyD$vh1^_ht?Kl8uu%TLN_>79BKc^2}ET!vJKdU z4CK@ni?PQrd?u&AYvkC#P>)Oh#jUEsQ9q%sp1=%cVsYklf@?GFI`o2nJ5=*5 z0p)aD*7b+`N2@!Vc2zgE)Hl~RRW~;_w>0i|}aYUe;%d z%E(O`wEODWnG%o34dev?oJsww=H_4v!8pAIh_!^@Hq$vMQ8zB_r|}3YhLrx1(l< z746bGu#%g?g7c`VIj^dk^Qx*jud15!s;W7!LYng`q&crbnpq(#K8}+8BOXl7Ol20a z<}izOgXH)*Pbl(C2*_<0;%Ab&>U7l>T(zf9qgLVS-cCau{bQ`?fzhGPuGm4J9!Q&5 z!bpst=9rMJlNn6kc}c{euBrIx1RQJvGx2163iU^NergI!E;Gr6Ogc7~Nhi4583dd} zj8=5~9p^J?-4j)iK@P8)bcmESDIq%q?Hdc3*;FE)nSf(YBu>waO9V^@!zT!c5u68^ z3WgbfqA@kkgo!Zv=8SZ=%k7R0fI=T6}Q+z+AWywepKE*nYiSp z=T(Y-30~QUYE#UR5+8|Y7^#>)@L^GBcB)PoA z;IVMZuqr~^79N|Qoruj(PLfp-YaWg9+*z_ky7pX48QOt)RgK1Kf0P$&&K$RM`I9s0 zV&mn&K>;Q@d>!g4UL3o6O$a)tVy%1p`-0bHK%(wZ(yB|@G?D`&Nrz8y!`1!_tz${I8~$HJSfbQm7Oh7v3j7$a@S z0w+s(6lk5`WcxWJ;toiPUt7iM9IVYH=19+u#L4+srdTk@EJ(4&xTqwUbCOu5h*xA_ zTCky%90E0v!X{B@CexFseJALZp|R6xD%rG2InE>3W=Px=ezfh#sij+p-qmOh=%f@K zF4#sW=q2Y}I?1kNluF!F8b>R>c_P`i9iu4H#upKnWNd|9U;)}0>X{P|H&S;V8;ivj z;uAaI$%~i<$n~dG5)jAdV$)}EZ81KViqTk&lp?7CQA{9~5BDF8VSa%XhI ztj}YSvbU?_7Su%g>hK6^uD;k{Z^zhyj?NytT`tnbMo}c`u69$afhho?RZhjJCYvyd zE^)qvkOiWp+21tW+!$-Y%x7XgnTz!P0W5=MQ?E#(1zSHro=n96F^l|0YGwO@7fdL* zQ(De=BAtstXExyj);EfRlxHAHN8FPusfomF0#4@EYRXT`Fjn6XxqUzn4j+t-Htp0@ zx=Rt3G!drrHfC+)jN=Pj^Jzb)9&CF|j_tqMD&mgHb;zAqEXrW%#t+5WEF;d+-DuP9 zSPS?d>Tnmq&(A29C9=7sR#LcTUYTiMU&o-wP?1X|vvyCVbll|X?C$8bZIO}^%f|fo&h2M79PtI)D!FxbD?0$+l6G$I5+^(jB`P2azJ(pbjGL{QbgJtKvZC>1dQsk%=W52j$AP8u zWSXlvbjmDXpMhg)N;)$W98OfoQq`%hBB>k#eupfZBxTZ0F7*q`nMK*ICVjTx*vDt_CFh%s%##qw<|CM3N>8|vw$lhmq>AI* zxq2rrnL5!xuL1aQ`#jCh7pHw#2BhE{sA@K4y^>Kf1z$I+3?LXyE9^h1XTZue5bqG~ zGK;bt^F$i5cNM`Eud2c(1Ci4NavOsKz5=I$=J@>l?K24*uan0pO4|^S6vU;P}AWk!Y6X6Mf! zZe|I6XI2x8#w#OKC78MTM`F500Uc!&Rw9@owwA1JSxKHF0Th8q0J0V`N!+sakHW0Y zc4uhd2JoB(d8St&85i9qR8uU1ktLib#tbAUGC@!d5$RbeRB4zkpo zBb}f=COmF~by7wafLJ_<$gRo`X>&e?rB|Oq-N3Uuk8kF#K`4VDSYm@->=dn8GCf)z zk}ib9Y*MhCE{i#}oTsdl7L#2G08T=yD8sTGb9p@?0FYr#D9Zq8(g~uJL8qE!tRV1y zg= zH#?KeoUNNmW*X!@(uSGj_-qD?blhK^G@P1&b!D|QkP3b6jNQ|fR#&-LQ*G?{sw@)sesLldfG>98L_K8S#5d_l z_yT;3^R$ySjT5;7jXS?`ODbAG7UaWUsHB!HGxIps*E^C$Ewh+_*z4;JTiUXXATTF% zlZ8f~!=nCN?2b%g@tg$WX@TZQC0fK}s9G{gFj&;WIG$_a$PR-e-l1jC+YsneaDU;q z3Jbnd_+7jm=?y-3^#FcD@SlF=@3I;Vrcq@ys@JJXpm^t{YTxZ^zh1SstM&o~aHncN z;_Kgm_FQ;}&>k=%MjGz}rcXZ+h))84)c#$(Wtl$jl?UT(I8ytUcgY5NuNHmIoK*DFYuV`YP5e>&U8+6Gt$5+LYJb4j{x7Qi zVPCtZ-~aa7V(?A$``?YbR<-+IxZ9-K{qF$2Nwpv9kOb=Y509vJ|Lc_L)f9x+|BmY4 zSM8BO3Fk}lV0=Wi`(GOWjB5A4IiFs;LGb-QF7S$K?>r>|>)-eY;k6jl-~Y2D8&tdh zCv)0WyZ`5Z-lW?7zg?74?fxHLx=*$He<|yOs@?yyU_^B;`*|Au@s3=h_xI@Ne7=fy z(DQeO~1DRmRI7b2Z}Yt7u;VIrx9rEND@C_Gd$J?)GNxkJqoAl4Cm5&@R>P ze{J}!s@?y_?lXDtzCTa<#}yp^8{?nL)BoG5zyB57ujc6=M8L@_a3Y5P zXHsrf?Jq4#ejbwtgW@pB^A9%5hQq3TocpU2*WsQ#?SH7?`+vjl@jU(MmkJ4Qv3kEa zz2JyG-_z~B-!^$I51dM*{}pnm=l@OA9$0R?e#X;mbmi$k&FvB6Bg(FRp!B|!r~gBF z+P|2m{d;-Zm!a^;MgJylj~M#hiBDlXeOmMMKcxEmfB5XAYWM%d!Rb73E~x(gA8-0d zp8ju#zmp!@H%j_8%Y*TiJpEr&@clpFQW(xH2l_?eT=LmV?E$>Dzgi(whxR=EPoSOr z$R8)C^7MaKp7uw$J!1HOmgH)l{@+sl{l8B5YM%ZE%hSsfovl)G_W$D4);#^`w^(z@ zZ5-_sH>y7_aX=mXIgNJ8BmTI3p4+R8$5nsT-MB9g{73V&e}>y5#$VzGCg@WHf2Pk@ zRlENOt$vUPP8sL@NY>A4*5s)NcAz~9e*Jpy$kYG!Jne7K)BfH(?N4)i#CTcN=g&%Z zjTcnAeo5_{Rh+q|+Wo(^^UFN&SHtvk>9;3O`^h}*={)W9lj!8v{@?og6V>kjUAr&j zf%Bt0?WH9WzW?_)HlV#)$;y4$&;8vk^80k2_6vF1KgR8mte+74e4hR<=4t=Ag5&?4 zoG5;wg5>7^vDRwU?*9#_R&LMct0zzU8MIetcQ@|M)BbQCIDeU^{o8rkf0C!YV!6_z z%Hy9znG(!BlPlx`{7Fac1p^>^5ATGa#mUGeNavltP%=hylt`H;LHFG(YWwqrJmj zu|@`=SE1F)c+TBKUV(cg$UB*`H)GSDSsM-A#8V{k%>?@b!OgKvlWsAo-4LFx9_w^7 ziv1jRM;9^z&+hHnon-fnC3y2O24vGOpEI(%X0Mt%d(PTBdWSn=jrDt2oH-4MXw}QC z`u4XCn}v|Q^O$9>Hciv!E80)UOT6@0?1T%KRv^Xz{n^UG#~uqXi7G!#E; zGgIHVINr)wJnDAtY2aSN*?4Sn29MI?o>%+f-tGgPv1U9Fw1XFzbKr6|Y1mlYN~Fu$ zmq=?K0r|zsOZ{?ls0TF!Z7)~zhDDBmHmF!^A~hdV`xf0{RI6fprr zZnmw^!yq;Wxn0&n6Dyc^04mVZ>um|qjaf$`d6NW_!xTzkfIyI=9gC1SwoW$*ZIW^l z4TF=M*xg8%{D5#ahah;-fu||VGBMnL!czY@ZTZ0Ssg!hWIkfybo4IUK$WHADV7r%} zTh~p|tjLDGw!=X*DI2sVeq8QjmRlNaGV!nz2{Oy%+1zs9ip%mTN0qD-Nu_ho*w2Og z?lYmWDfM@BZbI8#2!Y#XnM}`3K$|n{y&}EfNrv%hyx|1zD6ucK8n|tVJyt;I_zpiE zZX=4tM*2GOcC@rg8x3cSCrZnLLK5)$}>A5P*@vJVOyuXjdoOyutg+A;)YNVpT27 z*fNs$H9e4Q(^NNNU6$y6ID_os-`lumqahe7ZKm|bcMsB7>=fR-BB^&-9QihfliY;^ zo{UO)z_^BbEys0%XiP47ssS;~o6zS+j^ z$$8_2Qlkv?R!#l#e(nOKBRpHGS|ojA|u+tfLd zQQL>)zFIg2o=ElxJ{uvnPuRF}L~IF(5NO-irsK+=94v`MS^3gaYBp^y%56_j-Lk|H zi%sG2FX=)Ek1XSS63(_2dUH%Jw9o~;&A`4i$xkYJ#Nr~7Same!aV*~+aO&v|zr4*W zg`a~@otwjxFgT_c<#Aen!=3ZQ;(}41oKGj}v8$n;a%*A{k7_$jr!q6M6Lly`WK+k1 z?z(h*%HZzP@f2?NPn=5vg*@UZ9=@V?NV!j9xVD&>jne@2ZDBTT)N_)mr}tJF^<1me zFV1rXU!R!9lSQ=OZ+Ze_^_d(Ii!Uz5K`4#T-vKy2H-p^c{8j z=IG5=^%IFxnJJ8mC#O(dt5e?jrZ1g3wU{`quVCXxLVt(!^jB(zh1lnd$thA2r2Zf9 zSpyif)Q8)g{Her!KKke*eni~!QOkmMTP?oPEdV`!w;HdH?RHQ3MX&4XX4(ca@(TL?K!%$!Oa0mYX%0>V7Qh8M$ zA5@(+7>!3C@5J^0;~M`NHQqj|@kBq-sp(hE#_!<^=|sc3OD+ED;|r>z#;?a~{{KLY zKcM;@r@b`z=wqcCNQYJU^N+ubHj=A`Z&c%iKGpo+Ap3TI{PuGZ7v1Blt7UKd=o_H# zXX@ieedG20CVl+VVF^$F*W>j0qrUO_zMwv0IoI>?kz@R+8n5MV+@-p!<53>~EkD)E zcoJWTe?4CBm(a&HeL)TIhvW+IL=}@HhI}^?1Mk5v}ym#|kxGwmSb?^5ECwbk9wB#{ZQX|D8AMp7Q7) zPy4t0ZPfEJ|AHj;mEnG<`{VCR`@H;Z)c<#A0|Pz>uH%FK&)>I4jrYs%%iCnn-P`S< z{6&w~$6NA@FQAQP_=E#|u>a|C`Z%e^+a1)G5(115#a#DCkJD{*?nA+swyN=eOwNf< vE&jIRPuri4|0G^*d-!U9zM7Dj_N(#wf*(Jnt6bwF^s}J&oc0ayof`ia7P#9# literal 0 HcmV?d00001 diff --git a/v-0.09/examples/switch-sink-pulseaudio.c b/v-0.09/examples/switch-sink-pulseaudio.c new file mode 100644 index 0000000..0a0c85a --- /dev/null +++ b/v-0.09/examples/switch-sink-pulseaudio.c @@ -0,0 +1,62 @@ +#include +#include +#include +#include + +static pa_threaded_mainloop *mainloop; +static pa_context *context; +static int sink_count = 0; +static char **sink_names = NULL; + +void sink_list_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + (void) userdata; + if (eol > 0) { + int chosen; + printf("Enter the number of the sink to set as default: "); + scanf("%d", &chosen); + + if (chosen >= 0 && chosen < sink_count) { + pa_context_set_default_sink(c, sink_names[chosen], NULL, NULL); + } + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + sink_names = realloc(sink_names, sizeof(char*) * (sink_count + 1)); + sink_names[sink_count] = strdup(info->name); + printf("%d: %s (%s)\n", sink_count++, info->name, info->description); +} + +void context_state_cb(pa_context *c, void *userdata) { + (void) userdata; + + if (pa_context_get_state(c) == PA_CONTEXT_READY) { + pa_operation_unref(pa_context_get_sink_info_list(c, sink_list_cb, NULL)); + } +} + +int main(void) { + mainloop = pa_threaded_mainloop_new(); + pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "sink_switcher_threaded"); + + pa_context_set_state_callback(context, context_state_cb, NULL); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + pa_threaded_mainloop_start(mainloop); + + pa_threaded_mainloop_lock(mainloop); + pa_threaded_mainloop_wait(mainloop); // Wait until sink_list_cb signals completion + + for (int i = 0; i < sink_count; i++) { + free(sink_names[i]); + } + free(sink_names); + + pa_context_disconnect(context); + pa_context_unref(context); + pa_threaded_mainloop_unlock(mainloop); + pa_threaded_mainloop_stop(mainloop); + pa_threaded_mainloop_free(mainloop); + return 0; +} diff --git a/v-0.09/examples/switch-sink.c b/v-0.09/examples/switch-sink.c new file mode 100644 index 0000000..6f4111b --- /dev/null +++ b/v-0.09/examples/switch-sink.c @@ -0,0 +1,67 @@ +/** + * Demo Code: PulseAudio Sink Switcher + * + * This demonstration code showcases the functionality of switching audio sinks + * using the PulseAudio API. It initializes the PulseAudio manager, loads available + * audio sinks, prompts the user to select a sink, and then switches to the chosen sink. + * + * Note: Ensure the PulseAudio server is running and in a good state before executing. + */ +#include "../easypulse_core.h" +#include +#include + +#if 0 +int main() { + // Initialize the PulseAudio Manager + pulseaudio_manager *manager = new_manager(); + pulseaudio_manager *self = manager; + + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudioManager.\n"); + manager->destroy(self); + return 1; + } + + // Display available devices to the user + printf("Available Sinks:\n"); + for (uint32_t i = 0; i < manager->device_count; i++) { + printf("%d. %s - %s\n", i + 1, manager->devices[i].code, manager->devices[i].description); + } + + // Prompt the user to select a device + printf("Enter the number of the sink you want to switch to: "); + uint32_t choice; + scanf("%d", &choice); + + + // Validate the user's choice + if (choice < 1 || choice > manager->device_count) { + fprintf(stderr, "Invalid choice.\n"); + manager->destroy(self); + return 1; + } + + + // Switch to the selected device + if (manager->switch_device(manager, choice - 1)) { + printf("Successfully switched to the selected device.\n"); + + // Debug code to print the default device after the switch + fprintf(stderr, "[DEBUG]: Default device after switch: %s\n", manager->active_device->code); + } + else { + fprintf(stderr, "Failed to switch to the selected device.\n"); + return 1; + } + + // Cleanup + manager->destroy(self); + + return 0; +} +#endif + +int main(void) { + return 0; +} diff --git a/v-0.09/examples/volume-change b/v-0.09/examples/volume-change new file mode 100755 index 0000000000000000000000000000000000000000..b0b165fb58108137ff33aa27d0b56a93180953eb GIT binary patch literal 95112 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

+6MyJz^f}uT!AU!A$G_hH)!BIsN|(ppB63K7 z6929O{bbng(w$j~45YW?--AEv>`X=<$LRiqC_R9Bzr3xp^AeCj)KLouW=8p^G>aTU{{~Gl5pf|_SH@Wm@LFfDMwEYZvnkG=D?0P`a3RtJLqqNo{zS~e3&f*ihaBX^w%(V_C!Ab`pcM0uZ?Tp zR=0f|)8E6K+7rD9^xb$>_L(^Qo^b6e1APVN;%DRNZ7#hI^t=Z;JKu|=zva_QSapNl!3u^emv-(CCnfZi8#|8sHmpK|LT0R36ed#WG8GvqovD|)J51o})o zL+aqinEvw}Dxm+%K))7g>7M9ypuhJdo|SR-?RV|l0{Xpp<~$Wgf6S$C2fh61&dyij z=r6eRJ)q}2)7d%IOJ65sD-7HL(8q)Rp*Maw2Hw$gGTV^NIr2ID1Y?|!%UmCi1O3?N zdye6GpsxqLyBMYojiArObM$hreA=*HREV9|f#(i9V|(JEoezK~70=tA=KR+{pZHSG z^e;fKdbzWcZwbBn* z>h^P=0RGMi)+fv3>MwTdPX_&2(C>_+-{#WK27SS6ot+QH(RaA?b)f$X^q%V91p0cc zi@K{%k>7p3^T2l=_|60WH$4y@tflW6q)Sef{IuaY%1;!2xeNS`fm1b`-ss>y&A=;G z>zjN7Z@)|56c`v&pM3cGD?d97ozFdfqV#`%#Xs_GS-ZF%!N;hzZpYq^A3WmZ({AVn zZOt)+6hp`RkMhYeWwbEW@VCD;hRX)|nEKo&@`Fc-eDLz2e8O3}jN&7i8jjk%SA$lP zDWm%T)2Z77w6K0<;LRDDvD3g&yABxm6WN_w)@NPlM*RQtVwdT!u8PNpHD;zM7npLH zDOZ{DGE-h_%3qlBUQ<3{%2!PJo+&>uWkP>TKDnkGV#@KRoN3Ahrd(#qRi?bml-HW_ z7pA<|luwxQ6;r-v%1=z0Fu>?HXXQ?4@QWv0B=l)o_Ly{3G^l&_fb zJyU*S%7lSNzbS{9a=a;LnsR|Dmzi>vDK9hSwWj=qDepDq6Q+E{l<%4H6H_Lb`6Abp zLrkfyLU79_+pq-g)cg-%2GIOB4AsQ#(J|`b<*nvlh7QyGCr#E2;YnQ>4anm*zompZ{b^Ws6bT%6 z-C5?F3WEJguZbv}Kw_gp;Y(bLA{cN~pn|ZSs368s2}=a>A4hpU{Bit7%Xbt}!*i!f zb^nJbd`FY{y8N}gAHe(T3wUq;lsqcoJk-eGeSnkhUf<|rz@sil>wRMrmjPv|--E?B zKIu9#scUid9Vb9Yr8)qL1;|r3l5K(jVRahWCJIofvLVtpNq{27RGV+I0LAK6)|nze zi5g95B?3fL3+qf3piK2;ooNCrRILPNo zoun)d`~U(TvwVyUe`5X}C^A{oHzGaZGH}?_LAQxcW^d7|6h;YP~y|Y&Wg^;TSLHsGw@uH1H3OuF8K%U z)oc)xrxrZHzEY2nX<7zPw*sn=l<9fTfD%&41ZD`3r=BKTX%YiHtg0X-d8Pn^)Hu{k zJ~4$+U#MtGazub4MdsvL(y(H+nv|0Sm~8nr63QL$8Hxb!tCEj?07_MFcqw_LaA7X! z2Vj&43n=<8`4|C0Y7uo736Q6r!zv?rv@z{g>Ks!r3Nj1Tk~9EgQz^MfJEzg*bKg0k$nVCu!Mog|-}kjTl83|8K2xTHLQ<4qcnfYY2 zx0WT9pZ2p-G>lav8a_+trwT8*u zJr;Kyp>2zlRm0y{)(0KM2e0Tl(>SM8LP3lFay=?Rgk%>8ZDXU^%N1jlN(8 zPelS&#y?T`r}FYjFWQG@a^isHoH&m56$8k*AFEIQQosq9-2vEU<_B%W=vVeo$hPf^ zAk?uhLs$9ir`g%|muOFdU4oV*+V|k08L+n?*pqCYY$e-6upUma2clN0eH_eA3;rFL zi!A?42u--pVK<~Ngt*j%FG3#xa2|yX318+>zm@nhDkfMe{VxD~i6`|3gGAl6BONn zHc1yRcNRcK@Mv_?MfNPX!?NE;Cn~!Uw%Wm|LCd-@Sca!g9nf)+y;qu@4vUpN7+UP$JYX&iUWo35Rey!)iJv&meW>BT3?>HpALWON zG~W9-qxSO>5o!($hYD_&9z#?Y{m99=* z2B6Byc>)r|_em4dp~n6gXv0iL0faUjroOFW27W;pK&P|%uX9%jL z@!o$G##Yjd&~ZTcCe!A#a8Ytu#Ji;st*AwbmwZ7;@%0Am=eG!xW`-`ny>AsRN%))P z-kQSipT=g)>iZMW(s=LxDXV=ibUUlv#cDiU&9c1~I6UitMq~%*jn1Q017!sE6hk(O0nn9yANRw}h3BQ^37)HwV zh~;~XNQRRjE#F@VGom!p3nIJ&aF|VFbZOxMvgn3>h1(>Cnv&MDVV18Cqk|zQNXs{x zFr!X0jYSM99jK*sUc-s=y7sAO|CawF6jo%`XmGnA;ot-E;-8>$0VoDo)0a- zHU$4g_8)z~*bgFbl-(C-+rAmY%dsb50#Np?sAJo&f$G>VQIh>W0>E#7jvfCzGq`5j z@8Ftce~D|hoePaQ_D?YCbM4>Z+RJ_h*F5`OT=VTtTzlL3u)n|_i)$Zy4z5Sp%W>^% zzYgd0vrosY9=0#QwZGkh>j3*UTnF0I(27C!!?+)8{{`0}_P=l)YNuhm71|p?9cKRu zv*B?2aa>2(7htkK+TMy0GSc3LHjc8dg~yJu#{g4gb3ZfMz6R|YV?PgXjJ5oiAQDoq zaXy5k{4sFHrqqCHfkWhhoSLK`$kwQp6?Il>swyDKXBDtVZp6Pn)6pIMtQ6KvO;=6@ zaQ;MCnAViZ=X(09uwhf$*3fGpIDE#Z{YW11mh)3gcWFP)AOQkzNAUsv8G(M*OS{^+ z2dE6fCjBJmOK_#10r8>q#UZ|5;#>(JeMuJeSkB$>O!~6S4iuPm$(LT` zoDEX?F%VN2>gqhXKJ4 zg)J|!7I6^t>*Y|`N}=#zf^xP%_|QB^O;HQj5YdyWw4y}rWP)kBQb0C*!E{XvC7wm; zL6yywS6iO<1X!AupRqko;ijY^gh6N^;BEI`?sahytM zg$X%YL9t3$h(5?w!Ox(eL?w)XhF+Q$Q3;y?<*6JlamrM}Z_$8!B~DzZ66T;@Z(VPZ zO85#a1uBCPP^A*apr87v9IjthsDx(`okwZybt<6|t?jF!MwM_AD)iIP8kO(`P9?%B zpFY~45?<|%fu!=z0<>8rTnrx$(2=}FC2RyVP~|QH?K*{%1C%~?p|6s641g5+J2*%= zp99D^k7zCz^9wN83xlVsw*lymm>cZ~>G9Jv6p$@-aGtg;lqh{ZUwbq=Q96Br<}|%t zqdC#*)DWyy&c)C$bT-C7qnZtrR@M|%CcVB&S2Df6TGLFguZipRwQ;@veO=G=`VYLl zzRvCSC(-crni0KzHr#QcR$zMlBIWJ%4Vq?p{bJRNYe&=Tm&En@MqSVJ`lh&Ezf|?& z`q1?HWm>!G^~*J6dVRBoOs_Yq0{Y1G`W348senwcx5V}O4`aPf9v}NLgkK2@Ksr0TO3|EH*zku&fskkffzl2H=45<}OS4c?5Y z1uHRdE$0z(P0Qd@H{kGaC1ZMCJt!fEhbtK~1juuqCR?eD>#)Pam5iAJ403q5l5t|n z17Ik0c({@g5unIf#yYda{$huRD;XyVFxm3+KqVu0zzr}bT@F_=jt-m)tq!9zW2CU* z>S0nfINq%D;cAWZMRbCn1bif>OzO7D;Z-`mq2on!vlki zal%&Y@N^~P*yJiuN*qpF8RL`pqfW%(=}N|N!ZzEvo6?E}D06tak}*Lr#kO(cuu@F+HOd=e`KoNIB-JWha+ z!=u>DVgd3T9>r!(5FqTFMz)Cp6gt`PLFOa@ikt>gCJRvP@F+HOiU1`Jk76@R1c*31 zrOBKsK$*j%*vx4HEOc54%*gG92m2z2N3oeRv-<$3a(EP*84;`N93I7H&Jv&zcmOA* zT!CVZ!=u>DIhn@-*x>LeHuL1*NdPW!cods?N}xZaZFG1Pn|W$*G=R+x{BC8Qk;c|< zad;G)c~-AUpj_viPd#Vnmjc-4@F+I(95Ls1X9Me;o5W?`c85o?ndQlSQS5Md6q~t7 zY}@7VC^mC(;3Nom%<`j~t*pfS)hLgNP{4@vG#AQva$?y)E3_QfP_dFl z)+(Z9cFDX1T0%)Gq1i0{gQuIDZX8F*ka8l@4mC5bsrEZM@ePL(l z%U)ELxeNgk8ln>Jh>|5Ptia23M_V?JryeGW7t7ZSB?0aSb52g=l<_J_;=jQ2Fgj

3LA2?7FZY?}L2Iwy+G&@N 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%0A31LEe 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 Mr2S{k!*gl;A1hZNJ^%m! literal 0 HcmV?d00001 diff --git a/v-0.09/examples/volume-change-pulseaudio b/v-0.09/examples/volume-change-pulseaudio new file mode 100755 index 0000000000000000000000000000000000000000..c8462185d1961b71212ff23b5745cc6216b2dada GIT binary patch literal 98088 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 V`RP-4m8pIrDNCOARq$OJ{}(^ +#include +#include + +static pa_threaded_mainloop *mainloop; +static pa_context *context; + +/** + * @brief Callback function to set the volume of the default sink. + * + * This function fetches the current volume of the default sink, displays it, + * then prompts the user for a desired volume level, sets the volume, and finally + * displays the volume after the change. + * + * @param c The PulseAudio context. + * @param info Information about the current sink. + * @param eol End-of-list flag. + * @param userdata User data (unused). + */ +void set_volume_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + (void) userdata; + + if (eol > 0) { + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + // Prompt the user for the desired volume level first + int volume_percentage; + printf("Enter the desired volume (0-100): "); + scanf("%d", &volume_percentage); + + // Display the current volume percentage + int volume_percentage_before = (int)(100.0f * pa_cvolume_avg(&info->volume) / PA_VOLUME_NORM + 0.5); + printf("Volume before change: %d%%\n", volume_percentage_before); + + // Set the volume based on user input + pa_cvolume volume; + pa_cvolume_set(&volume, info->channel_map.channels, (volume_percentage * PA_VOLUME_NORM) / 100); + pa_context_set_sink_volume_by_index(c, info->index, &volume, NULL, NULL); + + // Display the volume after the change + int volume_percentage_after = (int)(100.0f * pa_cvolume_avg(&volume) / PA_VOLUME_NORM + 0.5); + printf("Volume after change: %d%%\n", volume_percentage_after); + + pa_threaded_mainloop_signal(mainloop, 0); +} + +/** + * @brief Callback function for context state changes. + * + * This function checks if the context is ready and then triggers the retrieval + * of the default sink's information. + * + * @param c The PulseAudio context. + * @param userdata User data (unused). + */ +void context_state_cb(pa_context *c, void *userdata) { + (void) c; + (void) userdata; + + if (pa_context_get_state(c) == PA_CONTEXT_READY) { + pa_operation_unref(pa_context_get_sink_info_by_name(c, "@DEFAULT_SINK@", set_volume_cb, NULL)); + } +} + +int main(void) { + // Initialize PulseAudio threaded mainloop and context + mainloop = pa_threaded_mainloop_new(); + pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "volume_changer_threaded"); + + // Set context state callback and connect the context + pa_context_set_state_callback(context, context_state_cb, NULL); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + + // Start the threaded mainloop + pa_threaded_mainloop_start(mainloop); + + // Lock the mainloop and wait for operations to complete + pa_threaded_mainloop_lock(mainloop); + pa_threaded_mainloop_wait(mainloop); + + // Cleanup and free resources + pa_context_disconnect(context); + pa_context_unref(context); + pa_threaded_mainloop_unlock(mainloop); + pa_threaded_mainloop_stop(mainloop); + pa_threaded_mainloop_free(mainloop); + return 0; +} diff --git a/v-0.09/examples/volume-change.c b/v-0.09/examples/volume-change.c new file mode 100644 index 0000000..013d39d --- /dev/null +++ b/v-0.09/examples/volume-change.c @@ -0,0 +1,67 @@ +/** + * @file volume-change.c + * @brief PulseAudio Manager demo program + * + * This program demonstrates the usage of the PulseAudio Manager API. + * It creates a manager instance, lists the available output devices, + * asks the user to select one of the output devices and to enter a master volume. + * It then sets the master volume of the selected output device to the given value. + * + * @author mbyte-2 + * @date 11-07-2023 + */ +#include +#include "../easypulse_core.h" // Assuming this is the header file where your API is defined + +int main() { + // Create a manager instance + pulseaudio_manager *manager = manager_create(); + if (!manager) { + fprintf(stderr, "Failed to create manager.\n"); + return 1; + } + + // List the outputs + printf("Available output devices:\n"); + for (uint32_t i = 0; i < get_output_device_count(); ++i) { + printf("%d: %s\n", (i+1), manager->outputs[i].name); + } + + // Ask the user to select one of the outputs + uint32_t selected_output; + printf("Please enter the number of the output device you want to use: "); + scanf("%u", &selected_output); + + // Check if the selected output is valid + if ((selected_output - 1) >= get_output_device_count()) { + fprintf(stderr, "Invalid output device number.\n"); + manager_cleanup(manager); + return 1; + } + + // Ask the user to type a master volume + int master_volume; + printf("Please enter the master volume (0-100): "); + scanf("%d", &master_volume); + + // Check if the master volume is valid + if (master_volume < 0 || master_volume > 100) { + fprintf(stderr, "Invalid master volume. It should be between 0 and 100.\n"); + manager_cleanup(manager); + return 1; + } + + // Set the master volume to the given value + if (manager_set_master_volume(manager, (selected_output -1), master_volume) != 0) { + fprintf(stderr, "Failed to set master volume.\n"); + manager_cleanup(manager); + return 1; + } + + printf("Master volume for output device '%s' has been set to %d.\n", manager->outputs[(selected_output-1)].name, master_volume); + + // Clean up + manager_cleanup(manager); + + return 0; +} diff --git a/v-0.09/libeasypulse_core.a b/v-0.09/libeasypulse_core.a new file mode 100644 index 0000000000000000000000000000000000000000..ab943624978e4b726d34429a502bec258f0dae0c GIT binary patch literal 34638 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 literal 0 HcmV?d00001 diff --git a/v-0.09/system_query.c b/v-0.09/system_query.c new file mode 100644 index 0000000..4a17d55 --- /dev/null +++ b/v-0.09/system_query.c @@ -0,0 +1,2375 @@ +#include "system_query.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include // Include this for the isdigit() function + +// Since pulseaudio uses callbacks, we need something that will allow us to share data +// between functions. +typedef struct { + pa_threaded_mainloop *mainloop; + pa_mainloop_api *mainloop_api; + pa_context *context; +} _shared_data_1; + +static _shared_data_1 shared_data_1; + +// Structure to share data between get_alsa_name and its callback. +typedef struct { + char *alsa_name; + char *alsa_id; +} _shared_data_2; + +static _shared_data_2 shared_data_2 = {.alsa_name = NULL}; + + +// Structure to share data between get_available_output_devices and its callback. +typedef struct { + pa_sink_info **sinks; // An array of pointers to pa_sink_info + uint32_t count; +} _shared_data_3; + +static _shared_data_3 shared_data_3; + +// Structure to share data between get_profiles and its callback. +typedef struct { + pa_card_profile_info *profiles; + int num_profiles; +} _shared_data_4; + +_shared_data_4 shared_data_4 = {NULL, 0}; + +// Structure to share data between get_available_input_devices and its callback. +static struct { + pa_source_info **sources; // Array of pointers to pa_source_info structures + uint32_t count; // Count of available sources + uint32_t allocated; // Allocated size of the sources array +} shared_data_sources = {NULL, 0, 0}; + + +static void pulse_cleanup(void); +static bool is_pulse_initialized(void); +static void get_output_device_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata); +static void get_profile_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata); + +// Utility function to print all properties in the proplist +void print_proplist(const pa_proplist *p) { + void *state = NULL; + const char *key; + while ((key = pa_proplist_iterate(p, &state))) { + const char *value = pa_proplist_gets(p, key); + if (value) { + printf("%s = %s\n", key, value); + } else { + printf("%s = \n", key); + } + } +} + +/** + * @brief Iterates through operations in the pulseaudio threaded loop. + * + * @param loop Pointer to the threaded loop instance. + * @param op Pointer to the pa_operation instance. + */ +static void iterate(pa_operation *op) { + //fprintf(stderr, "[DEBUG] Entering %s\n", __FUNCTION__); // Debug statement for entry + + //Leaves if operation is invalid. + if (!op) { + fprintf(stderr, "[DEBUG] Operation is NULL\n"); // Debug statement for NULL operation + return; + } + + bool is_in_mainloop_thread = pa_threaded_mainloop_in_thread(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Is in mainloop thread: %d\n", is_in_mainloop_thread); // Debug statement for thread check + + // If we're not in the mainloop thread, lock it. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_lock(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Mainloop locked\n"); // Debug statement for mainloop locked + } + + //Wait for the operation to complete. + //The signaling to continue is performed inside the callback operation (op). + while (pa_operation_get_state(op) == PA_OPERATION_RUNNING) { + pa_threaded_mainloop_wait(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Waiting in mainloop...\n"); // Debug message while waiting + } + + //Debug code if needed. + #if 0 + // Check the operation state after waiting + switch (pa_operation_get_state(op)) { + case PA_OPERATION_DONE: + fprintf(stderr, "[DEBUG] Operation completed successfully\n"); // Debug message for successful completion + break; + case PA_OPERATION_CANCELLED: + fprintf(stderr, "[DEBUG] Operation was cancelled\n"); // Debug message for cancellation + break; + case PA_OPERATION_RUNNING: // This case should not be possible after the wait + default: + fprintf(stderr, "[DEBUG] Operation is in an unexpected state: %d\n", pa_operation_get_state(op)); // Debug message for unexpected state + break; + } + #endif + + //Cleaning up. + pa_operation_unref(op); + //fprintf(stderr, "[DEBUG] Operation unreferenced and cleaned up\n"); // Debug statement for cleanup + + // If we locked the mainloop earlier, unlock it now. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Mainloop unlocked\n"); // Debug statement for mainloop unlocked + } + + //fprintf(stderr, "[DEBUG] Exiting %s\n", __FUNCTION__); // Debug statement for exit +} + + +/** + * @brief Callback function to handle changes in PulseAudio context state. + * + * This function is triggered whenever the state of the PulseAudio context changes. + * It signals the mainloop to continue execution whenever the context is in a READY, FAILED, + * or TERMINATED state. + * + * @param c Pointer to the PulseAudio context. + * @param userdata Pointer to the data shared with the main function, which contains the mainloop. + */ +static void context_state_cb(pa_context *c, void *userdata) { + (void) userdata; + pa_context_state_t state = pa_context_get_state(c); + + // If the context is in a READY, FAILED, or TERMINATED state, signal the mainloop to continue. + if (state == PA_CONTEXT_READY || state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } +} + +/** + * @brief Utility function to check if PulseAudio is initialized and in a READY state. + * + * This function checks the state of the PulseAudio context and other key PulseAudio resources + * to determine if PulseAudio has been successfully initialized and is in a READY state. + * + * @return True if PulseAudio is initialized and in a READY state, false otherwise. + */ +static bool is_pulse_initialized(void) { + + + // Check if the main components of PulseAudio (mainloop, mainloop_api, and context) are initialized. + if (shared_data_1.mainloop && shared_data_1.mainloop_api && shared_data_1.context) { + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + + // If the context is in a READY state, PulseAudio is initialized. + if (state == PA_CONTEXT_READY) { + return true; + } + } + return false; +} + +/** + * @brief Initializes the PulseAudio mainloop and context for querying audio information. + * + * This function sets up the necessary PulseAudio components for subsequent queries + * to the audio subsystem. It creates a new threaded mainloop, obtains the mainloop API, + * and creates a new context with a specified name. It also starts the mainloop and + * connects the context to the PulseAudio server, waiting until the context is ready + * or an error occurs. + * + * @note If this function fails at any point, it ensures that all allocated resources are + * cleaned up before returning. + * + * @return true if the PulseAudio components were initialized successfully, false otherwise. + */ +bool initialize_pulse() { + shared_data_1.mainloop = pa_threaded_mainloop_new(); + if (!shared_data_1.mainloop) { + fprintf(stderr, "Failed to create mainloop.\n"); + return false; + } + + shared_data_1.mainloop_api = pa_threaded_mainloop_get_api(shared_data_1.mainloop); + if (!shared_data_1.mainloop_api) { + fprintf(stderr, "Failed to get mainloop API.\n"); + pa_threaded_mainloop_free(shared_data_1.mainloop); + return false; + } + + shared_data_1.context = pa_context_new(shared_data_1.mainloop_api, "Easypulse query API"); + if (!shared_data_1.context) { + fprintf(stderr, "Failed to create context.\n"); + pa_threaded_mainloop_free(shared_data_1.mainloop); + return false; + } + + + pa_context_set_state_callback(shared_data_1.context, context_state_cb, shared_data_1.mainloop); + + // Start the threaded mainloop + pa_threaded_mainloop_start(shared_data_1.mainloop); + + // Lock the mainloop and connect the context + pa_threaded_mainloop_lock(shared_data_1.mainloop); + if (pa_context_connect(shared_data_1.context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + pulse_cleanup(); + return false; + } + + // Wait for the context to be ready + while (true) { + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + if (state == PA_CONTEXT_READY) { + break; + } else if (state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + pulse_cleanup(); + return false; + } + pa_threaded_mainloop_wait(shared_data_1.mainloop); + } + + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + return true; +} + + +/** + * @brief Cleanup function to properly disconnect and free PulseAudio resources. + * + * This function ensures that all the PulseAudio resources are properly disconnected, + * dereferenced, and freed to avoid any resource leaks. It should be called whenever + * PulseAudio operations are done and the program wishes to terminate or release PulseAudio. + */ +static void pulse_cleanup(void) { + if (shared_data_1.context) { + // Check if the context is in a state where it can be disconnected + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + if (state == PA_CONTEXT_READY) { + pa_context_disconnect(shared_data_1.context); + } + pa_context_unref(shared_data_1.context); + shared_data_1.context = NULL; + } + if (shared_data_1.mainloop) { + pa_threaded_mainloop_free(shared_data_1.mainloop); + shared_data_1.mainloop = NULL; + } +} + +/** + * @brief Callback function used to retrieve the count of audio profiles for a specific card. + * + * This function is called by PulseAudio when querying for the list of profiles for a given card index. + * It sets the profile_count with the number of profiles available for the card. + * If there's an error or the list is exhausted, the function signals the mainloop to continue + * without further processing. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current card information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function, which contains the mainloop + * and the profile_count to be set. + */ +static void get_profile_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + + uint32_t *profile_count = (uint32_t *) userdata; + + // Handle errors in retrieving profile count. + if (eol < 0) { + fprintf(stderr, "Failed to get profile count.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // If we've reached the end of the list of profiles, signal the mainloop to continue. + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Set the profile_count with the number of profiles available for the card. + *profile_count = i->n_profiles; +} + + +/** + * @brief Retrieve the count of audio profiles for a specific card. + * + * This function queries PulseAudio to get a count of all available audio profiles + * for a specified card index. If PulseAudio is not initialized, the function attempts + * to initialize it. If there's an error in fetching the profile count or initializing + * PulseAudio, it returns UINT32_MAX. + * + * @param card_index The index of the card for which to retrieve the profile count. + * @return Count of audio profiles or UINT32_MAX on error. + */ +uint32_t get_profile_count(uint32_t card_index) { + uint32_t profile_count = 0; // Initialize profile count to zero. + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "get_profiles_count(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails. + } + } + + // Query PulseAudio for the list of audio profiles for the specified card. + // The callback get_profile_count_cb will populate the profile_count variable. + count_op = pa_context_get_card_info_by_index(shared_data_1.context, card_index, get_profile_count_cb, &profile_count); + + // Wait for the PulseAudio operation to complete. + iterate(count_op); + + return profile_count; // Return the total count of profiles. +} + +/** + * @brief Callback function used to populate the list of available audio sinks. + * + * This function is called for each audio sink found by PulseAudio when querying + * for the list of sinks. The function populates the `shared_sink_data` structure + * with `pa_sink_info` for each sink. When the list is exhausted or there's an error, + * the function exits without further processing. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio sink information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function. + */ +static void get_available_output_devices_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + (void) userdata; + + uint32_t *count = &shared_data_3.count; + + // Handle errors in retrieving sink information. + if (eol < 0) { + fprintf(stderr, "Failed to get sink info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // If we've reached the end of the list of sinks, mark the end and exit the callback. + if (eol > 0) { + shared_data_3.sinks[*count] = NULL; // Set the last element to NULL as sentinel + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Allocate memory for the pa_sink_info structure. + shared_data_3.sinks[*count] = malloc(sizeof(pa_sink_info)); + if (shared_data_3.sinks[*count] == NULL) { + fprintf(stderr, "Failed to allocate memory for sink info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Copy the pa_sink_info structure. + *(shared_data_3.sinks[*count]) = *i; + + // Duplicate the strings to ensure they remain valid. + if (i->name != NULL) { + shared_data_3.sinks[*count]->name = strdup(i->name); + } + if (i->description != NULL) { + shared_data_3.sinks[*count]->description = strdup(i->description); + } + + (*count)++; +} + +/** + * @brief Retrieve the list of available audio sinks for a specific card. + * + * This function queries PulseAudio to get a list of all available audio sinks + * for a specified card index. It dynamically allocates memory based on the count + * of sinks to store the list of sinks. + * If PulseAudio is not initialized, the function attempts to initialize it. + * + * @param card_index The index of the card for which to retrieve the sinks. + * @return Pointer to the first sink in the list or NULL on error. + */ +pa_sink_info **get_available_output_devices() { + pa_operation *op = NULL; + + // Using get_output_device_count() to obtain the number of sinks + uint32_t max_sinks = get_output_device_count(); + + // Allocate memory for pointers + shared_data_3.sinks = malloc((max_sinks + 1) * sizeof(pa_sink_info*)); + shared_data_3.count = 0; // Reset count + + // Check for successful memory allocation + if (!shared_data_3.sinks) { + fprintf(stderr, "Failed to allocate memory for sinks.\n"); + return NULL; + } + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_available_output_devices(): failed to initialize pulseaudio.\n"); + free(shared_data_3.sinks); + shared_data_3.sinks = NULL; + return NULL; + } + } + + + // Query PulseAudio for the list of available sinks for the specified card + op = pa_context_get_sink_info_list(shared_data_1.context, get_available_output_devices_cb, NULL); + + // Wait for the PulseAudio operation to complete + iterate(op); + + return shared_data_3.sinks; +} + +/** + * @brief Frees the memory allocated for an array of output devices (sinks). + * + * This function iterates over an array of `pa_sink_info` pointers, freeing the memory for + * each sink's name and description strings, followed by the sink structure itself. It concludes + * by freeing the memory for the array of pointers. + * + * @param sinks A pointer to the first element in an array of `pa_sink_info` pointers, which + * must be terminated with a NULL pointer. If NULL is passed, the function does nothing. + */ +void delete_output_devices(pa_sink_info **sinks) { + if (sinks == NULL) { + return; + } + + for (int i = 0; sinks[i] != NULL; ++i) { + if (sinks[i]->name) { + free((char*)sinks[i]->name); + } + if (sinks[i]->description) { + free((char*)sinks[i]->description); + } + free(sinks[i]); + } + + free(sinks); +} + +/** + * @brief Frees the memory allocated for an array of input devices (sources). + * + * This function iterates over an array of `pa_source_info` pointers, freeing the memory for + * each source's name and description strings, followed by the source structure itself. It concludes + * by freeing the memory for the array of pointers. + * + * @param sources A pointer to the first element in an array of `pa_source_info` pointers, which + * must be terminated with a NULL pointer. If NULL is passed, the function does nothing. + */ +void delete_input_devices(pa_source_info **sources) { + if (!sources) { + return; // Nothing to do if the pointer is NULL + } + + // Iterate through each source info and free its memory + for (int i = 0; sources[i] != NULL; i++) { + if (sources[i]->name) { + free((char*)sources[i]->name); + } + if (sources[i]->description) { + free((char*)sources[i]->description); + } + free(sources[i]); + } + + // Free the array of pointers itself + free(sources); +} + + +/** + * @brief Callback function used to count the available audio devices (cards). + * + * This function is called for each audio device found by PulseAudio when querying + * for the list of devices. The function increments the device_count for each device. + * When the list is exhausted or there's an error, it signals the mainloop to continue. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio device information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function. + */ +static void get_output_device_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + (void) i; + + uint32_t *device_count = (uint32_t *) userdata; + + if (eol < 0) { + // Handle error + //fprintf(stderr,"[DEBUG, get_output_device_count_cb()] Reached elo < 0. Signal triggered.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + if (eol > 0) { + // End of list + //fprintf(stderr,"[DEBUG, get_output_device_count_cb()] Reached elo > 0. Signal triggered.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + ++(*device_count); +} + + + +/** + * @brief Retrieve the count of audio devices in the system. + * + * This function queries PulseAudio to get a count of all available audio devices (cards). + * If PulseAudio is not initialized, the function attempts to initialize it. If the initialization + * fails or there's an error in fetching the device count, it returns UINT32_MAX. + * + * @return Count of audio devices or UINT32_MAX on error. + */ +uint32_t get_output_device_count(void) { + uint32_t device_count = 0; // Initialize device count to zero. + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "get_device_count(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails. + } + } + + // Check if context is valid after initialization attempt. + if (!shared_data_1.context) { + fprintf(stderr, "Context is NULL in get_device_count.\n"); + return UINT32_MAX; + } + + //fprintf(stderr,"[get_device_count()] context is, %p\n",&shared_data_1.context); + //fprintf(stderr,"[get_device_count()] mainloop is, %p\n",&shared_data_1.mainloop); + + // Query PulseAudio for the list of audio devices (cards). + // The callback get_device_count_cb will increment the device_count for each device found. + count_op = pa_context_get_card_info_list(shared_data_1.context, get_output_device_count_cb, &device_count); + + // Wait for the PulseAudio operation to complete. + iterate(count_op); + + return device_count; // Return the total count of devices. +} + +/** + * @brief Retrieves the minimum number of channels for the given ALSA device name. + * + * This function opens the specified ALSA device in capture mode, retrieves + * its hardware parameters, and then queries for the minimum number of channels + * supported by the device. + * + * @param alsa_name Name of the ALSA device. + * @return Minimum number of channels supported by the device or -1 on error. + */ +int get_min_input_channels(const char *alsa_id, const pa_source_info *source_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int min_channels = 0; + int err; + + if ((!alsa_id) && (!source_info)) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + //The input device was found, but there's no alsa information about it. + //Attempt to retrieve used channels instead. + else if((!alsa_id) && (source_info)) { + return source_info->sample_spec.channels; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK)) < 0) { + fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return source_info->sample_spec.channels; // Return channels from PulseAudio if ALSA fails + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return source_info->sample_spec.channels; + } + + if ((err = snd_pcm_hw_params_get_channels_min(params, &min_channels)) < 0) { + fprintf(stderr, "Error getting min channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return source_info->sample_spec.channels; + } + + snd_pcm_close(handle); + return min_channels; +} + + +/** + * @brief Retrieves the maximum number of channels for the given ALSA device name. + * + * This function opens the specified ALSA device in capture mode, retrieves + * its hardware parameters, and then queries for the maximum number of channels + * supported by the device. If ALSA fails, it will fall back to using the + * information from PulseAudio. + * + * @param alsa_name Name of the ALSA device. + * @param source_info Information about the PulseAudio source. + * @return Maximum number of channels supported by the device or -1 on error. + */ +int get_max_input_channels(const char *alsa_id, const pa_source_info *source_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int max_channels = 0; + int err; + + if ((!alsa_id) && (!source_info)) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + //The input device was found, but there's no alsa information about it. + //Attempt to retrieve used channels instead. + else if((!alsa_id) && (source_info)) { + return source_info->sample_spec.channels; + } + + // Try to open the ALSA device in capture mode + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK)) < 0) { + fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + // ALSA failed, fall back to PulseAudio information + return source_info->sample_spec.channels; + } + + // Allocate hardware parameters object + snd_pcm_hw_params_alloca(¶ms); + + // Fill it in with default values + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return source_info->sample_spec.channels; + } + + // Get the maximum number of channels + if ((err = snd_pcm_hw_params_get_channels_max(params, &max_channels)) < 0) { + fprintf(stderr, "Error getting max channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return source_info->sample_spec.channels; + } + + // Close the device + snd_pcm_close(handle); + + return max_channels; +} + +/** + * @brief Retrieves the maximum number of channels for the given ALSA device name. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the maximum number of channels + * supported by the device. + * + * @param alsa_name Name of the ALSA device. + * @return Maximum number of channels supported by the device or -1 on error. + */ +int get_max_output_channels(const char *alsa_id, const pa_sink_info *sink_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int max_channels = 0; + int err; + + if ((!alsa_id) && (!sink_info)) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + //The input device was found, but there's no alsa information about it. + //Attempt to retrieve used channels instead. + else if((!alsa_id) && (sink_info)) { + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { + //fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return sink_info->sample_spec.channels; // Return channels from PulseAudio if ALSA fails + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + //fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_hw_params_get_channels_max(params, &max_channels)) < 0) { + //fprintf(stderr, "Error getting max channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + //fprintf(stderr, "[DEBUG, get_max_channels()] sink_info->sample_spec.channels is %i\n", sink_info->sample_spec.channels); + return sink_info->sample_spec.channels; + } + + snd_pcm_close(handle); + return max_channels; +} + +/** + * @brief Retrieves the minimum number of channels for the given ALSA device id. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the minimum number of channels + * supported by the device. + * + * @param alsa_name Name of the ALSA device. + * @return Minimum number of channels supported by the device or -1 on error. + */ +int get_min_output_channels(const char *alsa_id, const pa_sink_info *sink_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int min_channels = 0; + int err; + + //fprintf(stderr, "[DEBUG, get_min_output_channels()] sink_info->sample_spec.channels is %i\n", sink_info->sample_spec.channels); + + if ((!alsa_id) && (!sink_info)) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + //The input device was found, but there's no alsa information about it. + //Attempt to retrieve used channels instead. + else if((!alsa_id) && (sink_info)) { + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { + //fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return sink_info->sample_spec.channels; + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + //fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_hw_params_get_channels_min(params, &min_channels)) < 0) { + //fprintf(stderr, "Error getting min channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.channels; + } + + snd_pcm_close(handle); + return min_channels; +} + +/** + * @brief Callback function for retrieving the ALSA card name of a PulseAudio source. + * + * This callback is called by the PulseAudio context during the operation to retrieve + * information about each available source. It is registered with the + * pa_context_get_source_info_by_name() function call. + * + * @param c The PulseAudio context. + * @param i The source information structure containing details about the source. + * @param eol End of list indicator. If non-zero, indicates no more data to process. + * @param userdata User data provided when registering the callback. In this case, it is + * expected to be the name of the source for which we want the ALSA card name. + * + * @note This function is intended to be used internally and should not be called directly. + * + * @warning This function uses global shared data (shared_data_2.alsa_name) to store the + * retrieved ALSA name, and signals the main loop to stop waiting. Ensure that + * the main loop and shared data are properly managed. + */ +static void get_alsa_input_name_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; + + if (eol < 0 || !i) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; // Handle error or invalid source info + } + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; // End of list + } + + // Check if this source is the one we're interested in + if (userdata && strcmp(i->name, (const char *)userdata) == 0) { + const char *prop_alsa_card_name = pa_proplist_gets(i->proplist, "alsa.card_name"); + if (prop_alsa_card_name) { + shared_data_2.alsa_name = strdup(prop_alsa_card_name); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); // Signal to stop the loop + } + } +} + +/** + * @brief Retrieves the ALSA name of a given PulseAudio source. + * + * @param source_name The name of the source for which to retrieve the ALSA name. + * @return The ALSA name of the source or NULL if not found or on error. + */ +char* get_alsa_input_name(const char *source_name) { + if (!source_name) { + fprintf(stderr, "get_alsa_input_name(): Invalid source name.\n"); + return NULL; + } + + shared_data_2.alsa_name = NULL; // Ensure alsa_name is initialized to NULL + + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "get_alsa_input_name(): PulseAudio initialization failed.\n"); + return NULL; + } + + pa_operation *name_op = pa_context_get_source_info_by_name(shared_data_1.context, source_name, get_alsa_input_name_cb, (void*)source_name); + iterate(name_op); + + return shared_data_2.alsa_name; +} + + +/** + * @brief Callback function to retrieve the ALSA name from the card info. + * + * This callback checks for the "alsa.card_name" property in the card's + * proplist. If the property is found, it assigns the property's value + * to the shared data structure for further use. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the card info structure. + * @param eol Flag indicating end of list. + * @param userdata User-defined data pointer (unused in this callback). + */ +static void get_alsa_output_name_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + + if (eol) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + const char *target_sink_name = userdata; + if (target_sink_name && strcmp(target_sink_name, i->name) != 0) { + return; // Skip this sink, as it does not match the specified name + } + + const char *alsa_name = pa_proplist_gets(i->proplist, "alsa.card_name"); + if (alsa_name) { + shared_data_2.alsa_name = strdup(alsa_name); + if (!shared_data_2.alsa_name) { + fprintf(stderr, "Failed to allocate memory for ALSA name.\n"); + } + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } +} + + + +/** + * @brief Retrieves the ALSA name of the first audio device encountered. + * + * This function initializes PulseAudio (if not already initialized), then + * queries PulseAudio for the list of audio devices. It waits for the + * retrieval operation to complete and then returns the ALSA name + * of the first device it finds with the "alsa.card_name" property. + * + * @return ALSA name of the device or NULL if not found or on error. + */ +char* get_alsa_output_name(const char *sink_name) { + pa_operation *name_op; + + shared_data_2.alsa_name = NULL; // Ensure alsa_name is initialized to NULL + + + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "get_alsa_name(): PulseAudio initialization failed.\n"); + return NULL; + } + + name_op = pa_context_get_sink_info_list(shared_data_1.context, get_alsa_output_name_cb, (void*)sink_name); + iterate(name_op); + + return shared_data_2.alsa_name; +} + +/** + * @brief Callback function to retrieve the ALSA device string based on PulseAudio source information. + * + * This function is called for each available PulseAudio source. It checks if the source's name matches + * the target source name provided in the userdata. If a match is found, it retrieves the "alsa.card" and + * "alsa.device" properties from the source's proplist, constructs the ALSA device string in the format + * "hw:,", and stores it in shared data for later retrieval. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the source information structure. + * @param eol End of list flag. If non-zero, indicates the end of the source list. + * @param userdata User-defined data pointer. In this case, it points to the target source name string. + */ +static void get_alsa_input_id_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; // Unused parameter + + // Check for end of list + if (eol) { + // Signal the main loop to unblock the iterate function + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + free(userdata); + return; + } + + // Retrieve the target source name from userdata + const char *target_source_name = (const char *)userdata; + + // Skip this source if it does not match the specified target name + if (target_source_name && strcmp(target_source_name, i->name) != 0) { + return; + } + + // Attempt to retrieve the "alsa.card" and "alsa.device" properties + const char *alsa_card = pa_proplist_gets(i->proplist, "alsa.card"); + const char *alsa_device = pa_proplist_gets(i->proplist, "alsa.device"); + + //print_proplist(i->proplist); + //printf("[DEBUG, get_alsa_input_id_cb] alsa_card is %s\n", alsa_card); + //printf("[DEBUG, get_alsa_input_id_cb] alsa_device is %s\n", alsa_device); + + // Construct the ALSA device string if both properties are available + if (alsa_card && alsa_device && isdigit((unsigned char)alsa_device[0])) { + char alsa_device_string[128]; + snprintf(alsa_device_string, sizeof(alsa_device_string), "hw:%s,%s", alsa_card, alsa_device); + + // Store the ALSA device string in shared data + shared_data_2.alsa_id = strdup(alsa_device_string); + if (!shared_data_2.alsa_id) { + fprintf(stderr, "Failed to allocate memory for ALSA device id.\n"); + } + } else { + // Log an error if ALSA properties are not found or are invalid + //fprintf(stderr, " - ALSA properties not found or invalid for source.\n"); + shared_data_2.alsa_id = NULL; + } + + // Signal the main loop to unblock the iterate function + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + +/** + * @brief Retrieves the ALSA device string for a given PulseAudio source name. + * + * This function initializes PulseAudio (if not already initialized), then queries PulseAudio for the + * information of a specific source by its name. It waits for the retrieval operation to complete and then + * returns the constructed ALSA device string based on the "alsa.card" and "alsa.device" properties of + * the source. + * + * @param source_name The name of the PulseAudio source. + * @return ALSA device string in the format "hw:," or NULL if not found or on error. + */ +char* get_alsa_input_id(const char *source_name) { + // Operation object for asynchronous PulseAudio calls + pa_operation *op; + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_alsa_input_id(): PulseAudio initialization failed.\n"); + return NULL; + } + } + + // Duplicate the source name to ensure it remains valid throughout the operation + char *source_name_copy = strdup(source_name); + if (!source_name_copy) { + fprintf(stderr, "get_alsa_input_id(): Failed to allocate memory for source name.\n"); + return NULL; + } + + // Start querying PulseAudio for the specified source information + op = pa_context_get_source_info_by_name(shared_data_1.context, source_name_copy, get_alsa_input_id_cb, source_name_copy); + + // Block and wait for the operation to complete + iterate(op); + + // After the callback has been called with the source information, the ALSA device ID will be stored + // Return the stored ALSA device ID + return shared_data_2.alsa_id; +} + + + +/** + * @brief Callback function to retrieve the ALSA device string based on the PulseAudio sink information. + * + * This function is called for each available PulseAudio sink. It checks if the sink's name matches the + * target sink name provided in the userdata. If a match is found, it retrieves the "alsa.card" and + * "alsa.device" properties from the sink's proplist, constructs the ALSA device string in the format + * "hw:,", and stores it in shared data for later retrieval. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the sink information structure. + * @param eol End of list flag. If non-zero, indicates the end of the sink list. + * @param userdata User-defined data pointer. In this case, it points to the target sink name string. + */ +static void get_alsa_output_id_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; // Unused parameter + + // Check for end of list + if (eol) { + // Signal the main loop to unblock the iterate function + //fprintf(stderr,"[DEBUG, get_alsa_id_cb()] End of function reached.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + free(userdata); + return; + } + + // Retrieve the target sink name from userdata + const char *target_sink_name = userdata; + + // If a target sink name is provided, check if it matches the current sink's name + if (target_sink_name && strcmp(target_sink_name, i->name) != 0) { + return; // Skip this sink, as it does not match the specified name + } + + // Attempt to retrieve the "alsa.card" and "alsa.device" properties + const char *alsa_card = pa_proplist_gets(i->proplist, "alsa.card"); + const char *alsa_device = pa_proplist_gets(i->proplist, "alsa.device"); + + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()], alsa.card is %s\n", alsa_card); + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()], alsa.device is %s\n", alsa_device); + + // Check if both properties are available and alsa.device is a digit + if (alsa_card && alsa_device && isdigit((unsigned char)alsa_device[0])) { + // Construct the ALSA device string + char alsa_device_string[128]; + snprintf(alsa_device_string, sizeof(alsa_device_string), "hw:%s,%s", alsa_card, alsa_device); + + // Store the ALSA device string in shared data + shared_data_2.alsa_id = strdup(alsa_device_string); + if (!shared_data_2.alsa_id) { + fprintf(stderr, "Failed to allocate memory for ALSA device id.\n"); + } + } else { + shared_data_2.alsa_id = NULL; + //fprintf(stderr, " - ALSA properties not found or invalid for sink.\n"); + } + + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()] alsa ID is %s\n", shared_data_2.alsa_id); + + // Signal the main loop to unblock the iterate function + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + + +/** + * @brief Retrieves the ALSA device string for a given PulseAudio sink name. + * + * This function initializes PulseAudio (if not already initialized), then queries PulseAudio for the + * information of a specific sink by its name. It waits for the retrieval operation to complete and then + * returns the constructed ALSA device string based on the "alsa.card" and "alsa.device" properties of + * the sink. + * + * @param sink_name The name of the PulseAudio sink. + * @return ALSA device string in the format "hw:," or NULL if not found or on error. + */ +char* get_alsa_output_id(const char *sink_name) { + pa_operation *op; + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_alsa_id(): PulseAudio initialization failed.\n"); + return NULL; + } + } + + // Make a copy of the sink name to ensure it remains valid + char *sink_name_copy = strdup(sink_name); + if (!sink_name_copy) { + fprintf(stderr, "get_alsa_id(): Failed to allocate memory for sink name.\n"); + return NULL; + } + + // Query PulseAudio for the information of the specified sink + //fprintf(stderr,"[DEBUG, get_alsa_id()] sink name is: %s\n", sink_name_copy); + op = pa_context_get_sink_info_by_name(shared_data_1.context, sink_name_copy, get_alsa_output_id_cb, sink_name_copy); + + // Wait for the PulseAudio operation to complete + iterate(op); + + // Return the ALSA device string retrieved by the callback function + return shared_data_2.alsa_id; +} + + +/** + * @brief Retrieves the sample rate of the specified PulseAudio source by ALSA identifier. + * + * Attempts to open the ALSA device corresponding to the given PulseAudio source + * to query the sample rate. If the ALSA query fails, the function falls back to + * returning the sample rate as reported by the PulseAudio source information. + * + * @param alsa_id The ALSA device identifier corresponding to the PulseAudio source. + * @param source_info The PulseAudio source information structure. + * @return The sample rate of the source in Hz on success, or -1 on error. + */ +int get_input_sample_rate(const char *alsa_id, pa_source_info *source_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int sample_rate = 0; // Default to a known value + int err; + + // Output debug information to stderr + //fprintf(stderr, "[DEBUG, get_input_sample_rate()] called with alsa_id: '%s'\n", alsa_id); + + // If alsa_id is NULL, return the PulseAudio rate + if (!alsa_id && source_info) { + //fprintf(stderr, "alsa_id is NULL, returning PulseAudio sample rate: %u Hz\n", source_info->sample_spec.rate); + return source_info->sample_spec.rate; + } + + // Validate parameters + if (!alsa_id || !source_info) { + //fprintf(stderr, "Invalid parameters provided to get_input_sample_rate.\n"); + return -1; + } + + // Attempt to open the ALSA device + //fprintf(stderr, "[DEBUG, get_input_sample_rate()] Attempting to open ALSA device: '%s'\n", alsa_id); + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK)) < 0) { + fprintf(stderr, "Unable to open PCM device: '%s', error: %s\n", alsa_id, snd_strerror(err)); + return source_info->sample_spec.rate; + } + + // ALSA device successfully opened + //fprintf(stderr, "ALSA device: '%s' successfully opened.\n", alsa_id); + snd_pcm_hw_params_alloca(¶ms); + + // Initialize hardware parameters + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the access type for the hardware parameters + if ((err = snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { + fprintf(stderr, "Cannot set access type: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the sample format for the hardware parameters + if ((err = snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE)) < 0) { + fprintf(stderr, "Cannot set sample format: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the channel count for the hardware parameters + if ((err = snd_pcm_hw_params_set_channels(handle, params, source_info->sample_spec.channels)) < 0) { + fprintf(stderr, "Cannot set channel count: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Apply the hardware parameters to the device + if ((err = snd_pcm_hw_params(handle, params)) < 0) { + fprintf(stderr, "Cannot set hardware parameters: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Now try to get the sample rate + if ((err = snd_pcm_hw_params_get_rate(params, &sample_rate, 0)) < 0) { + fprintf(stderr, "Error getting sample rate for device: '%s', error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Sample rate successfully obtained + //fprintf(stderr, "Sample rate for ALSA device: '%s' is %u Hz\n", alsa_id, sample_rate); + snd_pcm_close(handle); + return sample_rate; // Successfully obtained sample rate +} + + + +/** + * @brief Retrieves the sample rate of the given ALSA device. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the sample rate. + * + * @param alsa_id Name of the ALSA device. + * @param sink_info Pointer to a PulseAudio sink_info structure. + * @return Sample rate of the device or -1 on error. + */ +/** + * @brief Retrieves the sample rate of the specified PulseAudio sink by ALSA identifier. + * + * Attempts to open the ALSA device corresponding to the given PulseAudio sink + * to query the sample rate. If the ALSA query fails, the function falls back to + * returning the sample rate as reported by the PulseAudio sink information. + * + * @param alsa_id The ALSA device identifier corresponding to the PulseAudio sink. + * @param sink_info The PulseAudio sink information structure. + * @return The sample rate of the sink in Hz on success, or -1 on error. + */ +int get_output_sample_rate(const char *alsa_id, const pa_sink_info *sink_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int sample_rate = 0; // Default to a known value + int err; + + //fprintf(stderr, "[DEBUG, get_output_sample_rate()] called with alsa_id: '%s'\n", alsa_id); + + if (!alsa_id && sink_info) { + //fprintf(stderr, "alsa_id is NULL, returning PulseAudio sample rate: %u Hz\n", sink_info->sample_spec.rate); + return sink_info->sample_spec.rate; + } + + if (!alsa_id || !sink_info) { + //fprintf(stderr, "Invalid parameters provided to get_output_sample_rate.\n"); + return -1; + } + + //fprintf(stderr, "Attempting to open ALSA device: '%s'\n", alsa_id); + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, 0)) < 0) { + fprintf(stderr, "Unable to open PCM device: '%s', error: %s\n", alsa_id, snd_strerror(err)); + return sink_info->sample_spec.rate; + } + + //fprintf(stderr, "ALSA device: '%s' successfully opened.\n", alsa_id); + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the access type for the hardware parameters + if ((err = snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { + fprintf(stderr, "Cannot set access type: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the sample format for the hardware parameters + if ((err = snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE)) < 0) { + fprintf(stderr, "Cannot set sample format: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the channel count for the hardware parameters + if ((err = snd_pcm_hw_params_set_channels(handle, params, sink_info->sample_spec.channels)) < 0) { + fprintf(stderr, "Cannot set channel count: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Apply the hardware parameters to the device + if ((err = snd_pcm_hw_params(handle, params)) < 0) { + fprintf(stderr, "Cannot set hardware parameters: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Now try to get the sample rate + if ((err = snd_pcm_hw_params_get_rate(params, &sample_rate, 0)) < 0) { + fprintf(stderr, "Error getting sample rate for device: '%s', error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + //fprintf(stderr, "Sample rate for ALSA device: '%s' is %u Hz\n", alsa_id, sample_rate); + snd_pcm_close(handle); + return sample_rate; // Successfully obtained sample rate +} + + +// Callback for source information to get ports +void get_source_ports(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; + + pa_source_info_list *info_list = (pa_source_info_list *)userdata; + if (eol > 0) { + info_list->done = 1; + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + info_list->ports = realloc(info_list->ports, (info_list->num_ports + 1) * sizeof(pa_port_info)); + pa_port_info *port = &info_list->ports[info_list->num_ports]; + port->name = strdup(i->name); + port->description = strdup(i->description); + port->is_active = 0; // Will be set in the active port callback + + info_list->num_ports++; +} + +// Callback for source information to get the active port +void get_active_port(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; + pa_source_info_list *info_list = (pa_source_info_list *)userdata; + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (i->active_port) { + for (int j = 0; j < info_list->num_ports; ++j) { + if (strcmp(info_list->ports[j].name, i->active_port->name) == 0) { + info_list->ports[j].is_active = 1; + break; + } + } + } +} + +// Function to collect source port information and return it +pa_source_info_list* get_source_port_info() { + pa_source_info_list* info_list = malloc(sizeof(pa_source_info_list)); + if (!info_list) { + // Handle malloc failure + return NULL; + } + memset(info_list, 0, sizeof(pa_source_info_list)); + + // Call the function to get the list of sources + pa_operation *op = pa_context_get_source_info_list(shared_data_1.context, get_source_ports, info_list); + iterate(op); + + // Now iterate over the collected sources and get detailed info for each one + for (int i = 0; i < info_list->num_ports; ++i) { + op = pa_context_get_source_info_by_name(shared_data_1.context, info_list->ports[i].name, get_active_port, info_list); + + iterate(op); + } + + // The info_list now contains all the ports and their active status + return info_list; +} + + +/** + * @brief Retrieves the volume of a given channel from a PulseAudio sink. + * + * This function takes a pointer to a pa_sink_info structure and a channel index + * and returns the volume of that channel. The volume is given as a pa_volume_t, + * which is an unsigned 32-bit integer. The function checks if the channel index + * is within the valid range for the sink. + * + * @param sink_info A pointer to a pa_sink_info structure containing the sink details. + * @param channel_index The index of the channel for which to retrieve the volume. + * @return The volume of the specified channel as a pa_volume_t, or PA_VOLUME_INVALID on error. + */ +pa_volume_t get_channel_volume(const pa_sink_info *sink_info, unsigned int channel_index) { + // Check if the sink_info is NULL + if (sink_info == NULL) { + return PA_VOLUME_INVALID; // Return invalid volume if sink_info is NULL + } + + // Check if the provided channel index is valid + if (channel_index >= sink_info->channel_map.channels) { + return PA_VOLUME_INVALID; // Return invalid volume if the channel_index is out of range + } + + // Retrieve the volume of the given channel + return sink_info->volume.values[channel_index]; +} + + + +/** + * @brief Callback function for processing each available audio input device (source) found. + * + * This function is called by the PulseAudio context as part of the operation initiated by + * `get_available_input_devices`. It is invoked for each source found, and is responsible for + * storing the details of each source into a dynamically allocated array. The function handles + * memory allocation for the array of `pa_source_info` structures, as well as for the strings + * within them. It also handles error conditions and signals the mainloop to terminate the wait + * when the end of the source list is reached or an error occurs. + * + * @param c The PulseAudio context. + * @param i The `pa_source_info` structure containing details about the current source. + * @param eol End-Of-List indicator. If positive, indicates the end of the list; if negative, indicates an error. + * @param userdata User data pointer provided during the context operation setup; unused in this callback. + */ +static void get_available_input_devices_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void)c; // Unused parameter + (void)userdata; // Unused parameter + + // Error or end of list + if (eol < 0) { + fprintf(stderr, "Error occurred while getting source info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (eol > 0) { + shared_data_sources.sources[shared_data_sources.count] = NULL; // Sentinel value + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (shared_data_sources.count >= shared_data_sources.allocated) { + size_t new_alloc = shared_data_sources.allocated + 8; + void *temp = realloc(shared_data_sources.sources, new_alloc * sizeof(pa_source_info *)); + if (!temp) { + fprintf(stderr, "Out of memory when reallocating sources array.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + shared_data_sources.sources = temp; + shared_data_sources.allocated = new_alloc; + } + + shared_data_sources.sources[shared_data_sources.count] = malloc(sizeof(pa_source_info)); + if (!shared_data_sources.sources[shared_data_sources.count]) { + fprintf(stderr, "Out of memory when allocating source info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + *(shared_data_sources.sources[shared_data_sources.count]) = *i; + + if (i->name) { + shared_data_sources.sources[shared_data_sources.count]->name = strdup(i->name); + if (!shared_data_sources.sources[shared_data_sources.count]->name) { + fprintf(stderr, "Out of memory when duplicating source name.\n"); + } + } + if (i->description) { + shared_data_sources.sources[shared_data_sources.count]->description = strdup(i->description); + if (!shared_data_sources.sources[shared_data_sources.count]->description) { + fprintf(stderr, "Out of memory when duplicating source description.\n"); + } + } + + shared_data_sources.count++; +} + + +/** + * @brief Retrieves an array of available audio input devices (sources). + * + * This function queries the PulseAudio server for a list of all audio input devices + * currently available. It ensures that PulseAudio is initialized before making the query + * and locks the main loop to provide thread safety during the operation. + * + * Each call to this function should be followed by a call to `delete_input_devices` + * to free the allocated memory for the returned array of `pa_source_info` pointers. + * + * @note The array is terminated with a NULL pointer as the last element. + * + * @return On success, a pointer to an array of `pa_source_info` pointers, each representing + * an audio input device. On failure, or if PulseAudio is not initialized, NULL is returned. + */ +pa_source_info **get_available_input_devices() { + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "Failed to initialize PulseAudio.\n"); + return NULL; + } + } + + // Initialize the data structure for storing the sources + shared_data_sources.sources = NULL; + shared_data_sources.count = 0; + shared_data_sources.allocated = 0; + + // Start the operation to get available input devices + pa_operation *op = pa_context_get_source_info_list(shared_data_1.context, get_available_input_devices_cb, NULL); + if (op) { + // iterate handles locking, waiting, and cleanup + iterate(op); + } else { + fprintf(stderr, "Failed to create the operation to get source info.\n"); + return NULL; + } + + // Allocate one extra pointer to NULL at the end as a sentinel + shared_data_sources.sources = realloc(shared_data_sources.sources, (shared_data_sources.count + 1) * sizeof(pa_source_info *)); + if (shared_data_sources.sources) { + shared_data_sources.sources[shared_data_sources.count] = NULL; // Set the sentinel value + } else { + fprintf(stderr, "Out of memory while allocating sources array.\n"); + } + + return shared_data_sources.sources; +} + + +/** + * @brief Callback function used to count the available audio input devices (sources). + * + * This function is called for each audio input device found by PulseAudio when querying + * for the list of sources. The function increments the device_count for each device. + * When the list is exhausted or there's an error, it signals the mainloop to continue. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio input device information. + * @param eol End-Of-List indicator. If positive, indicates the end of the list; if negative, indicates an error. + * @param userdata Pointer to the user data, which in this case is expected to be a pointer to the device_count. + */ +static void get_input_device_count_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; // Suppress unused parameter warning + (void) i; // Suppress unused parameter warning + + uint32_t *device_count = (uint32_t *) userdata; + + if (eol < 0) { + // Handle error + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + if (eol > 0) { + // End of list + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + ++(*device_count); +} + + +/** + * @brief Retrieve the count of audio input devices in the system. + * + * This function queries PulseAudio to get a count of all available audio input devices (sources). + * If PulseAudio is not initialized, the function attempts to initialize it. If the initialization + * fails or there's an error in fetching the device count, it returns UINT32_MAX. + * + * @return Count of audio input devices or UINT32_MAX on error. + */ +uint32_t get_input_device_count(void) { + uint32_t device_count = 0; // Initialize device count to zero + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_input_device_count(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails + } + } + + // Check if context is valid after initialization attempt + if (!shared_data_1.context) { + fprintf(stderr, "Context is NULL in get_input_device_count.\n"); + return UINT32_MAX; + } + + // Query PulseAudio for the list of audio input devices (sources) + count_op = pa_context_get_source_info_list(shared_data_1.context, get_input_device_count_cb, &device_count); + + // Wait for the PulseAudio operation to complete + iterate(count_op); + + return device_count; // Return the total count of input devices +} + + +/** + * @brief Get the channel names for a specific sink identified by its name. + * + * This function retrieves the channel names for a given sink using its unique name. + * It allocates an array of strings where each entry corresponds to a channel name + * of the sink. The caller is responsible for freeing the memory allocated for the + * array of channel names and the strings themselves. + * + * @param sink_name The name of the sink whose channel names are to be retrieved. + * @param num_channels Number of channels of the sink. + * @return A pointer to an array of strings containing the channel names, or NULL if + * the sink is not found or in case of an error. + */ +char** get_output_channel_names(const char *pulse_id, int num_channels) { + // Validate input parameters + if (!pulse_id) { + return NULL; // Return NULL if the sink name is not provided + } + + // Retrieve the sink information for the specified sink name + pa_sink_info *device_info = get_output_device_by_name(pulse_id); + + // Check if the sink was found + if (!device_info) { + return NULL; // Return NULL if the sink is not found or in case of an error + } + + char **channel_names = calloc(num_channels, sizeof(char*)); + + if (!channel_names) { + free((char *)device_info->description); // Free the description if allocated + free(device_info); // Free the device_info structure + return NULL; // Return NULL if memory allocation fails + } + + // Copy the channel names into the array + for (int i = 0; i < num_channels; ++i) { + channel_names[i] = strdup(pa_channel_position_to_pretty_string(device_info->channel_map.map[i])); + if (!channel_names[i]) { + // Handle allocation failure for a channel name + // Free all previously allocated names and the array itself + while (i--) free(channel_names[i]); + free(channel_names); + free((char *)device_info->description); // Free the description if allocated + free(device_info); // Free the device_info structure + return NULL; // Return NULL if memory allocation fails + } + } + + // Free the sink_info structure and its description field + if (device_info->description) { + free((char *)device_info->description); // Corrected free statement + } + free(device_info); + + // Return the array of channel names + return channel_names; +} + +/** + * @brief Get the channel names for a specific source identified by its name. + * + * This function retrieves the channel names for a given source using its unique name. + * It allocates an array of strings where each entry corresponds to a channel name + * of the source. The caller is responsible for freeing the memory allocated for the + * array of channel names and the strings themselves. + * + * @param source_name The name of the source whose channel names are to be retrieved. + * @param num_channels Number of channels of the source. + * @return A pointer to an array of strings containing the channel names, or NULL if + * the source is not found or in case of an error. + */ +char** get_input_channel_names(const char *pulse_code, int num_channels) { + // Validate input parameters + if (!pulse_code) { + return NULL; // Return NULL if the source name is not provided + } + + // Retrieve the source information for the specified source name + pa_source_info *device_info = get_input_device_by_name(pulse_code); + + // Check if the source was found + if (!device_info) { + return NULL; // Return NULL if the source is not found or in case of an error + } + + char **channel_names = calloc(num_channels, sizeof(char*)); + if (!channel_names) { + free((char *)device_info->description); // Free the description if allocated + free(device_info); // Free the device_info structure + return NULL; // Return NULL if memory allocation fails + } + + // Copy the channel names into the array + for (int i = 0; i < num_channels; ++i) { + channel_names[i] = strdup(pa_channel_position_to_pretty_string(device_info->channel_map.map[i])); + if (!channel_names[i]) { + // Handle allocation failure for a channel name + while (i--) free(channel_names[i]); // Free all previously allocated names + free(channel_names); // Free the array itself + free((char *)device_info->description); // Free the description if allocated + free(device_info); // Free the device_info structure + return NULL; // Return NULL if memory allocation fails + } + } + + // Free the source_info structure and its description field + if (device_info->description) { + free((char *)device_info->description); + } + free(device_info); + + // Return the array of channel names + return channel_names; +} + +/** + * @brief Retrieve a source (input device) information by its name. + * + * This function searches for an audio source with the given name and returns its information + * if found. The caller is responsible for freeing the memory allocated for the source info + * and its description. + * + * @param source_name The name of the source to be retrieved. + * @return A pointer to a pa_source_info structure containing the source information, + * or NULL if the source is not found or in case of an error. + */ +pa_source_info *get_input_device_by_name(const char *source_name) { + if (!source_name) { + return NULL; // Handle null pointer argument + } + + // Retrieve the list of available input devices (sources) + pa_source_info **available_sources = get_available_input_devices(); + if (!available_sources) { + return NULL; // Handle error in retrieving sources + } + + pa_source_info *input_device_info = NULL; + + // Iterate over the list of sources to find the one with the matching name + for (int i = 0; available_sources[i] != NULL; ++i) { + if (strcmp(available_sources[i]->name, source_name) == 0) { + // Found the matching source, make a copy of the source_info structure + input_device_info = malloc(sizeof(pa_source_info)); + if (input_device_info) { + memcpy(input_device_info, available_sources[i], sizeof(pa_source_info)); + + // If the source has a description, also copy that string + if (available_sources[i]->description) { + input_device_info->description = strdup(available_sources[i]->description); + } + } + break; // Exit the loop after finding the matching source + } + } + + // Clean up the source information now that we're done with it + // Assuming there's a function to delete input devices similar to delete_output_devices + delete_input_devices(available_sources); + + return input_device_info; // Return the found source or NULL if not found +} + + + +/** + * @brief Retrieve a copy of the sink information for a given sink name. + * + * This function searches through the available output devices and returns a copy of the + * pa_sink_info structure for the sink that matches the provided name. It uses the + * get_available_output_devices function to obtain the list of all sinks and then + * iterates through them to find the sink with the given name. + * + * @param sink_name The name of the sink to search for. Must not be NULL. + * @return A pointer to a newly allocated pa_sink_info structure containing the sink + * information, or NULL if the sink is not found or if an error occurs. The + * caller is responsible for freeing the returned structure and its description + * field (if not NULL) when no longer needed. + * + * @note The function allocates memory for the returned pa_sink_info structure and its + * description field. It is the responsibility of the caller to free this memory + * using free(). If the sink has other dynamically allocated fields, these must + * also be freed by the caller. + * + * @warning The function returns NULL if the sink_name argument is NULL, or if the + * get_available_output_devices function fails to retrieve the sinks. + * + * Usage Example: + * @code + * pa_sink_info *sink_info = get_sink_by_name("alsa_output.pci-0000_00_1b.0.analog-stereo"); + * if (sink_info) { + * // Use the sink information + * ... + * // Free the memory allocated for the description + * if (sink_info->description) { + * free(sink_info->description); + * } + * // Free the memory allocated for the sink_info structure + * free(sink_info); + * } + * @endcode + */ +pa_sink_info *get_output_device_by_name(const char *sink_name) { + if (!sink_name) { + return NULL; // Handle null pointer argument + } + + // Retrieve the list of available output devices (sinks) + pa_sink_info **available_sinks = get_available_output_devices(); + if (!available_sinks) { + return NULL; // Handle error in retrieving sinks + } + + pa_sink_info *output_device_to_return = NULL; + + // Iterate over the list of sinks to find the one with the matching name + for (int i = 0; available_sinks[i] != NULL; ++i) { + if (strcmp(available_sinks[i]->name, sink_name) == 0) { + // Found the matching output_device, make a copy of the sink_info structure + output_device_to_return = malloc(sizeof(pa_sink_info)); + if (output_device_to_return) { + memcpy(output_device_to_return, available_sinks[i], sizeof(pa_sink_info)); + + // If the sink has a description, also copy that string + if (available_sinks[i]->description) { + output_device_to_return->description = strdup(available_sinks[i]->description); + } + } + break; // Exit the loop after finding the matching sink + } + } + + // Clean up the sink information now that we're done with it + delete_output_devices(available_sinks); + + return output_device_to_return; // Return the found sink or NULL if not found +} + +/** + * @brief Callback for handling the result of the sink information fetch operation. + * + * This callback is called by the PulseAudio library when sink information is ready to be + * retrieved, or when the iteration over sinks has finished. The function will copy the sink + * information to the provided user data structure if available, or signal the main loop to + * continue if the end of the list is reached or if an error occurs. + * + * @param c The PulseAudio context. + * @param i The sink information structure provided by PulseAudio. + * @param eol End of list indicator. If positive, indicates the end of the list; if negative, + * indicates failure to retrieve sink information. + * @param userdata User data pointer provided to the pa_context_get_sink_info_by_index function, + * expected to be a pointer to a pa_sink_info structure. + */ +static void get_output_device_by_index_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + + pa_sink_info *sink_info = userdata; + + if (eol < 0 || eol > 0 || !i) { + // Either an error occurred, or we've reached the end of the list without finding the sink + // Signal main loop to continue in case of end of list + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } + return; + } + + // Copy the sink information to the allocated structure + *sink_info = *i; // Shallow copy first + + // Now duplicate any strings + if (i->name) { + sink_info->name = strdup(i->name); + } + if (i->description) { + sink_info->description = strdup(i->description); + } + + // Signal the main loop that the data is ready + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + +/** + * @brief Retrieve the sink information for a given output device by its index. + * + * This function initiates an asynchronous operation to fetch the sink information + * for the specified device index. The operation is handled synchronously within this + * function using a threaded mainloop to wait for completion. + * + * @param index The index of the sink for which information is to be retrieved. + * @param sink_info A pointer to a pa_sink_info structure where the sink information will be stored. + * @return int Returns 1 on success or 0 if the operation fails. + * + */ +pa_sink_info* get_output_device_by_index(uint32_t index) { + if (!shared_data_1.context || !shared_data_1.mainloop) { + fprintf(stderr, "Invalid shared data context or mainloop.\n"); + return NULL; + } + + // Allocate memory for sink_info + pa_sink_info *sink_info = malloc(sizeof(pa_sink_info)); + if (!sink_info) { + fprintf(stderr, "Memory allocation for sink_info failed.\n"); + return NULL; + } + + // Start the operation to get the sink information + pa_operation *op = pa_context_get_sink_info_by_index(shared_data_1.context, index, get_output_device_by_index_cb, sink_info); + iterate(op); + + // Check if the operation was successful + if (sink_info->name == NULL) { + // The operation was not successful, free the allocated memory. + free(sink_info); + return NULL; + } + + return sink_info; // Return the allocated sink_info +} + +/** + * @brief Callback for retrieving information about a specific audio input source by index. + * + * This function is the callback used by `pa_context_get_source_info_by_index` within + * the `get_input_device_by_index` function to handle the response from PulseAudio. + * It is called by the PulseAudio main loop when the source information is available or + * when an error or end-of-list condition is signaled. + * + * @param c Pointer to the PulseAudio context, not used in this callback. + * @param i Pointer to the source information structure containing the details of the source. + * @param eol End-of-list flag that is positive if there is no more data to process, negative + * if an error occurred during the iteration. + * @param userdata User data provided when initiating the operation; expected to be a pointer + * to a `pa_source_info` structure where the source information will be stored. + * + */ +static void get_input_device_by_index_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; + + pa_source_info *source_info = userdata; + + if (eol < 0 || eol > 0 || !i) { + // Either an error occurred, or we've reached the end of the list without finding the source + if (eol != 0) { + // Signal main loop to continue + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } + return; + } + + // Copy the source information to the allocated structure + *source_info = *i; // Shallow copy first + + // Now duplicate any strings + if (i->name) { + source_info->name = strdup(i->name); + } + if (i->description) { + source_info->description = strdup(i->description); + } + + // Signal the main loop that the data is ready + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + +/** + * @brief Retrieves the information of an audio input device (source) by its index. + * + * This function attempts to allocate memory for a `pa_source_info` structure and retrieve + * the information for the specified source index using PulseAudio's API. It blocks until + * the asynchronous operation to fetch the source information is complete or an error occurs. + * + * @param index The index of the input device (source) as recognized by PulseAudio. + * @return A pointer to the allocated `pa_source_info` structure containing the source + * information, or NULL if the operation failed or the specified index was not valid. + * The caller is responsible for freeing the allocated structure and any associated + * strings when they are no longer needed. + * + */ +pa_source_info* get_input_device_by_index(uint32_t index) { + if (!shared_data_1.context || !shared_data_1.mainloop) { + fprintf(stderr, "Invalid shared data context or mainloop.\n"); + return NULL; + } + + // Allocate memory for source_info + pa_source_info *source_info = malloc(sizeof(pa_source_info)); + if (!source_info) { + fprintf(stderr, "Memory allocation for source_info failed.\n"); + return NULL; + } + + // Start the operation to get the source information + pa_operation *op = pa_context_get_source_info_by_index(shared_data_1.context, index, get_input_device_by_index_cb, source_info); + iterate(op); + + // Check if the operation was successful + if (source_info->name == NULL) { + // The operation was not successful, free the allocated memory. + free(source_info); + return NULL; + } + + return source_info; // Return the allocated source_info +} + +/** + * @brief Callback function for getting the default output device from the PulseAudio server. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the server information structure. + * @param userdata The user data passed to the callback function, which is a pointer to a char*. + */ +static void get_default_output_cb(pa_context *c, const pa_server_info *i, void *userdata) { + //fprintf(stderr, "[DEBUG, get_default_output()] Callback reached.\n"); + + (void)c; // Unused parameter + + char **default_sink_name = (char**)userdata; + + // Always signal the mainloop to unblock the iterate function, even if i is NULL + if (!i) { + fprintf(stderr, "Failed to get default sink information.\n"); + } else if (i->default_sink_name) { + // Duplicate the name string to our output variable + *default_sink_name = strdup(i->default_sink_name); + } + + // Signal the mainloop to unblock the iterate function, regardless of the outcome + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + + +/** + * @brief Retrieves the name of the default sink (output device) in the system. + * + * This function checks if PulseAudio is initialized and if not, tries to initialize it. + * Then, it queries the PulseAudio server for the default output device and waits for + * the operation to complete. + * + * @param mainloop A pointer to the mainloop structure. + * @param context A pointer to the PulseAudio context. + * @return A dynamically allocated string containing the default sink name, or NULL on error. + * The caller is responsible for freeing this string. + */ +char* get_default_output(pa_context *context) { + + //fprintf(stderr,"[DEBUG, get_default_output()] Function reached.\n"); + + // Check if PulseAudio is initialized, and if not, initialize it + if (!is_pulse_initialized()) { + if (!initialize_pulse()) { + fprintf(stderr, "Failed to initialize PulseAudio.\n"); + return NULL; + } + } + + char *default_sink_name = NULL; + + // Start the operation to get the default sink + pa_operation *op = pa_context_get_server_info(context, get_default_output_cb, &default_sink_name); + + if (op) { + // Wait for the operation to complete using the iterate function + iterate(op); // This function should handle the waiting and signaling + // pa_operation_unref(op); is called inside iterate, no need to call here + } else { + fprintf(stderr, "Failed to create the operation to get server info.\n"); + } + + return default_sink_name; // Caller must free this string +} +/** + * @brief Callback function for getting the default input device from the PulseAudio server. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the server information structure. + * @param userdata The user data passed to the callback function, which is a pointer to a char*. + */ +static void get_default_input_cb(pa_context *c, const pa_server_info *i, void *userdata) { + (void)c; // Unused parameter + + char **default_source_name = (char**)userdata; + + //fprintf(stderr, "[DEBUG, get_default_input_cb()] callback reached.\n"); + + if (!i) { + fprintf(stderr, "Failed to get default source information.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (i->default_source_name) { + // Duplicate the name string to our output variable + *default_source_name = strdup(i->default_source_name); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); // Signal to stop the loop + } +} + + +/** + * @brief Retrieves the name of the default source (input device) in the system. + * + * This function queries the PulseAudio server for all available input devices + * and iterates through them to find the one that is in the RUNNING state, + * which typically indicates that it is the default source being used by the system. + * The name of the default source is then returned. + * + * @note The caller is responsible for freeing the memory allocated for the + * returned source name using the standard free() function to avoid memory leaks. + * + * @return A pointer to a dynamically allocated string containing the name of + * the default source. If no active default source is found or in case of an error, + * NULL is returned. + */ +char* get_default_input(pa_context *context) { + + //fprintf(stderr, "[DEBUG, get_default_input()] Function reached.\n"); + + // Check if PulseAudio is initialized, and if not, initialize it + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "Failed to initialize PulseAudio.\n"); + return NULL; + } + + char *default_source_name = NULL; + + // Start the operation to get the default source + pa_operation *op = pa_context_get_server_info(context, get_default_input_cb, &default_source_name); + iterate(op); + + return default_source_name; // Caller must free this string +} + +/** + * @brief Fetches all profiles associated with a given sound card. + * + * This function queries the PulseAudio server for all profiles associated with the sound card + * specified by the card_index. It blocks until all profiles are fetched or an error occurs. + * + * @param pa_ctx A pointer to the initialized pa_context representing the connection to the PulseAudio server. + * @param card_index The index of the sound card for which to fetch profiles. + * @param num_profiles A pointer to an integer where the number of fetched profiles will be stored. + * @return A pointer to an array of pa_card_profile_info2 structures containing the profile info. + * This pointer must be freed by the caller. NULL is returned if an error occurs. + */ +void get_profiles_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + (void) userdata; + + if (eol < 0) { + fprintf(stderr, "Failed to fetch profiles.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (eol > 0) { + // All profiles have been fetched, the operation is complete + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Reallocate memory for profiles array to add new profiles + shared_data_4.profiles = realloc(shared_data_4.profiles, sizeof(pa_card_profile_info2) * (shared_data_4.num_profiles + i->n_profiles)); + + // Now copy the profiles from the PulseAudio provided array + for (unsigned int j = 0; j < i->n_profiles; ++j) { + shared_data_4.profiles[shared_data_4.num_profiles + j] = i->profiles[j]; + } + + // Update the number of profiles fetched + shared_data_4.num_profiles += i->n_profiles; +} + + + +/** + * @brief Fetches all profiles associated with a given sound card. + * + * This function queries the PulseAudio server for all profiles associated with the sound card + * specified by the card_index. It blocks until all profiles are fetched or an error occurs. + * + * @param pa_ctx A pointer to the initialized pa_context representing the connection to the PulseAudio server. + * @param card_index The index of the sound card for which to fetch profiles. + * @param num_profiles A pointer to an integer where the number of fetched profiles will be stored. + * @return A pointer to an array of pa_card_profile_info2 structures containing the profile info. + * This pointer must be freed by the caller. NULL is returned if an error occurs. + */ +pa_card_profile_info *get_profiles(pa_context *pa_ctx, uint32_t card_index) { + // Reset the static global variable before use + free(shared_data_4.profiles); + shared_data_4.profiles = NULL; + shared_data_4.num_profiles = 0; + + // Start the operation to fetch the profiles + pa_operation *op = pa_context_get_card_info_by_index(pa_ctx, card_index, get_profiles_cb, NULL); + + // Wait for the operation to complete + iterate(op); + + return shared_data_4.profiles; // Return the static global profiles array +} + +/** + * Callback function for retrieving the mute status of a sink. + * + * This callback is provided to the PulseAudio context as part of a request + * to obtain information about a particular sink. It will be called by the + * PulseAudio main loop when the sink information is available. The end of list + * (eol) parameter indicates whether the data received is the last in the list. + * + * @param c A pointer to the PulseAudio context. + * @param i A pointer to the sink information structure. + * @param eol An end-of-list flag that is positive if there is no more data to process. + * @param userdata A pointer to user data, expected to be a pointer to an integer that + * will be set to the mute status of the sink. + * + * @note The function sets the integer pointed to by `userdata` to the mute state + * of the sink. The mute state is non-zero when the sink is muted and zero + * when it is not muted. This function is not intended to be called directly + * by the user but as a callback from the PulseAudio API when + * pa_context_get_sink_info_by_name() is called. + */ +static void get_muted_output_status_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + + //fprintf(stderr, "[DEBUG, get_muted_output_status_cb]: inside callback.\n"); + + // If eol is set to a positive number, you're at the end of the list + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + //fprintf(stderr, "[DEBUG, get_muted_output_status_cb]: leaving callback.\n"); + return; + } + + // If eol is negative, an error occurred + if (eol < 0) { + int err = pa_context_errno(c); // Retrieve the error number from the context + fprintf(stderr, "[ERROR, get_muted_output_status_cb]: Error occurred during iteration - %s\n", pa_strerror(err)); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Cast the userdata to a boolean pointer + int *is_muted = (int *)userdata; + + // If the sink information is valid, set is_muted to the sink's mute state + if (i) { + *is_muted = i->mute; + } +} + + + +/** + * Queries the mute status of a specified output sink. + * + * This function initiates an asynchronous operation to retrieve the mute status + * of the sink specified by `sink_name`. It requires a valid `pulseaudio_manager` + * instance that has been previously initialized with a mainloop and context. + * The function blocks until the operation is complete or an error occurs. + * + * @param self A pointer to the initialized `pulseaudio_manager` instance. + * @param sink_name The name of the sink whose mute status is being queried. + * + * @return Returns 1 if the sink is muted, 0 if not muted, and -1 if an error + * occurred or the sink was not found. In the case of an error, an + * appropriate message will be printed to standard error. + * + * @note The function uses `iterate` to block and process the mainloop until + * the operation is complete. It is assumed that `iterate` and + * `get_muted_output_status_cb` are implemented elsewhere and are + * responsible for iterating the mainloop and handling the callback + * from the sink information operation, respectively. + */ +int get_muted_output_status(const char *sink_name) { + + //fprintf(stderr,"[DEBUG, get_muted_output_status()] sink_name is %s\n", sink_name); + + if (!shared_data_1.mainloop || !shared_data_1.context || !sink_name) { + fprintf(stderr, "Invalid arguments provided.\n"); + return -1; + } + + pa_operation *op = NULL; + int is_muted = -1; // Default to -1 in case of error or sink not found + + // Start a PulseAudio operation to get information about the sink + op = pa_context_get_sink_info_by_name(shared_data_1.context, sink_name, get_muted_output_status_cb, &is_muted); + iterate(op); + + // -1 will be returned if the sink was not found or another error occurred + return is_muted; +} + +/** + * @brief Callback function for retrieving the mute status of an audio input source. + * + * This callback is invoked by the PulseAudio main loop when the source information + * becomes available. It is used as part of an asynchronous operation initiated by + * `get_muted_input_status` to obtain the mute status of a specified audio source. + * The `eol` parameter indicates if the data received is the last in the list or if + * an error has occurred during the iteration. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the source information structure containing details of the source. + * @param eol End-of-list flag that is positive if there is no more data to process, + * negative if an error occurred during the iteration. + * @param userdata User data provided when initiating the operation; expected to be a + * pointer to an integer that will be set to the mute status of the source. + * + */ +static void get_muted_input_status_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + //fprintf(stderr, "[DEBUG, get_muted_input_status_cb]: inside callback.\n"); + + // If eol is set to a positive number, you're at the end of the list + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + //fprintf(stderr, "[DEBUG, get_muted_input_status_cb]: leaving callback.\n"); + return; + } + + // If eol is negative, an error occurred + if (eol < 0) { + int err = pa_context_errno(c); // Retrieve the error number from the context + fprintf(stderr, "[ERROR, get_muted_input_status_cb]: Error occurred during iteration - %s\n", pa_strerror(err)); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Cast the userdata to a boolean pointer + int *is_muted = (int *)userdata; + + // If the source information is valid, set is_muted to the source's mute state + if (i) { + *is_muted = i->mute; + } +} + + +/** + * @brief Queries the mute status of a specified audio input (source). + * + * This function initiates an asynchronous operation to retrieve the mute status + * of the source specified by `source_name`. It requires a valid PulseAudio mainloop + * and context to have been previously initialized and stored in shared_data_1. + * The function blocks until the operation is complete or an error occurs. + * + * @param source_name The name of the source whose mute status is being queried. + * This should be the exact name as recognized by PulseAudio. + * + * @return int Returns 1 if the source is muted, 0 if not muted, and -1 if an error + * occurred or the source was not found. In the case of an error, an + * appropriate message will be printed to standard error. + * + */ +int get_muted_input_status(const char *source_name) { + //fprintf(stderr,"[DEBUG, get_muted_input_status()] source_name is %s\n", source_name); + + if (!shared_data_1.mainloop || !shared_data_1.context || !source_name) { + fprintf(stderr, "Invalid arguments provided.\n"); + return -1; + } + + pa_operation *op = NULL; + int is_muted = -1; // Default to -1 in case of error or source not found + + // Start a PulseAudio operation to get information about the source + op = pa_context_get_source_info_by_name(shared_data_1.context, source_name, get_muted_input_status_cb, &is_muted); + iterate(op); + + // -1 will be returned if the source was not found or another error occurred + return is_muted; +} diff --git a/v-0.09/system_query.h b/v-0.09/system_query.h new file mode 100644 index 0000000..300bd0c --- /dev/null +++ b/v-0.09/system_query.h @@ -0,0 +1,88 @@ +//Header definition files to query about sound card properties (number of sinks, profiles...) +#ifndef SYSTEM_QUERY_H +#define SYSTEM_QUERY_H + +#include +#include +#include +#include + +//Structures to get source port information (e.g, line in, microphone...) +//Used by get_source_port_info, get_active_port, and get_source_ports. +typedef struct pa_port_info { + char *name; // Port name + char *description; // Port description + bool is_active; // Is this the active port +} pa_port_info; + +typedef struct pa_source_info_list { + pa_port_info *ports; // Array of ports + int num_ports; // Number of ports + bool done; // Indicates if the callback has been called +} pa_source_info_list; + +void print_proplist(const pa_proplist *p); // Utility function to print all properties in the proplist +uint32_t get_output_device_count(void); //Gets the number of output devices in the system. +uint32_t get_input_device_count(void); //Gets the number of input devices in the system. +uint32_t get_profile_count(uint32_t card_index); //Gets the number of profiles for a given soundcard. +pa_sink_info **get_available_output_devices(); //Gets the total available sinks (output devices) for this system. +pa_source_info **get_available_input_devices(); //Gets the total available sources (input devices) for this system. + +char* get_alsa_input_name(const char *source_name); //Gets the corresponding alsa name of a pulseaudio source (input device). +char* get_alsa_output_name(const char *sink_name); //Gets the corresponding alsa name of a pulseaudio sink (output device). + +pa_source_info *get_input_device_by_name(const char *source_name); //Gets alsa name of a pulseaudio source (input device) by its name. + +pa_sink_info* get_output_device_by_index(uint32_t index); //Gets alsa name of a pulseaudio sink (output device) by its index. +pa_source_info* get_input_device_by_index(uint32_t index); //Gets alsa name of a pulseaudio source (output device) by its index. + +pa_source_info_list* get_source_port_info(); //Returns which ports in the source are available (mic, line in...). + + +char** get_input_channel_names(const char *pulse_id, +int num_channels); //Returns the channel names of an input device. +char** get_output_channel_names(const char *pulse_id, +int num_channels); //Returns the channel names of an output device. + +int get_min_input_channels(const char *alsa_id, +const pa_source_info *source_info); //Gets the maximum output channels an ALSA card supports. + +int get_max_input_channels(const char *alsa_id, +const pa_source_info *source_info); //Gets the maximum output channels an ALSA card supports. + +int get_max_output_channels(const char *alsa_id, +const pa_sink_info *sink_info); //Gets the maximum output channels an ALSA card supports. + +int get_min_output_channels(const char *alsa_id, +const pa_sink_info *sink_info); //Gets the maximum output channels an ALSA card supports. + +char* get_alsa_input_id(const char *source_name); //Gets the alsa input id based on the pulseaudio channel name. + +char* get_alsa_output_id(const char *sink_name); //Gets the alsa output id based on the pulseaudio channel name. + +int get_output_sample_rate(const char *alsa_id, +const pa_sink_info *sink_info); //Gets the sample rate of a pulseaudio sink (output device). + +int get_input_sample_rate(const char *alsa_id, +pa_source_info *source_info); //Gets the sample rate of a pulseaudio source (input device). + +pa_sink_info *get_output_device_by_name(const char *sink_name); //Gets output device by name. + +void delete_output_devices(pa_sink_info **sinks); //Releases memory for allocated output devices. +void delete_input_devices(pa_source_info **sources); //Releases memory for allocated input devices. +pa_volume_t get_channel_volume(const pa_sink_info *sink_info, +unsigned int channel_index); //Retrieves the volume of a given channel. + +char* get_default_output(pa_context *context); //Gets default output device (default sink). + +char* get_default_input(pa_context *context); //Gets default input device (default source). + +pa_card_profile_info *get_profiles(pa_context *pa_ctx, +uint32_t card_index); //Gets pulseaudio profiles. + +int get_muted_output_status(const char *sink_name); //Queries whether a given audio output (sink) is muted or not. + +int get_muted_input_status(const char *source_name); //Queries whether a given audio input (source) is muted or not. + + +#endif From 2ef69ae5065600e98a7d30d43313becdfb8b39d2 Mon Sep 17 00:00:00 2001 From: NMagic Date: Fri, 10 Nov 2023 09:00:41 -0300 Subject: [PATCH 13/20] Improved muting functionality Added functionality to mute input and output devices. --- v-0.09/examples/alsa-mapper_pulseaudio-api | Bin 99192 -> 99192 bytes v-0.09/examples/change-speaker-mode | Bin 93048 -> 93048 bytes .../examples/get-card-profiles-pulseaudio_api | Bin 96640 -> 96640 bytes v-0.09/examples/mute_input_demo | Bin 95280 -> 95280 bytes v-0.09/examples/mute_input_demo.c | 4 ++-- v-0.09/examples/mute_output_demo | Bin 95280 -> 95280 bytes v-0.09/examples/mute_output_demo.c | 6 +++--- v-0.09/examples/print-input-sources | Bin 96440 -> 96440 bytes v-0.09/examples/print_volume_output_devices | Bin 95952 -> 95952 bytes v-0.09/examples/switch-sink | Bin 93128 -> 93128 bytes v-0.09/examples/switch-sink-pulseaudio | Bin 98248 -> 98248 bytes v-0.09/examples/volume-change | Bin 95112 -> 95112 bytes v-0.09/examples/volume-change-pulseaudio | Bin 98088 -> 98088 bytes v-0.09/system_query.c | 1 + 14 files changed, 6 insertions(+), 5 deletions(-) diff --git a/v-0.09/examples/alsa-mapper_pulseaudio-api b/v-0.09/examples/alsa-mapper_pulseaudio-api index d9b8eb4bac3d581c7d5a8f66d0edb153ca1b152c..66b32de9151025cf984fa119b33f09fb36627212 100755 GIT binary patch delta 4357 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 RvxIkM;KvW;WZ~wO{{wW#S2q9v delta 4357 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 U%inu}!`stv$$LXGapQ{r0SZG}z5oCK diff --git a/v-0.09/examples/change-speaker-mode b/v-0.09/examples/change-speaker-mode index ab10a14cef761dba172240918cdc3d9420374738..8d772032346e9e5201cf4a84e15f460dcfaf485d 100755 GIT binary patch delta 4214 zcmY*ceNa@_6+iFY_X%5ImrvJ4_944~QN%z50r}7>rXa3gkvjMRg%qtRYE4>a8di-? zWB;K$x0+7EjFq-CovIy!O^k_&PMWGMF=LadR;mU+P=gB6k2INf(w_V7d%N$wKlZ)* z-o5AdJLmq+xo5w)EPruXKK?Sv*#07U$9uh|yejwiQ)>S8>wkJkJ zl9`eG4E79CC;kf4Q$ELM4M-1;$N>*7OU}dh1*8#QXtyq5x-$-lN z#2Hf;p^G4`%!}ga34N1kPWQ8KGsyv*S3Z?Jm!z>ZIw_4?nWH65!G)LE*C(^sv&E^5 zbCSZ0ZMiw{07=CO7A;V{PC~%>_uNfgAqnWW9`Sj2LUxHbJu9`~acESVZgU*@DBB z%r7z4tbQQk0)73EIjlGBO{3dxHxT-(f&l74 ziOnc>u$<6bEFWtLmWT5J2I(ZS9MsAaEC;owPjJU~C(A)?os;Exy7<#P-&xJU zQbi(t^!uM0(LSxzGOK=GgfF!QCJQmPiiPi>O{^P&=~Dr^G`f{LGZUrGE}?&~fhzhI ze#%eK>(b_J@FnPVY4uKeU0RbxFRhklkNA8$wd@A8CC0X301si97t`tyqhzrb;wG0U zCkg=~nkjqSCPrHB1&mi%9`r{G*{Cuq>!6IL4d?VFlVeVbN7U8hmTuAd|rn9fz zkdlM31dZMt36_8swm~z303H`;ssr@&G=LF0`=-BUM4g=g9Z{D!K}Xc(HYhVUswO~Z zBkT9*zMDq$J++(%y-lgm0sf$7GRcdvjm*&xRZAS*;N6LsRIR`;vFp$LhI_DQy155b zotq#+)n!g0Q}r3=9#FO2mPkbgVji?HF&ZjvT{oR~%ZPTXWj3)oRBex%&WeRa>;(t0 zH!zv%)IFOyqXe@M*GoLm($it+=>D^bjJvW z6th%fSyP@vm%@r&PQXiWtWeLWzgkfoRZdY{RZdY{RZdajRc;-EB+>TK4B;>Ih0$Q^ zsGLw^M+obM{Phid)5p;@b_xAIz+}aW&?i?~nS^DvPhQT|SZ|iqKDm{9dpc_7W*;3N z4dx$~)2anCVU;6Ttq0^(E`?Trx#!WS&_he_8o?g9oC~O1-GDjNBR4l7t{Cft(0{Q= zHPLN%jnrn@KLtNpT3tmC-^~?T>6yEk&s55t>rAHbM}9-f12`2aSIUkeRw-9I6R1*N zz$n`%L8ZLZ)@f51po-48mm6)6eSA(QK=5Ns)&hA4s*hcd`3!_nfdj7ruPMbO zsg(tr#EO32t6V`nWlLV3sTX>cNHI2M_V`k-;>U52_I(xjvOdjYQTYg; z*(LOEMk;DQ7LRKrwG;nWXN@B`Es^KTd+=AmZsA0UlPDslb;q{YR5 zfP9nlNBUKGjQp0k>Az`@E&3j z|BdO>z{5Gblm!vsLw>_>dS+SSY#@d09lUun3AQ*0K8L~%kyL9jgJqY{{}L|7WDgO$ z^FdXF$kWaQ43UVFb%^Q@^L%9_lW$!&hA0ag@iAKU&}bVI?Ox7Iv@y}tm+2uU+5^#* zXb;7Bq6HLyN1`jy#>GUU?Z(fi=t%@PI@J<3Cngwv$4e+i5;Gf9=yJ`6& zqiwesFBL44cZ;UNY!CLh0bX(g>~#a|a{xR-4_fH!2+-mNXmJB9a|1*Y04zky-2f{b z0F~I?70{A#JOM@b2`DB`z@OqNMQG2sznh4T4w{Hf&K8x3t`3@r@eZ1ufU21Kc9^La z``~q$8@Gh6gl<=> z45gwMuh1w*9s^yq|tX@@W`ajbR-5v!`3wX8!}!(>Zh z*0I_lbTHXtt%xe@Pv5hGu4-TS1OQ31ixeFua^&Hx95W@knPgf(^@$Yh{-HnVOB-^XZuMK3&_nJx%{ z^>`eZe+(*yvFZ!&Q*|=ryO(%9?^Wa^{EF62&hh>x@j84Cs|%&OCZ{}0XIRCliv5EV zXc-5NsBmh<*6->HME$YtA&xk+n&ueT-NSRPV=D zMX06!o6MSDTl80~TKM17v|X2MA=P}RYbOZxW*x>8H|@)L-1=GzBk delta 4214 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 P&!-3rJ`57!`Hues;Xq35 diff --git a/v-0.09/examples/get-card-profiles-pulseaudio_api b/v-0.09/examples/get-card-profiles-pulseaudio_api index 1f0a26dfa2d973dc85ceb0d3b1acf456d4ea7bd4..fa948d715452185dd0f12928ae82942ab0f1d2ce 100755 GIT binary patch delta 4374 zcmY*ceNYwG6+gRo_wGI*@Bk5fpu7bhA4*VzANUbIY!n>u0Roj6j6lSB5EIm@GfroC zYGbC(B*izkns#JbL#C6|X;O=c(ZnV+PHh}plNp;ywAxXpu?l`*{fIIQCeSZ2Ty!DXvQENq> zBltww$tOF^7Q|xwhW#eLA$?Yi-;iE=1_NmG8`76M`3>o- zT>SpRPG8GT8P*;AW~0%5_P=XJNxweBva2N`>3+S6%S4Veb9e5w>4w1HlnKzqf+N1? zy7ZhFl`ehW>XaCjF1^x8rAx21sCZx6Bz6`O7f9%Vt$KQu3APShwgWx8gdHC-!b|jk zuwO$j6#z8oru;E7oKllbsU4EPE(FNYf4osx{H0}B8Yn_nVn}oJk{Hh%z4`-0K$n>@ z%+VVJF@X`#6Vg)o+YltupG`nZI_nx*pbNa0c*x}I&m zVFVMj*;Y2uNvPHo&8%=3HhL20q}yxSy>FwW`0s(ZKteb8v_yf|hH7i}0}Qi&p~+!7 z$2NH%gLQ(M1&W*ey#a8F+J5#v`=YSrFnO9fOwLEy>|#wfjn%toF*ivfN5WbQ8rek` za%2*DKTJQs@ow8_1APV;y+N&rw|Y~11jZNQ!fF57#;8Nug(%@5JA)WO`lJgZNEf&; zTBsErfzcMjc+JW{2S%3@<5LW39&5T~gagzp$yh$=K6Fh!wTl-d&%`mMht~?8c1}wJ zALW~=N2#NlQtGOvl)9=ZrO|475|QI*61TxKF`jU_1qx7*U$Mux{K?;{F`4fU@Cr74 z%=cu!T4v=aR_=baQOLZ~tla%-tMJOPu$lJ#Y|EHG=S|hSK;jq;bQJ6NpqeC<*9tJ_ z9#$NwmmL{1{JrWdq1TZ1I_6=oT33a9L{LN>H=p{mZ^(`LPeh`Q!cImcnWuBTFOTavJp%X4o{ecrMPYpWZ3T(J`Dr4!NuBIxu6SG2I zmjTYQmj4*xvx?n)HJ-F*mBqqim9!YE(>cYv6wf$VxoH*p=pTyjE%XDrimpXd=am%U z&xVAqjT_;DV)epiNNmH`8x)nZJB~r&zx701r2+3$0F9rEHYh6#tkl(b)!Lv`ikc|U zH@eY(OW zv(jVk_n{o)lqK9DByzCN)MK2ojBkoWe%EK}F-~daJ|~g=eKZ|4m98Xyqux ziN$8d4id9jTD%8IHCIZM_aF(ncn^|i1@GsOct3{vJ>n*Q*dANNKeWf+^m%tS3v64x zGzW9}Q<4}zjU!&{!#cMfL+}b~xo3o5A(p~g>28$a&gcdq`K?@l4)Rr_uy#dU@I-e? z?5Kmxj7h(P)Hr)j2dU@#u}^dzWTh>A9))f}mJ2nFpT=Ld$JmPkm|9gV?!Mu#B9{6D zv!H|7K2&>v)!z3N2Z(*VLNx@)QfK}JNQ09^fJN?Shf7JCh-V1ha1-4yBAa>ePEhP` zZ!~aFV&%bzY#%YrBpi`V&B+mw2BWeo39rl1BrL^@y&=1j@TOOeW#I%J;3%v3&S*R8 zMmXw5_{fd$aSY)AcEMwAgg-g}da(IzXU7m=yBw_}Jd?M}ru^(J>~I78#0~I@8(^mc zU_XAa1lha?MqAJg5Of37y8#+v0Nh87Zh++ufcG#OdF=25?3J>+SIV(o`5DTa$oTd2%TW>jAzX_Ax+~Sg;e}ml}_lJKWMa#-4 zp6&KY)?U{@@=JbzPU*-Z%T!dIZ8OcybxQMM&AC%*u-b!J3_GP2qNrHSxl`&CMde_a z@=w;alC?d(6%zl8d05W&eQ!)JmjdD#T1O?^R)tMQ98xN6s#uj@$F7;hM!)yfW=W1u zfh=jU)5lp-oih!yq!o58;O4V!5+TTkB7n!N;bC#ABxOC1O;C=k1DLC09g;p{{SN~v z|BgML_c@|VzhNgH&RlUI_BfwnfnnX{!e2F(>!pFDQhEA0sVA7E2c&;S4c delta 4374 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 CY&zlq delta 17085 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 A@Bjb+ diff --git a/v-0.09/examples/mute_input_demo.c b/v-0.09/examples/mute_input_demo.c index 9cd212b..096ffe8 100644 --- a/v-0.09/examples/mute_input_demo.c +++ b/v-0.09/examples/mute_input_demo.c @@ -46,7 +46,7 @@ int main() { for (uint32_t i = 0; i < manager->input_count; i++) { const char *device_name = manager->inputs[i].name; int is_muted = get_muted_input_status(manager->inputs[i].code); - printf("%d: %s (muted: %s)\n", (i+1), device_name, is_muted == 1 ? "yes" : "no"); + printf("%d: %s (muted: %s)\n", (i+1), device_name, is_muted == true ? "yes" : "no"); } // Ask the user for the device index to toggle mute state @@ -59,7 +59,7 @@ int main() { } // Check if the index is within range - if (index > manager->input_count) { + if ((index - 1) > manager->input_count) { fprintf(stderr, "Index out of range.\n"); manager_cleanup(manager); return 1; diff --git a/v-0.09/examples/mute_output_demo b/v-0.09/examples/mute_output_demo index 961f02e193e46d1c08773812425e505bfe0ecdd0..51c733a9aae004c79d3e7b1734872fe9893e5a2c 100755 GIT binary patch delta 16939 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⩔DI$z297+v;M|8 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 diff --git a/v-0.09/examples/mute_output_demo.c b/v-0.09/examples/mute_output_demo.c index 044e2cd..e6b2066 100644 --- a/v-0.09/examples/mute_output_demo.c +++ b/v-0.09/examples/mute_output_demo.c @@ -46,7 +46,7 @@ int main() { for (uint32_t i = 0; i < manager->output_count; i++) { const char *device_name = manager->outputs[i].name; int is_muted = get_muted_output_status(manager->outputs[i].code); - printf("%d: %s (muted: %s)\n", (i+1), device_name, is_muted == 1 ? "yes" : "no"); + printf("%d: %s (muted: %s)\n", (i+1), device_name, is_muted == true ? "yes" : "no"); } // Ask the user for the device index to toggle mute state @@ -59,7 +59,7 @@ int main() { } // Check if the index is within range - if (index >= manager->output_count) { + if ((index - 1) >= manager->output_count) { fprintf(stderr, "Index out of range.\n"); manager_cleanup(manager); return 1; @@ -75,7 +75,7 @@ int main() { // Toggle the mute state of the selected sink int new_mute_state = !current_mute_state; - if (manager_toggle_output_mute(manager, (index-1), new_mute_state) != 0) { + if (manager_toggle_output_mute(manager, (index - 1), new_mute_state) != 0) { fprintf(stderr, "Failed to toggle the mute state.\n"); manager_cleanup(manager); return 1; diff --git a/v-0.09/examples/print-input-sources b/v-0.09/examples/print-input-sources index ed4a86ea1c9fb6ef7f2211834f57a9225a529817..b5b9fac543c0067ff97e1e77664a35c1ecba3ee2 100755 GIT binary patch delta 4225 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 RLr+enbG3h5>*iL){ttzbRI>m8 diff --git a/v-0.09/examples/print_volume_output_devices b/v-0.09/examples/print_volume_output_devices index 1036400d4076e724ddf124f9ba97482eb91f6dab..b392cdb64234d1c19449ca48171a06b4019271f4 100755 GIT binary patch delta 4214 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 CYG0`U delta 4214 zcmZ8kdvH|M9X|JcZ-SfM&67=H_L2vn5Ce&cmq>!<^R4-aRbzVqV!Qc0be0)@VXW+)9a>G#Lxif_OVCgWX%4W}BSE zO2)R-7)&BU3ML2#Js_oGMVau0VQ!~oE`4Ikz>G^bB(9w1T-A%qwP~&JG9OzoX-g-m z(NcrPC?cPLd**5eOFq^@d=0sTB+-pm1C>cyDGLlAYgRXqB&~iJP<$+`wr|;l;WD-_ zK31>XM|6|4wVxQnkYO*Ep1PXn&(Iz)=d=;xxdiH8(=jmlTAl7-GOD_m+)xutE>0oj zFb!P`R328#5=;)Oi~o(N*h~(qOPx#(t81K0&d}a#dH$2CgGn8n)lJV_)1%#LiDgzv z2EA^zmW7^=EoUz3wTX3*;F4@Y+SHoo@D|q$&iv>4cI(KLpW)S%1idzO&N_dBUYi3xsS|QkhIx#D4A| zHjXl?QD#2#|HR4*3}Q7(MS@t3(&)_S8fAr(Sd9{~iH)ZLv)0B0u`yUnrd7jwUb6D2 zRaJ5Za@nUCnucJ?pJPr2-7%c&pR9OH!!5|QHaPzz-H)Xw<#Kze47Z(@4e4P^Pa?lR zro&izR(34?36f(E4P4ht_Q*5XQXzIUsRX(2 z#mYm_>3%82Ooe7b%4aKR2AgSgR1a>J%FG1nP+ma|ZI8m%Aq9Ms|E^7n47o9O*%3EjR-i*VuoCbWpl%FV@ ze5uL_pD+E`37;=DI^m0K_=rrP=EYK~i0vZD72^3b0yRi;Zt5+AqTMAGR^EeRo$1$* zoDTi@T=Xu)Sp+I9*T5ZLh=D)ATX3jc2gSc2`c1EgC$(?gO8z5SooqSrRN{3feFFfU z;#8~F6eet)V#pLW6X01lz*aZFb8dib4uFj^A@gX)m>!)c7MTD>rI z8$sjPrz4NWmsglBzK$$o7uT2ku;FP!?5oJBbz0=I`?SvxRgsIvw!B zV<>_ly7xQ1Wr(-Waz?!j@kW{$n}CPET!%N6fDu1uH z9CZU6bpyQT1~`@gxDSf&y8(_n0Jfp_chX$|*vZE$o)zRy-bf;Q2fuIwyyOPhQ<8{GCA-S(Rj_L+ymZu?6d_IIFO^XZGX(du}2tK$=`?q6s}JUwwc z(82SL12oSscAijq-gSWH`S<~vwK|zkIR^D+r^4WGk^PrB?>sY^elY)#R2xbNQP@|@ zWg5DZ>%YcXO=S}V{Va|Lr|FhEIoxUbDqeovh^B$|4uOY8!le&LpV9T$yu9f zBfb}5xRw5JClGDr<|O)OD;Ku3*-)fbZlzi6R{w0}eri_xp{UHh>)JVMAI-$$!=bU7 zOJWDP7no$@de8jBW)954X4vOIHCJdJ_3GtxEU4k4E=SL`8AD5d2M=X)w?d|oy>VN< z*+#WxbB;rJHdp8Lel}O{thQ`!Wn2aT`k>9agB0BpQPcNm=G_^ogv(iro@IPARAfPJ zxWCaS?iTv5CLYfj1Sjro`pdhse1A$jE)pRwJ@lVStBbar8PqwuMyw9Y|a?ZJfxc zuAVlC&EVV9uw9dEAysW`f1Yr24H-sL^}bzYT3>B}WDR3g?Lhy;Kq^=D?g|h0LdX9A DhazDK diff --git a/v-0.09/examples/switch-sink b/v-0.09/examples/switch-sink index 656abc863f256636a164a223d1d42d8f2bb25476..d849c0d00dba50e81203ee4c9afe6aa83fc2d32a 100755 GIT binary patch delta 4272 zcmY*cdr%eE8UJ?A?%7=+aPLI~FCcf3dx3?BN6=`?@D+Ho{iO>JT`qoJWqA2vY~gG9v#zMYPpX*!*LXV31vyZgtz z=bSy~`~AN6*}-9Ta9BP38kulO9$wgAIc4tNSr5twb6@>ySNHQ*kM@(CbFmEL>udn! zk^~_6a`_mPEqaCP zp^BiaDAU3m;3k`gG@_EnXacy!h>J%w@*#vW1CZj;G{%2 z+Zom*4M+xVAcxYC)Tel2=Fx)l5|w5%bHps4ZIra4P33rfT4xtj8<`<%)DCVdm68V$ElupE!-?VVe3x`JyV#~ZW=!2`zHA!}M= z$(zj1j1&a2jmN~E4FKswNc0+eG-AfC>7_0v_jC`F`+AbefkJ>IdSnL*#^*ip2U7p( z5PD-hzM7GwcSK)u4jtprJEA}9rgubNlc1-dzMrtSE)@h$>n?s83hiS#xQ?g z6@TcD&(Kfkk5O%ElF6u6?`ATpEq9o3j4>_AM4gJde8?_*W5zzzW(ZR^(>(^j87+$k zv>b2Y>i=1@1EmA}-N=M#v(b3``MdZ-CcCCsOqez+$%JXk+=0uq=iTmLTB{QodnO>} zn+_)0s0h8-!G3btEbq`N9AXC)fKDxwmjavE4_(BLVe(Y7itIL!{@(bII6b94}0b(UI%gdg2$0t~VHc=R*sI(j7)pqCX~HK+B`GJcfAPsFrh z+}um&aRd^7KSuZB{Abj5QIy`nL;G3R)%?Iaj;scx(JccsvUgBcBYn~%tC3cDWIac1 zs|s1o>^{nBcgtFVMlWIoV`eB!t&)cYi*7@eBGf4&;3qhztYs`1rPNiwDD~7YNs&Ks70xAd;^64irEYs8*E*;}Rl0ThW9pi*^}!AiBtop+V$ z0<^*;L>3*RQe7&vs-a8J)N@(S_547s8sMhloFViNO!6Xj=z4H>Bq=@s+y@d6|hACxWLRCX7dHbX^k4szYEGDVaFOejIr>g;(G?K z8(4&CCaU?B68sfPLIY9-eQ;3;2rEa^+IQ@LuNAv}t%UUd7y#SZFA!k6Qfw!n#_QU4 zrAE{>0kFdh@B=Tvi(Y`2TmYHaH|kjKO|!gCi3k9zQPe9=h|;x~3@a78i(ubq!<tNoD`r!aCK0p0?4iRLOxcQG!Q6cFzCJBF}{)uH){0$JR7uq@vkUAbH37rN=qerI!@?D`*2`V)g8_jQt zSE=7Qb6ct7?Cy9d^COa;`UDp{+Joh70Apb{GjEx(-NcTfCK^Qx?MY|>{+F;VwUT!m z1>I}n4`~kx+O1@IGQ3+!y}MPkl4YEtR;5%31*EhX4^2L!z5#=pu|P}0PYz)m?)BX|n$l&#ouG}z?@ zc*P5_+Y7MA1yH5&?x@~1V~t*bMlZlJFF-U2z)iH=3-GK9;752JERs`r6C3=Fyu^L=C9>xhPUOTb zoP%m|qREEVD40i=S;@V;rI)2L{+)yM*7x#40d~#?#h!FSvU}22EHb+>de2Im7l_y2 z+PkFwV@OR)#e6u+;`j0cL#{L7WoVH7?DV}*=;uupk-s3(VGlz%sFlx+Q)ApINy%x5p$H)Hdqu((P# z&|zGxc2LDdrpDofwR&9yAWy2BFVyNyXy<>*GJKxoy7=cwi`<6KlNvZRr)uO$tDLHl z#X$=kW*rc@fj0af%X?6kDM@*2Wqt@vJNrv)9MZ?^dk?~a>&fLgZy_h?*X;EN(^tKh zT#lT@TEym735xXzrWq9g#p{7RZkM;Y{8Le46@pAOC+q{*m*ap&3a~jXXTgWT70aiH zuhXWStp>pAlvCFCR3}vR;(bV(PyabbV7#AzD(-^$CFil^;RmiIw>s5EnYX3A8>AYx X_u*t|!O?dge&v&%KE8`ci#z@g<`X`q delta 4272 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 YrmsF6Co~;<`{4zTF!SA=M3~q4e{bPHN&o-= diff --git a/v-0.09/examples/switch-sink-pulseaudio b/v-0.09/examples/switch-sink-pulseaudio index ca1e053be5410696ac4d34a9adfdfb0859816098..c9629d9d687c11f8715b50d584141baedba89094 100755 GIT binary patch delta 4276 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 fzRF)I8B%xbQCj}l8FK*BaE;y64+Es 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 V!>YLlj(-tM7pmUBktFQy_&>0_T*v?b delta 4214 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 W0#?mG@cx~`bguUI7m~RC_WuKiH(QSY diff --git a/v-0.09/examples/volume-change-pulseaudio b/v-0.09/examples/volume-change-pulseaudio index c8462185d1961b71212ff23b5745cc6216b2dada..1a0e992ec054f2bb2203085af615c35db460e741 100755 GIT binary patch delta 4396 zcmY*cdr(x@89(=)`vhEe7Z-2=*}Jd^iiiOfAIM@y!4cLqzNk_IL>w?qP=i+c2U`u9 z#7w7T=L|8OFeat#j7_6sQDZcksGZtaUrlX0)tZDPjm`MNCyAP1zjM#Md+)t7a31%b z@B4kP-*&v-Y$z)0Iq~k*^QZUs;ZtA4Qq@m05E2SF zggAE=og?AW3%V_=cz8iu)oa0l$+UI3`>$%XxVTmu`KdtqLX(Fs!(|2!eBNPQo6gopIQ z@mX^{RN8~w7_26!?YcPiD1BFqd*QqCV{~5Pre{} z=%r}O^+gK8sqg{b;{s6Y;KUSsSr_-3Atr(arazXfmeIiQ@dl+GC98GUK@}g5Dy<#sV7Zvu z#mDR9^AO!+b=4Vt8P?^ERg<>+>DxB<%AdkMJW)2Fl-7+KQHDB-onDQQYX-#esv^>j z*3ImzV{{;gZn|Pul_DGLA;kgvwqn5!<{>noe6WcLc!v#$>pLERU_J}4$}L+4lm!ph&mKN(#N)5SkYY}WJ)iitf_!8>n z*G;%>C~ztZ%u@Fdh7eoG7P${uc z1eKbDsX7Wh#6cy>)G~1)CB>IU-?kxFbvme5WLk;xM)(KMWj26;TY|7l>l`TsCZ6{K z2&Fjiq*6S3OaRa-D33uh`L=)7pghR}G$_~F0S(HFOh8oL*Rlm@7ufqDdHJ>$`%o@t z0cn)x_z?QD?4wn~$D61V&dNqQwINRy=p^#l4u<;^HURwXkXMjDM4oB^A@V|dEf9H` zJw8NkHuGoBXwdn(sS`YP0;sHw%)FzOw8>>Aus`q!b;xOyZwz3YZNQd~MW~9rddI(@ zN}gt6sFEZ09Ild=+A&ngO(q5^eU2#|Ae4u|_hjgfmYX6^F=|U%4=Lc4bsB_-O4;yD z2AOm>$Lp6}Ol~9O*2m!H<7CxcE%&%I)jT>M9CS+3*@_3!kE;xE#vK^6pxVl zds=Bkn&^-fk!Ct%EtL$fGFgpe7szV0%c_KI$S3FSX@QWW^D1zlbPHejE)-3~ZllW(WVp1`t4ZNzVguVx8!xb0fKzB+PXe8%oz0XHwcx13B@)x2!^Z*u?fu zC&cxG2&lvg(Z-Y&;!JxbR)}+`3(T%mA=aB!a29+&gA@!5`>NA`$>YIFou3^il>rf2+_~2p?0FPx6w;Ci29(pNZ1@a67IX4scBmatKJlV?cW?XA;9?f_m#b=gHGhRXA@$s{M{Xso(=kfdJ}{Iu#tVDae6j+(xE;uQhJt z6C6QHcpI;0k!itpr-B!q3c8&NUa~280W64+{h%P?R1k40Sm;y`wG>bnEpjS&+NR(W zuppn5{s29cclJ=;>Y+X$U`#gr;E!S6b`{6`0{c}L^Ny=H<`Y+O+CybN(L)1nNdGUn zNAp-VJ!S)BReLFXwLhZ(^OjUHngBcIfj%0CIqC^ zP$_WlUzEpw{5E73L7jP4Bprn=$HzO+%n5Ks;%4vUI4-?%cHzIlLioX~ORq{cbj^CM nbt~e+I$_h~`eh}Pzrs+Hxe!Qk&Y>k7mp7WLJha8f?Q8!(D*<6v delta 4396 zcmY*c4Nw)=6~4Q7e*quwJ$`)%yyXFcB0(WgBjCdhf|ZBQ_(zmlP)N{NAx2Z|OnFwB zsb(^yk6V)dFjmr}W7?Y0sL>d$HLXr!Vr*)r<6lZ_Oj>Ice@WD+J$LW!+ufacvwQFE zJ?A^;e&;*)ZGRwce<1GMjFW%z+_Ez@#H zd=4QlF@ruM;oEo^xKpDdLW=OO1Q>Wc&2b315nkyPQHzw5iO_UaN6ANvp?%F7l&X$ltJ@HAJqG*u zg(A|4_UG7Fhv<#$yW)y`p%mI+UsW8iM-&ToP5_}@$~)_rfj_Vt;s*cXhs|6Luga`g zb}6$@!M>WY>{1@L$FfWLek>LNl5vdGU(NO&R&0=82cvyt{Z%c}r<53W<@Q3DRB9-D z_~?9^QgU^gkW$4zK0$Wsi!HS)rU zFQO^M779(N+ncDP(6?Aq!pto*m#ZYCB+<7W$W@by&_h|Kl_;;FVIg#u-5|j39GInb z{!q?0@x0|nDBgj`Me*o+0)Uo6c?^@u*L;=3@*@_YVY%K8Xjqt~^kf5WIu2ys@58Hj5Y=xyK zB->IED6*NHxS^G7mWt?79Niz0w*&b%OO@0Ej_!#_3M_t6GPWozCBmYYNY>3v?^e@R z1HgC%C>|oAn_5Xon&hw*lBPLq&6kXndoVbQNIa zNv6~wPcMu`;=1Jvi;_(eMadzFqU4Z7QHn`o9XL^?!~^-PUNGJGyhfnLC#3t9zv-fA z(eQJ~e4lt`8ROqop538}#_Kff6Tf5B5J+;LIG52ds7rF6*u;WA7|{#1k6gRuk8Bg& z(?D!M>!c8f*^rpXh|z>lc{!8`w^|(YH0;MO4VP3&=*0~l0GG1PO|gtotwa6@R;(5q znB26Xysgk%zbB@Sh3R)&*}{La8yKLo0TWP(6{1ZkE5vE`N~{oP&=iV)VY(Q+Zo6V0!C#?gKFBX#oQy7=S!)bDIRBJvh znC(|j>1m;sr8Fo#59Bx_xMzVffHq4TAk@)Y=$M0NoDSAF9X#uFu-4{a6l!fIdH-uIGE>NB4)p#} zCzza-hI0^_Cm78I)cbP{*e-M~WE=Mt$L`!<{6u~KR6&nJgns3>yZu@B9vv0|K1~QfpIp8e&Y{}7hKdG zj(*mIQ070tLIw=8>fs@RTz5cM&XG^P(IV$?o-L?PaV)6+<|1?nTR~lhVi>}E=YavZ zte{eh^q_{Y-Z+h*hHxFFPb{b*+~^2u2tQ#3bp`f+2X+Rv*Bl!`y+sD^_>=yOZ9%yf z0M|B=lXo=#CTwu4Ny3n!-dGgKGYaC|Lfm(Ki(Bwyi{CA{-rhV~@EnTIESna*n8M?u zK|SLg3=CASM33A*G>6bjeg)+dB)xaFCxh6aAHxu`VK@(r&c&}92S93>UfkfONqXvX zv3Y_5I^^P6_QK1>VLPx~5`Qn-I|Zk(J?ns8K%3?zQh85nzQmg+MZLl<@j9_+5VXSn z$2%(QG9RljPcrN$@2IdVyj5Wf;Prm;HaOVtbg=aM0!;6UexM zlz*!=Z{TAZK}&c8ud~RE;HORp8=Vd|IUV%c96SpVgvf4i5OO*QIUO`Q9n7&D&=iH8 z4(8e%d<+o;NXdQZp}ez)@>UN`q0NsxbKe)?dD~H(=V#lGx;*bVit~KzC{BB*#K(H5 z-wpJ?z}=n6*mRHGfK@9>plfye>B}Pe4+=EZ?Wtq0Ptn_>@Pj_{AI>7?)i&!(`o)TXhGpj z!^)e?2w173R^Z$p4zNGJP3eVDXPzhG4nmjXqn&8lL^vXGRWEZKms(X-a2g_nKg_!I t>UhIf< #include #include // Include this for the isdigit() function +#include // Since pulseaudio uses callbacks, we need something that will allow us to share data // between functions. From 10e87576e1facce40f10e4a225b0fc50f85da242 Mon Sep 17 00:00:00 2001 From: NMagic Date: Fri, 10 Nov 2023 18:22:26 -0300 Subject: [PATCH 14/20] Switching default sink reimplemented! Reimplemented switching default sinks. --- v-0.10/Makefile | 20 + .../pa_context -- interface overview.docx | Bin 0 -> 33970 bytes .../pavucontrol sink update flow.txt | 41 + .../pulseaudio/introspect.c summary | 79 + .../pulseaudio/mainloop code flow.txt | 17 + v-0.10/easypulse_core.c | 606 ++++ v-0.10/easypulse_core.h | 92 + v-0.10/examples/Makefile | 19 + v-0.10/examples/alsa-mapper_pulseaudio-api | Bin 0 -> 101984 bytes v-0.10/examples/alsa-mapper_pulseaudio-api.c | 91 + v-0.10/examples/change-speaker-mode | Bin 0 -> 95840 bytes v-0.10/examples/change-speaker-mode.c | 94 + v-0.10/examples/error.txt | 103 + .../examples/get-card-profiles-pulseaudio_api | Bin 0 -> 99424 bytes .../get-card-profiles-pulseaudio_api.c | 63 + v-0.10/examples/mute_input_demo | Bin 0 -> 98064 bytes v-0.10/examples/mute_input_demo.c | 89 + v-0.10/examples/mute_output_demo | Bin 0 -> 98072 bytes v-0.10/examples/mute_output_demo.c | 89 + v-0.10/examples/print-input-sources | Bin 0 -> 99232 bytes v-0.10/examples/print-input-sources.c | 92 + v-0.10/examples/print_volume_output_devices | Bin 0 -> 98744 bytes v-0.10/examples/print_volume_output_devices.c | 72 + v-0.10/examples/switch-sink | Bin 0 -> 97816 bytes v-0.10/examples/switch-sink-pulseaudio | Bin 0 -> 100944 bytes v-0.10/examples/switch-sink-pulseaudio.c | 62 + v-0.10/examples/switch-sink.c | 47 + v-0.10/examples/volume-change | Bin 0 -> 97896 bytes v-0.10/examples/volume-change-pulseaudio | Bin 0 -> 100880 bytes v-0.10/examples/volume-change-pulseaudio.c | 101 + v-0.10/examples/volume-change.c | 67 + v-0.10/libeasypulse_core.a | Bin 0 -> 35336 bytes v-0.10/system_query.c | 2492 +++++++++++++++++ v-0.10/system_query.h | 95 + 34 files changed, 4431 insertions(+) create mode 100644 v-0.10/Makefile create mode 100644 v-0.10/documentation/pa_context -- interface overview.docx create mode 100644 v-0.10/documentation/pavucontrol/pavucontrol sink update flow.txt create mode 100644 v-0.10/documentation/pulseaudio/introspect.c summary create mode 100644 v-0.10/documentation/pulseaudio/mainloop code flow.txt create mode 100644 v-0.10/easypulse_core.c create mode 100644 v-0.10/easypulse_core.h create mode 100644 v-0.10/examples/Makefile create mode 100755 v-0.10/examples/alsa-mapper_pulseaudio-api create mode 100644 v-0.10/examples/alsa-mapper_pulseaudio-api.c create mode 100755 v-0.10/examples/change-speaker-mode create mode 100644 v-0.10/examples/change-speaker-mode.c create mode 100644 v-0.10/examples/error.txt create mode 100755 v-0.10/examples/get-card-profiles-pulseaudio_api create mode 100644 v-0.10/examples/get-card-profiles-pulseaudio_api.c create mode 100755 v-0.10/examples/mute_input_demo create mode 100644 v-0.10/examples/mute_input_demo.c create mode 100755 v-0.10/examples/mute_output_demo create mode 100644 v-0.10/examples/mute_output_demo.c create mode 100755 v-0.10/examples/print-input-sources create mode 100644 v-0.10/examples/print-input-sources.c create mode 100755 v-0.10/examples/print_volume_output_devices create mode 100644 v-0.10/examples/print_volume_output_devices.c create mode 100755 v-0.10/examples/switch-sink create mode 100755 v-0.10/examples/switch-sink-pulseaudio create mode 100644 v-0.10/examples/switch-sink-pulseaudio.c create mode 100644 v-0.10/examples/switch-sink.c create mode 100755 v-0.10/examples/volume-change create mode 100755 v-0.10/examples/volume-change-pulseaudio create mode 100644 v-0.10/examples/volume-change-pulseaudio.c create mode 100644 v-0.10/examples/volume-change.c create mode 100644 v-0.10/libeasypulse_core.a create mode 100644 v-0.10/system_query.c create mode 100644 v-0.10/system_query.h diff --git a/v-0.10/Makefile b/v-0.10/Makefile new file mode 100644 index 0000000..b1c5107 --- /dev/null +++ b/v-0.10/Makefile @@ -0,0 +1,20 @@ +CC = gcc +CFLAGS = -Wall -g -Wextra + +LIB_NAME = easypulse_core +LIB_SRC = easypulse_core.c +LIB_OBJ = easypulse_core.o +LIB_OUT = lib$(LIB_NAME).a + +all: $(LIB_OUT) + +$(LIB_OUT): $(LIB_OBJ) + ar rcs $(LIB_OUT) $(LIB_OBJ) + +$(LIB_OBJ): $(LIB_SRC) + $(CC) $(CFLAGS) -c $(LIB_SRC) -o $(LIB_OBJ) + +clean: + rm -f $(LIB_OBJ) $(LIB_OUT) + +.PHONY: all clean diff --git a/v-0.10/documentation/pa_context -- interface overview.docx b/v-0.10/documentation/pa_context -- interface overview.docx new file mode 100644 index 0000000000000000000000000000000000000000..6cbe2d09c38dfcab843409c88d5b9d8666c90192 GIT binary patch literal 33970 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 literal 0 HcmV?d00001 diff --git a/v-0.10/documentation/pavucontrol/pavucontrol sink update flow.txt b/v-0.10/documentation/pavucontrol/pavucontrol sink update flow.txt new file mode 100644 index 0000000..9428de8 --- /dev/null +++ b/v-0.10/documentation/pavucontrol/pavucontrol sink update flow.txt @@ -0,0 +1,41 @@ ++----------------+ +| pavucontrol | +| (initial file)| ++----------------+ + | + | Callback function triggered when there's info/change related to a sink + V ++----------------+ +| sink_cb | +| (pavucontrol.cc)| ++----------------+ + | + | - If error, show error and return + | - If end-of-list (eol) is reached, decrease outstanding tasks count and return + | - Update GUI representation of a sink using w->updateSink() + V ++---------------------------+ +| MainWindow::updateSink | +| (mainwindow.cc & .h) | ++---------------------------+ + | + | - Retrieve or create SinkWidget for the sink + | - Update SinkWidget properties (e.g., volume, mute state, active port, etc.) + | - Prepare context menu for the sink + | - Ensure the sink is displayed correctly via updateDeviceVisibility + V ++-------------------------------------+ +| MainWindow::updateDeviceVisibility | +| (mainwindow.cc & .h) | ++-------------------------------------+ + | + | - If idle source/callback is already queued, return + | - Schedule the idle_cb function to be called when the app is idle + V ++----------------+ +| idle_cb | +| (mainwindow.cc)| ++----------------+ + | + V + ... (Specific steps and logic for updating device visibility) diff --git a/v-0.10/documentation/pulseaudio/introspect.c summary b/v-0.10/documentation/pulseaudio/introspect.c summary new file mode 100644 index 0000000..d9616f2 --- /dev/null +++ b/v-0.10/documentation/pulseaudio/introspect.c summary @@ -0,0 +1,79 @@ +* !pa_tagstruct_eof (context_string_callback): this function seems to be a callback function for processing string responses from the server. It examines the incoming command and checks for errors. If there's an error or if the command isn't a reply, it sets the success flag to 0 and prepares an empty response string. If the command is a reply, it extracts the response string from the tag structure. If there's any issue with extracting the string or if there's unexpected data in the tag structure, it flags a protocol error. + +* pa_context_stat: this function sends a simple command to request statistics. It leverages another function pa_context_send_simple_command and provides the context_stat_callback as the callback function to handle the response. It's used to retrieve statistical information. + +* pa_context_get_server_info: similar to the previous function, this function sends a command to get server information. It again uses pa_context_send_simple_command, but this time with a different callback, context_get_server_info_callback, to process the server information response. + +* context_get_sink_info_callback: this function is a callback that processes information about a sink. It first ensures that the operation and context are valid. If the received command is not a reply, it handles the error. If it is a reply, it starts parsing the sink information from the tag structure, extracting details like the sink's name, description, sample specification, channel map, owner module, volume, mute status, monitor source, latency, and more. The function seems to account for different versions of the context and extracts varying levels of information based on that. + +* pa_tagstruct_getu32: this function seems to be a snippet or part of another function and is possibly not a standalone function. It attempts to retrieve a 32-bit unsigned integer from a tag structure. If unsuccessful, it returns an error indicating a protocol issue. + +* pa_context_get_sink_info_list: this function sends a command to retrieve a list of sink information. It utilizes the pa_context_send_simple_command function and provides the context_get_sink_info_callback as the callback to process the list of sinks. + +* pa_context_get_sink_info_by_index: this function requests information about a specific sink identified by its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SINK_INFO) with the specified sink index and sends it to the server. The response from the server is expected to be handled by the context_get_sink_info_callback. + +* pa_context_get_sink_info_by_name: similar to the previous function, this one requests information about a sink, but it identifies the sink by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SINK_INFO) with the specified sink name to the server. The server's response will be processed by the context_get_sink_info_callback. + +* pa_context_set_sink_port_by_index: this function is designed to set the port for a specific sink identified by its index. After some validity checks, it builds a command (PA_COMMAND_SET_SINK_PORT) with the given sink index and port information, then sends this command to the server. The acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_sink_port_by_name: this function sets the port of a sink based on its name. It first performs some validation checks, then constructs a command with the sink's name and desired port. This command is sent to the PulseAudio server, and the response will be handled by a generic acknowledgment callback. + +* context_get_source_info_callback: this callback function processes information about a source. It starts by performing some initializations and checks. If the received command is a reply, it begins parsing the source information from the tag structure. This includes extracting details like the source's name, description, sample specification, volume, mute status, latency, and more. It appears to accommodate different versions of the context, extracting varying levels of information based on that. + +* pa_context_get_source_info_list: this function sends a command to retrieve a list of source information. It employs the pa_context_send_simple_command function, providing the context_get_source_info_callback as the callback to process the list of sources. + +* pa_context_get_source_info_by_index: this function retrieves information about a specific audio source based on its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source index and sends it to the server. The response from the server is expected to be handled by the context_get_source_info_callback. + +* pa_context_get_source_info_by_name: similar to the previous function, this one retrieves information about a source but identifies the source by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source name to the server. The server's response is again expected to be processed by the context_get_source_info_callback. + +* pa_context_set_source_port_by_index: this function sets the port of a specific source based on its index. After performing some validity checks and ensuring that the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source index. This command is sent to the server, and the acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_source_port_by_name: this function is designed to set the port of a specific audio source based on its name. It constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source name and sends this command to the PulseAudio server. The server's response will be handled by a generic acknowledgment callback. + +* context_get_client_info_callback: This callback function processes client-related information. It first performs checks to ensure the received command is a reply. If it is, the function begins parsing the client information, extracting details like client index, name, owner module, and driver. The function appears to be prepared to handle multiple client records in the same response and will loop through them until the end of the tag structure. + +* pa_context_get_client_info: this function requests information about a specific client based on its index. It constructs and sends a command (PA_COMMAND_GET_CLIENT_INFO) with the specified client index to the server. The server's response is expected to be processed by the context_get_client_info_callback. + +* pa_context_get_client_info_list: this function requests a list of client information from the PulseAudio server. It utilizes the pa_context_send_simple_command function and specifies the PA_COMMAND_GET_CLIENT_INFO_LIST command. The response from the server is expected to be handled by the context_get_client_info_callback. + + +* card_info_free: this is a utility function designed to free the memory associated with a pa_card_info structure. It releases memory for various properties and profiles associated with the card, such as its property list (proplist), profiles (profiles), and extended profile information (profiles2). + +* fill_card_port_info: this function populates the port information for a given card. It starts by extracting the number of ports (n_ports) for the card from a tag structure. If the card has ports, it then proceeds to fill in details about each port. If there's a protocol error while fetching the details, it returns an error. + +* fill_card_profile_info: this function is responsible for populating the profile information of a given card. It begins by allocating memory for the profiles and then proceeds to iterate through each profile, extracting details like name, description, number of sinks, number of sources, and priority. It also accounts for different versions of the context, fetching additional details if the version is >= 29. + + +* context_get_card_info_callback: this callback function processes card-related information. It starts by performing initialization checks and then examines the received command. If the command is a reply, the function starts parsing card details like index, name, owner module, driver, and the number of profiles. It then calls the fill_card_profile_info function to populate the profiles for the card. If there are any protocol errors during this process, the function handles them accordingly. + + +* pa_tagstruct_get_proplist: This function seems to be a snippet or a partial representation of a larger function. Its purpose appears to be to extract a property list (proplist) from a tag structure. If there's any issue during this extraction, it flags an error. + + +* pa_context_get_card_info_by_index: this function requests information about a specific card based on its index. After performing several validity checks, it constructs a command (PA_COMMAND_GET_CARD_INFO) with the specified card index and sends it to the server. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_by_name: similar to the previous function, this one requests information about a card, but it identifies the card by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_CARD_INFO) with the specified card name to the server. Again, the server's response is expected to be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_list: this function requests a list of all card information from the PulseAudio server. It employs the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_CARD_INFO_LIST command. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_set_card_profile_by_index: this function sets the profile of a specific card based on its index. After checking the validity of the context and ensuring the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the specified card index and desired profile. This command is sent to the server, and the response is handled by a generic acknowledgment callback. + +* pa_context_set_card_profile_by_name: this function sets the profile of a card identified by its name. Like the previous function, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the card name and desired profile, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_module_info_callback: this callback function processes module-related information. It checks if the received command is a reply and, if so, starts parsing the module details. This includes extracting details like the module's index, name, argument, and usage count. If there's an error or unexpected end of file in the tag structure, it flags a protocol error. + +* pa_context_get_module_info: this function retrieves information about a specific module based on its index. After conducting various validity checks, it constructs a command (PA_COMMAND_GET_MODULE_INFO) with the specified module index and sends it to the server. The response from the server will be processed by the context_get_module_info_callback. + +* pa_context_get_module_info_list: this function requests a list of all module information from the PulseAudio server. It uses the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_MODULE_INFO_LIST command. The server's response will be processed by the context_get_module_info_callback. + +* context_get_sink_input_info_callback: this callback function processes information related to sink inputs. It checks if the received command is a reply and, if so, starts parsing the sink input details. This includes extracting details like the sink input's index, name, owner module, client, sink, sample specification, channel map, volume, buffer usec, sink usec, resample method, driver, and more. It also accounts for different versions of the context, extracting varying levels of information based on that. + +* pa_context_set_source_output_volume: this function sets the volume of a specific source output based on its index. It starts by performing various checks, including verifying the validity of the provided volume. It then constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_VOLUME) with the specified source output index and volume and sends it to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_set_source_output_mute: this function mutes or unmutes a specific source output based on its index. It constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_MUTE) with the desired mute status and the source output index, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_sample_info_callback: this callback function processes sample-related information. It checks if the received command is a reply and, if so, begins parsing the sample details, extracting attributes like the sample's index, name, volume, mute status, proplist, and more. The function also handles possible protocol errors and is prepared to process multiple sample records in the same response. + +* pa_context_suspend_source_by_index: this function suspends or resumes a specific source based on its index. It verifies the server version, constructs a command (PA_COMMAND_SUSPEND_SOURCE) with the desired suspend status and source index, and then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_send_message_to_object: this function sends a message to a specific object within the PulseAudio server. After checking the server version and other conditions, it constructs a command (PA_COMMAND_SEND_OBJECT_MESSAGE) with the object's path, the message, and any additional parameters. The server's response will be processed by a callback function. diff --git a/v-0.10/documentation/pulseaudio/mainloop code flow.txt b/v-0.10/documentation/pulseaudio/mainloop code flow.txt new file mode 100644 index 0000000..f4c8b96 --- /dev/null +++ b/v-0.10/documentation/pulseaudio/mainloop code flow.txt @@ -0,0 +1,17 @@ ++---------------------------------------------+ +| Mainloop | +| | +| +--------------+ +-------------------+ | +| | I/O Events | | Timers | | +| +--------------+ +-------------------+ | +| | +| +--------------+ +-------------------+ | +| | Signals | | Deferred Callbacks| | +| +--------------+ +-------------------+ | +| | +| +---------------------+ | +| | Other Asynchronous | | +| | Tasks | | +| +---------------------+ | +| | ++---------------------------------------------+ diff --git a/v-0.10/easypulse_core.c b/v-0.10/easypulse_core.c new file mode 100644 index 0000000..3695828 --- /dev/null +++ b/v-0.10/easypulse_core.c @@ -0,0 +1,606 @@ +/** + * @file easypulse_core.c + * @brief Implementation of the easypulse core functions. + * + * This file provides the core functionality to interact with PulseAudio, + * allowing operations like setting the default device and adjusting volume. + */ + +#include "easypulse_core.h" +#include "system_query.h" +#include +#include +#include +#include + +static bool manager_initialize(pulseaudio_manager *self); +static void iterate(pulseaudio_manager *manager, pa_operation *op); + +//Shared data between manager_switch_default_output and its callbacks +typedef struct _shared_data_1 { + pulseaudio_manager *manager; + uint32_t new_index; //Index of the new default sink. + +} shared_data_1; + +/** + * @brief Creates a new pulseaudio_manager instance. + * + * This function allocates memory for a new pulseaudio_manager instance and initializes it. + * It allocates memory for the output and input devices based on the current system state, + * and initializes the PulseAudio context and mainloop. It also sets the active output and + * input devices. + * + * If any memory allocation or initialization operation fails, the function cleans up any + * resources that were successfully allocated or initialized, and returns NULL. + * + * @return A pointer to the newly created pulseaudio_manager instance, or NULL if the + * creation failed. + */ +pulseaudio_manager *manager_create(void) { + pulseaudio_manager *self = malloc(sizeof(pulseaudio_manager)); + if (!self) { + fprintf(stderr, "Failed to allocate memory for pulseaudio_manager.\n"); + return NULL; + } + + // Zero-initialize the structure to set sensible defaults + memset(self, 0, sizeof(pulseaudio_manager)); + + // Initialize manager's PulseAudio main loop and context + if (!manager_initialize(self)) { + fprintf(stderr, "Failed to initialize pulseaudio_manager.\n"); + free(self); + return NULL; + } + + // Get the count of output and input devices + self->output_count = get_output_device_count(); + self->input_count = get_input_device_count(); + + // Allocate memory for outputs + if (self->output_count > 0) { + self->outputs = calloc(self->output_count, sizeof(pulseaudio_device)); + if (!self->outputs) { + fprintf(stderr, "Failed to allocate memory for outputs.\n"); + manager_cleanup(self); + return NULL; + } + // Retrieve and populate output devices + pa_sink_info **output_devices = get_available_output_devices(); + + for (uint32_t i = 0; i < self->output_count; ++i) { + self->outputs[i].index = output_devices[i]->index; + self->outputs[i].name = strdup(output_devices[i]->description); + self->outputs[i].code = strdup(output_devices[i]->name); + self->outputs[i].sample_rate = get_output_sample_rate(get_alsa_output_id(output_devices[i]->name), output_devices[i]); + self->outputs[i].max_channels = get_max_output_channels(get_alsa_output_id(output_devices[i]->name), output_devices[i]); + self->outputs[i].min_channels = get_min_output_channels(get_alsa_output_id(output_devices[i]->name), output_devices[i]); + self->outputs[i].channel_names = get_output_channel_names(output_devices[i]->name, self->outputs[i].max_channels); + // Add any additional fields to populate + } + free(output_devices); + } + + // Allocate memory for inputs + if (self->input_count > 0) { + self->inputs = calloc(self->input_count, sizeof(pulseaudio_device)); + if (!self->inputs) { + fprintf(stderr, "Failed to allocate memory for inputs.\n"); + manager_cleanup(self); + return NULL; + } + // Retrieve and populate input devices + pa_source_info **input_devices = get_available_input_devices(); + + for (uint32_t i = 0; i < self->input_count; ++i) { + self->inputs[i].index = input_devices[i]->index; + self->inputs[i].name = strdup(input_devices[i]->description); + self->inputs[i].code = strdup(input_devices[i]->name); + self->inputs[i].sample_rate = get_input_sample_rate(get_alsa_input_id(input_devices[i]->name), input_devices[i]); + self->inputs[i].max_channels = get_max_input_channels(get_alsa_input_id(input_devices[i]->name), input_devices[i]); + self->inputs[i].min_channels = get_min_input_channels(get_alsa_input_id(input_devices[i]->name), input_devices[i]); + self->inputs[i].channel_names = get_input_channel_names(input_devices[i]->name, self->inputs[i].max_channels); + // Add any additional fields to populate + } + free(input_devices); + } + + // Set the default output and input devices + self->active_output_device = strdup(get_default_output(self->context)); + self->active_input_device = strdup(get_default_input(self->context)); + + // Check that the active devices were set + if (!self->active_output_device || !self->active_input_device) { + fprintf(stderr, "Failed to set the active output or input device.\n"); + manager_cleanup(self); + return NULL; + } + + // Don't forget to clean up the temporary lists of devices after you're done with them + + return self; +} + + +/** + * @brief Callback function for handling PulseAudio context state changes. + * + * This callback is invoked by the PulseAudio mainloop when the context state changes. + * It updates the `pa_ready` flag in the pulseaudio_manager structure based on the + * context's state. The `pa_ready` flag is set to 1 when the context is ready, and + * to 2 when the context has failed or terminated. This callback will signal the + * mainloop to continue its operations whenever the state changes to either READY, + * FAILED, or TERMINATED. + * + * @param c Pointer to the PulseAudio context. + * @param userdata User-provided pointer to the pulseaudio_manager structure. + */ +static void manager_initialize_cb(pa_context *c, void *userdata) { + pa_context_state_t state; + pulseaudio_manager *manager = (pulseaudio_manager *) userdata; + int *pa_ready = &(manager->pa_ready); + pa_threaded_mainloop *m = manager->mainloop; + + state = pa_context_get_state(c); + switch (state) { + // There are other states you can handle, but these are the important ones + case PA_CONTEXT_CONNECTING: + case PA_CONTEXT_AUTHORIZING: + case PA_CONTEXT_SETTING_NAME: + default: + break; + case PA_CONTEXT_READY: + *pa_ready = 1; + pa_threaded_mainloop_signal(m, 0); + break; + case PA_CONTEXT_FAILED: + case PA_CONTEXT_TERMINATED: + *pa_ready = 2; + pa_threaded_mainloop_signal(m, 0); + break; + } +} + + +/** + * @brief Initializes the PulseAudio manager. + * + * This function sets up the PulseAudio threaded mainloop and context for the given manager. + * It creates the mainloop, context, and connects to the PulseAudio server, then starts + * the mainloop and waits for the context to be ready. It also sets up a state callback + * to handle the context state changes. + * + * @param self Pointer to the pulseaudio_manager structure to be initialized. + * @return Returns true if initialization is successful, false otherwise. + * + * @note The function will clean up allocated resources and return false if any step + * of the initialization fails. + */ +static bool manager_initialize(pulseaudio_manager *self) { + // 1. Create the threaded mainloop + self->mainloop = pa_threaded_mainloop_new(); + if (!self->mainloop) { + return false; + } + + // Get the mainloop API + pa_mainloop_api *mlapi = pa_threaded_mainloop_get_api(self->mainloop); + + // Create the context + self->context = pa_context_new(mlapi, "PulseAudio Manager"); + if (!self->context) { + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // Set the state callback + pa_context_set_state_callback(self->context, manager_initialize_cb, self); + + // Lock the mainloop and connect the context + pa_threaded_mainloop_lock(self->mainloop); + + if (pa_context_connect(self->context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) { + pa_threaded_mainloop_unlock(self->mainloop); + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // 2. Start the threaded mainloop + pa_threaded_mainloop_start(self->mainloop); + + // 4. Wait for the context to be ready + while (self->pa_ready == 0) { + pa_threaded_mainloop_wait(self->mainloop); + } + + pa_threaded_mainloop_unlock(self->mainloop); + + if (self->pa_ready == 2) { + return false; + } + + return true; +} + +/** + * Cleans up and frees all resources associated with a pulseaudio_manager object. + * This function ensures that all memory allocated for output and input devices + * within the manager is released. It includes freeing of all associated strings, + * channel names, and profile data. Additionally, it shuts down and frees the + * PulseAudio context and mainloop, if they have been initialized. + * + * @param manager A pointer to the pulseaudio_manager object to be cleaned up. + * If the pointer is NULL, the function does nothing. + */ +void manager_cleanup(pulseaudio_manager *manager) { + if (manager) { + // Free output devices + if (manager->outputs) { + for (uint32_t i = 0; i < manager->output_count; ++i) { + free(manager->outputs[i].code); + free(manager->outputs[i].name); + free(manager->outputs[i].alsa_id); + if (manager->outputs[i].channel_names) { + for (int j = 0; j < manager->outputs[i].max_channels; ++j) { + free(manager->outputs[i].channel_names[j]); + } + free(manager->outputs[i].channel_names); + } + if (manager->outputs[i].profiles) { + for (uint32_t j = 0; j < manager->outputs[i].profile_count; ++j) { + free((char*)manager->outputs[i].profiles[j].name); + free((char*)manager->outputs[i].profiles[j].description); + } + free(manager->outputs[i].profiles); + } + } + free(manager->outputs); // Finally free the array itself + } + + // Free input devices + if (manager->inputs) { + for (uint32_t i = 0; i < manager->input_count; ++i) { + free(manager->inputs[i].code); + free(manager->inputs[i].name); + free(manager->inputs[i].alsa_id); + if (manager->inputs[i].channel_names) { + for (int j = 0; j < manager->inputs[i].max_channels; ++j) { + free(manager->inputs[i].channel_names[j]); + } + free(manager->inputs[i].channel_names); + } + if (manager->inputs[i].profiles) { + for (uint32_t j = 0; j < manager->inputs[i].profile_count; ++j) { + free((char*)manager->inputs[i].profiles[j].name); + free((char*)manager->inputs[i].profiles[j].description); + } + free(manager->inputs[i].profiles); + } + } + free(manager->inputs); // Finally free the array itself + } + + // Free the names of active output and input devices + free(manager->active_output_device); + free(manager->active_input_device); + + // Disconnect and unreference the context if it's there + if (manager->context) { + // Check if the context is in a state that can be disconnected + if (pa_context_get_state(manager->context) == PA_CONTEXT_READY) { + pa_context_disconnect(manager->context); + } + pa_context_unref(manager->context); + } + + // Stop and free the mainloop if it's there + if (manager->mainloop) { + pa_threaded_mainloop_stop(manager->mainloop); + pa_threaded_mainloop_free(manager->mainloop); + } + + // Free the manager itself + free(manager); + } +} + + + + +/** + * @brief Iterates through operations in the pulseaudio_manager. + * + * @param manager Pointer to the pulseaudio_manager instance. + * @param op Pointer to the pa_operation instance. + */ +static void iterate(pulseaudio_manager *manager, pa_operation *op) { + //Leaves if operation is invalid. + if (!op) return; + + bool is_in_mainloop_thread = pa_threaded_mainloop_in_thread(manager->mainloop); + + // If we're not in the mainloop thread, lock it. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_lock(manager->mainloop); + } + + //Wait for the operation to complete. + //The signaling to continue is performed inside the callback operation (op). + pa_threaded_mainloop_wait(manager->mainloop); + + //Cleaning up. + pa_operation_unref(op); + + // If we locked the mainloop earlier, unlock it now. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_unlock(manager->mainloop); + } +} + +/** + * @brief Callback function for setting master volume on a device. + * + * This function is called when the asynchronous operation to set the volume + * for a sink completes. It will signal the mainloop to stop waiting. + * + * @param c The PulseAudio context. + * @param success Non-zero if the operation succeeded, zero if it failed. + * @param userdata The userdata passed to the function, a pointer to the pulseaudio_manager. + */ +void manager_set_master_volume_cb(pa_context *c, int success, void *userdata) { + (void) c; + + pulseaudio_manager *manager = (pulseaudio_manager *)userdata; + + // Check if the operation was successful + if (success) { + printf("Volume set successfully.\n"); + } else { + printf("Failed to set volume.\n"); + } + + // Signal the mainloop to stop waiting + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + +/** + * @brief Sets the master volume of a given device. + * + * This function sets the master volume of a device specified by its PulseAudio ID. + * + * @param manager Pointer to the pulseaudio_manager instance. + * @param device_id The PulseAudio ID of the device. + * @param volume The new volume level to set. This should be a value between 0 (mute) and 100 (maximum volume). + * @return 0 if the operation was successful, or a non-zero error code if the operation failed. + */ +/** + * @brief Sets the master volume of a given device. + * + * This function sets the master volume of a device specified by its PulseAudio ID. + * + * @param manager Pointer to the pulseaudio_manager instance. + * @param device_id The PulseAudio ID of the device. + * @param volume The new volume level to set. This should be a value between 0 (mute) and 100 (maximum volume). + * @return 0 if the operation was successful, or a non-zero error code if the operation failed. + */ +int manager_set_master_volume(pulseaudio_manager *manager, uint32_t device_id, int volume) { + if (!manager) { + fprintf(stderr, "Manager is NULL\n"); + return -1; + } + + if(volume < 0 || volume > 100) { + fprintf(stderr, "[manager_set_master_volume] The volume specified is out of range (0-100).\n"); + return -1; + } + + // Fetch the sink information for the device ID + const pa_sink_info *sink_info = get_output_device_by_index(device_id); + if (!sink_info) { + fprintf(stderr, "Could not retrieve sink info for device ID %u\n", device_id); + return -1; + } + + // Calculate the PA volume from the provided percentage + pa_volume_t pa_volume = (pa_volume_t) ((double) volume / 100.0 * PA_VOLUME_NORM); + + // Initialize a pa_cvolume structure and set the volume for all channels + pa_cvolume cvolume; + pa_cvolume_set(&cvolume, sink_info->channel_map.channels, pa_volume); + + // Start the asynchronous operation to set the sink volume + pa_operation *op = pa_context_set_sink_volume_by_index(manager->context, device_id, &cvolume, manager_set_master_volume_cb, manager); + if (!op) { + fprintf(stderr, "Failed to start volume set operation\n"); + return -1; + } + + // Wait for the operation to complete + iterate(manager, op); + + return 0; +} + +/** + * @brief Callback function for handling the completion of an output mute toggle operation. + * + * This function is invoked by the PulseAudio main loop upon the completion of an operation + * to toggle the mute state of an output device (sink). It is used in conjunction with + * `pa_context_set_sink_mute_by_index` as part of the `manager_toggle_output_mute` function. + * The callback checks if the mute toggle operation was successful and signals the mainloop + * to continue processing. + * + * @param c Pointer to the PulseAudio context, not used in this callback. + * @param success An integer indicating the success of the mute toggle operation. + * A non-zero value indicates success, while zero indicates failure. + * @param userdata User data provided when initiating the operation; expected to be a pointer + * to a `pulseaudio_manager` instance. + * + */ +static void manager_toggle_output_mute_cb(pa_context *c, int success, void *userdata) { + (void) c; + + pulseaudio_manager *manager = (pulseaudio_manager *) userdata; + if (!success) { + fprintf(stderr, "Failed to toggle mute state.\n"); + } + + // Signal the mainloop to continue + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + + +/** + * Toggle the mute state of a given output device. + * + * @param manager A pointer to the initialized pulseaudio_manager instance. + * @param index The index of the output device to toggle mute state. + * @param state The desired mute state (1 for ON/mute, 0 for OFF/unmute). + * @return Returns 0 on success, -1 on failure. + */ +int manager_toggle_output_mute(pulseaudio_manager *manager, uint32_t index, int state) { + + if (!manager || !manager->context) { + fprintf(stderr, "Invalid PulseAudio manager or context.\n"); + return -1; + } + + if (index >= manager->output_count) { + fprintf(stderr, "Output device index out of range.\n"); + return -1; + } + + pa_operation *op = pa_context_set_sink_mute_by_index(manager->context, + index, state, manager_toggle_output_mute_cb, manager); + + iterate(manager, op); + + return 0; +} + +/** + * @brief Callback function for handling the completion of an input mute toggle operation. + * + * This function is called by the PulseAudio main loop when the operation to toggle + * the mute state of an input device (source) is completed. The function is used in + * conjunction with `pa_context_set_source_mute_by_index` within the `manager_toggle_input_mute` + * function. It checks if the operation was successful and signals the mainloop to continue. + * + * @param c Pointer to the PulseAudio context. This parameter is not used in this callback. + * @param success An integer indicating the success of the mute toggle operation. + * Non-zero value indicates success, zero indicates failure. + * @param userdata User data provided when initiating the operation; expected to be a pointer + * to a `pulseaudio_manager` instance. + * + */ +static void manager_toggle_input_mute_cb(pa_context *c, int success, void *userdata) { + (void) c; + + pulseaudio_manager *manager = (pulseaudio_manager *) userdata; + if (!success) { + fprintf(stderr, "Failed to toggle input mute state.\n"); + } + + // Signal the mainloop to continue + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + +/** + * Toggle the mute state of a given input device. + * + * @param manager A pointer to the initialized pulseaudio_manager instance. + * @param index The index of the input device to toggle mute state. + * @param state The desired mute state (1 for ON/mute, 0 for OFF/unmute). + * @return Returns 0 on success, -1 on failure. + */ +int manager_toggle_input_mute(pulseaudio_manager *manager, uint32_t index, int state) { + + if (!manager || !manager->context) { + fprintf(stderr, "Invalid PulseAudio manager or context.\n"); + return -1; + } + + if (index >= manager->input_count) { + fprintf(stderr, "Input device index out of range.\n"); + return -1; + } + + pa_operation *op = pa_context_set_source_mute_by_index(manager->context, + index, state, manager_toggle_input_mute_cb, manager); + + iterate(manager, op); + + return 0; +} + + + +// Callback for setting the default sink +static void manager_switch_default_output_cb(pa_context *c, int success, void *userdata) { + (void) c; + + pulseaudio_manager *manager = (pulseaudio_manager *)userdata; + if (!success) { + fprintf(stderr, "Failed to set default sink.\n"); + } + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + +// Callback for moving sink inputs +static void manager_switch_default_output_cb_2(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata) { + shared_data_1 *shared_data = (shared_data_1 *) userdata; + pa_threaded_mainloop *mainloop = shared_data->manager->mainloop; + + if (eol < 0) { + // Error occurred, signal the main loop to continue + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + if (!eol && i) { + // Move sink input to the new sink index stored in shared_data + pa_operation *op_move = pa_context_move_sink_input_by_index(c, i->index, shared_data->new_index, NULL, NULL); + if (op_move) { + pa_operation_unref(op_move); + pa_threaded_mainloop_signal(mainloop, 0); + } + } + + if (eol > 0) { + // End of list, signal the main loop to continue + pa_threaded_mainloop_signal(mainloop, 0); + } +} + +bool manager_switch_default_output(pulseaudio_manager *self, uint32_t device_index) { + //To be sent to the second callback. + shared_data_1 shared_data = {self, self->outputs[device_index].index}; + + if (!self || !self->context || device_index >= self->output_count) { + fprintf(stderr, "Invalid arguments provided.\n"); + return false; + } + + const char *new_sink_name = self->outputs[device_index].code; + if (!new_sink_name) { + fprintf(stderr, "Output device code is NULL.\n"); + return false; + } + + // Set the new default sink + pa_operation *op = pa_context_set_default_sink(self->context, new_sink_name, manager_switch_default_output_cb, self); + iterate(self, op); + + shared_data.new_index = get_output_device_index_by_code(self->context, self->outputs[device_index].code); + //fprintf(stderr, "[DEBUG, manager_switch_default_output()] index is %lu\n", (unsigned long) shared_data.new_index); + + // Move all sink inputs to the new default sink + op = pa_context_get_sink_input_info_list(self->context, manager_switch_default_output_cb_2, &shared_data); + iterate(self, op); + + return true; +} + + + diff --git a/v-0.10/easypulse_core.h b/v-0.10/easypulse_core.h new file mode 100644 index 0000000..c273dfc --- /dev/null +++ b/v-0.10/easypulse_core.h @@ -0,0 +1,92 @@ +/** + * @file core.h + * @brief EasyPulse Library Header. + * + * EasyPulse is a library designed to provide pseudo-object oriented programming + * functions to simplify access to PulseAudio. + */ + +#ifndef EASPYPULSE_CORE_H +#define EASPYPULSE_CORE_H +#include +#define DEBUG_MODE 0 // Debug mode flag + +#include +#include "system_query.h" +#include +#include +#include + +// Forward declarations +typedef struct pulseaudio_manager pulseaudio_manager; +typedef struct pulseaudio_device pulseaudio_device; +typedef struct pulseaudio_volume pulseaudio_volume; + + +typedef struct { + char *name; // Name of the profile + char *description; // Description of the profile + uint32_t channels; // Number of channels this profile has +} pulseaudio_profile; + +//Internal volume information. +typedef struct _internal_volume { + uint32_t index; + char *code; //Pulseaudio name of the volume. + pa_cvolume *volume; //Volume representation. + pa_channel_map *cmap; //Channel map representation. + +} internal_volume; + +/** + * @brief Represents a PulseAudio device. + */ +struct pulseaudio_device { + uint32_t index; // Index of the device. + char *code; // Pulseaudio name of the device. + char *name; // Pulseaudio description of the device. + char *alsa_id; // Alsa ID of the device. + int sample_rate; // Current sample rate of the device. + pa_card_profile_info *active_profile; // Active alsa profile of this device. + char **channel_names; // Public channel names. + int master_volume; // Average volume of all channels (in percentage). + int *channel_volume; // Volume of each individual channel (in percentage). + bool mute; // Mute status of the devices (true for muted, false for unmuted). + int min_channels; // The minimum number of channels of the device. + int max_channels; // The maximum number of channels of the device. + pa_card_profile_info *profiles; // Array of available profiles for the device + uint32_t profile_count; // Number of available profiles +}; + +/** + * @brief Represents the main manager for PulseAudio operations. + */ +struct pulseaudio_manager { + pa_threaded_mainloop *mainloop; // Mainloop for PulseAudio operations. + pa_context *context; // PulseAudio context. + pulseaudio_device *outputs; // Array of available output devices. + pulseaudio_device *inputs; // Array of available input devices. + int pa_ready; // Indicates if PulseAudio is ready (1 for ready, 2 for error). + int devices_loaded; // Indicates if devices are loaded (0 for not loaded, 1 for loaded successfully, 2 for error). + char *active_output_device; // Pointer to active output device. + char *active_input_device; // Pointer to active input device. + uint32_t output_count; // Number of pulseaudio sinks (outputs). + uint32_t input_count; // Number of pulseaudio sources (inputs). +}; + +pulseaudio_manager *manager_create(void); +void manager_cleanup(pulseaudio_manager *manager); //Cleans up the manager. + +int manager_set_master_volume(pulseaudio_manager *manager, +uint32_t device_id, int volume); //Sets the master volume of a given volume. + +int manager_toggle_output_mute(pulseaudio_manager *manager, +uint32_t index, int state); //Toggles the volume of output device to muted / unmuted. + +int manager_toggle_input_mute(pulseaudio_manager *manager, +uint32_t index, int state); //Toggles the volume of input device to muted / unmuted. + +bool manager_switch_default_output(pulseaudio_manager *self, +uint32_t device_index); //Changes the default sink. + +#endif // CORE_H diff --git a/v-0.10/examples/Makefile b/v-0.10/examples/Makefile new file mode 100644 index 0000000..6f11288 --- /dev/null +++ b/v-0.10/examples/Makefile @@ -0,0 +1,19 @@ +CC = gcc +CFLAGS = -Wall -Wextra -g -O0 + +LIB_DIR = ../ +LIB_SRC = $(LIB_DIR)*.c + +EXAMPLES_DIR = . +EXAMPLES_SRC = $(wildcard $(EXAMPLES_DIR)/*.c) +EXAMPLES_OUT = $(patsubst $(EXAMPLES_DIR)/%.c,$(EXAMPLES_DIR)/%,$(EXAMPLES_SRC)) + +all: $(EXAMPLES_OUT) + +$(EXAMPLES_DIR)/%: $(EXAMPLES_DIR)/%.c + $(CC) $(CFLAGS) $< $(LIB_SRC) -o $@ -lpulse -lasound + +clean: + rm -f $(EXAMPLES_DIR)/*~ $(EXAMPLES_OUT) + +.PHONY: all clean diff --git a/v-0.10/examples/alsa-mapper_pulseaudio-api b/v-0.10/examples/alsa-mapper_pulseaudio-api new file mode 100755 index 0000000000000000000000000000000000000000..1c3d20009d8395f59918c34aa816fab9fbafb031 GIT binary patch literal 101984 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 U>2{|2A2};aQl72*&v$A3e+9#m4gdfE literal 0 HcmV?d00001 diff --git a/v-0.10/examples/alsa-mapper_pulseaudio-api.c b/v-0.10/examples/alsa-mapper_pulseaudio-api.c new file mode 100644 index 0000000..47eb39b --- /dev/null +++ b/v-0.10/examples/alsa-mapper_pulseaudio-api.c @@ -0,0 +1,91 @@ +/** + * @file pulseaudio_alsa_mapper.c + * @brief Demonstrates how to map PulseAudio sinks to their corresponding ALSA device names. + */ + +#include +#include +#include +#include + +static const char* get_alsa_friendly_name(int card_num) { + snd_ctl_t *ctl; + char name[128]; + snprintf(name, sizeof(name), "hw:%d", card_num); + + if (snd_ctl_open(&ctl, name, 0) < 0) { + return NULL; + } + + snd_ctl_card_info_t *info; + snd_ctl_card_info_alloca(&info); + if (snd_ctl_card_info(ctl, info) < 0) { + snd_ctl_close(ctl); + return NULL; + } + + const char *friendly_name = strdup(snd_ctl_card_info_get_name(info)); + snd_ctl_close(ctl); + return friendly_name; +} + +static void sink_info_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) userdata; + + if (eol > 0) { + pa_context_disconnect(c); + return; + } + + const char *udev_description = pa_proplist_gets(info->proplist, "device.description"); + const char *card_str = pa_proplist_gets(info->proplist, "alsa.card"); + const char *device_str = pa_proplist_gets(info->proplist, "alsa.device"); + + int card_num = card_str ? atoi(card_str) : -1; + const char *friendly_name = card_num != -1 ? get_alsa_friendly_name(card_num) : NULL; + + if (udev_description && card_str && device_str) { + printf("Sink: %s, UDEV description: %s, ALSA name: hw:%s,%s", info->name, udev_description, card_str, device_str); + if (friendly_name) { + printf(", Friendly ALSA name: %s", friendly_name); + free((void*)friendly_name); + } + printf("\n"); + } else if (udev_description) { + printf("Sink: %s, UDEV description: %s, Incomplete ALSA name information.\n", info->name, udev_description); + } +} + +static void context_state_cb(pa_context *c, void *userdata) { + switch (pa_context_get_state(c)) { + case PA_CONTEXT_READY: + pa_context_get_sink_info_list(c, sink_info_cb, NULL); + break; + case PA_CONTEXT_FAILED: + case PA_CONTEXT_TERMINATED: + pa_mainloop_quit((pa_mainloop*)userdata, 0); + break; + default: + break; + } +} + +int main(void) { + pa_mainloop *mainloop; + pa_mainloop_api *mainloop_api; + pa_context *context; + + mainloop = pa_mainloop_new(); + mainloop_api = pa_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "udev_description_fetcher"); + + pa_context_set_state_callback(context, context_state_cb, mainloop); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + + pa_mainloop_run(mainloop, NULL); + + pa_context_unref(context); + pa_mainloop_free(mainloop); + + return 0; +} diff --git a/v-0.10/examples/change-speaker-mode b/v-0.10/examples/change-speaker-mode new file mode 100755 index 0000000000000000000000000000000000000000..3c9cbd673037d5e18780179e8fe0047b203b7298 GIT binary patch literal 95840 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 literal 0 HcmV?d00001 diff --git a/v-0.10/examples/change-speaker-mode.c b/v-0.10/examples/change-speaker-mode.c new file mode 100644 index 0000000..9bfc03d --- /dev/null +++ b/v-0.10/examples/change-speaker-mode.c @@ -0,0 +1,94 @@ +/** + * @file sample_program.c + * @brief PulseAudio Mode Selector + * + * This program is designed to manage the audio mode of the active PulseAudio sink. + * + * The program performs the following tasks: + * - Initializes the PulseAudio manager. + * - Detects and displays the current mode of the active device. + * - Lists audio modes supported by the active device based on its number of channels. + * - Prompts the user to select a desired mode from the list. + * - Sets the active device to the mode selected by the user. + * + * The available modes include: mono, stereo, 4.0, 5.0, 5.1, and 7.1. The program lists + * modes dynamically, ensuring that only those supported by the active device are presented. + * + * @date 10-15-2023 (creation date) + */ + +#if 0 +#include "../easypulse_core.h" +#include + +int main(void) { + // Initialize the pulseaudio_manager + pulseaudio_manager *manager = new_manager(); + //pulseaudio_manager *self = manager; + + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudio manager.\n"); + return 1; + } + + + // Detect the current mode of the active device + const char* current_mode = manager->get_device_mode_by_code(manager, manager->active_device->code); + printf("Current mode of the active device (%s): %s\n", manager->active_device->code, current_mode); + + // List available modes based on the number of channels of the active device + printf("\nAvailable modes:\n"); + printf("1. mono\n"); + printf("2. stereo\n"); + + int max_choice = 2; // To keep track of the maximum mode choice number + uint32_t channels = manager->active_device->number_of_channels; + + if (channels >= 4) { + printf("3. 4.0\n"); + max_choice = 3; + } + if (channels >= 5) { + printf("4. 5.0\n"); + max_choice = 4; + } + if (channels >= 6) { + printf("5. 5.1\n"); + max_choice = 5; + } + if (channels >= 8) { + printf("6. 7.1\n"); + max_choice = 6; + } + + // Prompt the user to select a mode + printf("\nEnter the number corresponding to the desired mode: "); + int choice; + scanf("%d", &choice); + + if (choice < 1 || choice > max_choice) { + printf("Invalid choice.\n"); + manager->destroy(self); + return 1; + } + + const char* mode_choices[] = {"mono", "stereo", "4.0", "5.0", "5.1", "7.1"}; + const char* mode_to_set = mode_choices[choice - 1]; + + // Set the mode of the active device + if (manager->set_device_mode_by_code(manager, manager->active_device->code, mode_to_set)) { + printf("Mode set to %s successfully!\n", mode_to_set); + } else { + fprintf(stderr, "Failed to set the mode.\n"); + } + + // Cleanup + manager->destroy(self); + return 0; + +} +#endif + +int main(void) { + return 0; +} diff --git a/v-0.10/examples/error.txt b/v-0.10/examples/error.txt new file mode 100644 index 0000000..edb3387 --- /dev/null +++ b/v-0.10/examples/error.txt @@ -0,0 +1,103 @@ +Operation state at cycle 0: 0 +Operation state at cycle 1: 0 +Operation state at cycle 2: 0 +Operation state at cycle 3: 0 +Operation state at cycle 4: 0 +Operation state at cycle 5: 0 +Operation state at cycle 6: 0 +Operation state at cycle 7: 0 +Operation state at cycle 8: 0 +Operation state at cycle 9: 0 +Operation state at cycle 10: 0 +Operation state at cycle 11: 0 +Operation state at cycle 12: 0 +Operation state at cycle 13: 0 +Operation state at cycle 14: 0 +Operation state at cycle 15: 0 +Operation state at cycle 16: 0 +Operation state at cycle 17: 0 +Operation state at cycle 18: 0 +Operation state at cycle 19: 0 +Operation state at cycle 20: 0 +Operation state at cycle 21: 1 +Operation state at cycle 0: 0 +Operation state at cycle 1: 0 +Operation state at cycle 2: 0 +Operation state at cycle 3: 0 +Operation state at cycle 4: 0 +Operation state at cycle 5: 0 +Operation state at cycle 6: 0 +Operation state at cycle 7: 0 +Operation state at cycle 8: 0 +Operation state at cycle 9: 0 +Operation state at cycle 10: 0 +Operation state at cycle 11: 0 +Operation state at cycle 12: 0 +Operation state at cycle 13: 0 +Operation state at cycle 14: 0 +Operation state at cycle 15: 0 +Operation state at cycle 16: 0 +Operation state at cycle 17: 0 +Operation state at cycle 18: 0 +Operation state at cycle 19: 0 +Operation state at cycle 20: 0 +Operation state at cycle 21: 0 +Operation state at cycle 22: 0 +Operation state at cycle 23: 0 +Operation state at cycle 24: 0 +Operation state at cycle 25: 0 +Operation state at cycle 26: 0 +Operation state at cycle 27: 0 +Operation state at cycle 28: 0 +Operation state at cycle 29: 0 +Operation state at cycle 30: 0 +Operation state at cycle 31: 0 +Operation state at cycle 32: 0 +Operation state at cycle 33: 0 +Operation state at cycle 34: 0 +Operation state at cycle 35: 0 +Operation state at cycle 36: 0 +Operation state at cycle 37: 0 +Operation state at cycle 38: 0 +Operation state at cycle 39: 0 +Operation state at cycle 40: 0 +Operation state at cycle 41: 0 +Operation state at cycle 42: 0 +Operation state at cycle 43: 0 +Operation state at cycle 44: 0 +Operation state at cycle 45: 0 +Operation state at cycle 46: 0 +Operation state at cycle 47: 0 +Operation state at cycle 48: 0 +Operation state at cycle 49: 0 +Operation state at cycle 50: 0 +Operation state at cycle 51: 0 +Operation state at cycle 52: 0 +Operation state at cycle 53: 0 +Operation state at cycle 54: 0 +Operation state at cycle 55: 0 +Operation state at cycle 56: 0 +Operation state at cycle 57: 0 +Operation state at cycle 58: 0 +Operation state at cycle 59: 0 +Operation state at cycle 60: 0 +Operation state at cycle 61: 1 +Operation state at cycle 0: 0 +Operation state at cycle 1: 0 +Operation state at cycle 2: 0 +Operation state at cycle 3: 0 +Operation state at cycle 4: 0 +Operation state at cycle 5: 0 +Operation state at cycle 6: 0 +Operation state at cycle 7: 0 +Operation state at cycle 8: 0 +Operation state at cycle 9: 0 +Operation state at cycle 10: 0 +Operation state at cycle 11: 0 +Operation state at cycle 12: 0 +Operation state at cycle 13: 0 +Operation state at cycle 14: 0 +Operation state at cycle 15: 0 +Operation state at cycle 16: 0 +Operation state at cycle 17: 0 +Assertion '!m->thread || !pa_thread_is_running(m->thread) || !in_worker(m) || pa_atomic_load(&m->in_once_unlocked)' failed at ../pulseaudio/src/pulse/thread-mainloop.c:179, function pa_threaded_mainloop_lock(). Aborting. diff --git a/v-0.10/examples/get-card-profiles-pulseaudio_api b/v-0.10/examples/get-card-profiles-pulseaudio_api new file mode 100755 index 0000000000000000000000000000000000000000..7e5ec4c95c56a21e7e53d621d4cefca06aed6f4f GIT binary patch literal 99424 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 Y#3z3KG~A_X|FJU?^Q5nV@2m0u0aGrf{Qv*} literal 0 HcmV?d00001 diff --git a/v-0.10/examples/get-card-profiles-pulseaudio_api.c b/v-0.10/examples/get-card-profiles-pulseaudio_api.c new file mode 100644 index 0000000..829f45c --- /dev/null +++ b/v-0.10/examples/get-card-profiles-pulseaudio_api.c @@ -0,0 +1,63 @@ +/** + * @file get-card-profiles-pulseaudio_api.c + * @brief This program queries and displays information about available sound devices in a computer. + * + * It uses the PulseAudio library to interact with the sound system and retrieve information about + * available sound devices, their properties, and ALSA (Advanced Linux Sound Architecture) related data. + */ + +#include +#include "../easypulse_core.h" + +int main(void) { + // Query the total number of PulseAudio devices + uint32_t total_devices = get_output_device_count(); + + printf("Total sound devices in this computer:%lu\n", (unsigned long) total_devices); + printf("Available PulseAudio sound devices:\n"); + + pa_sink_info **sink_info = get_available_output_devices(); + if (!sink_info) { + fprintf(stderr, "Error: Could not retrieve sound device information.\n"); + return 1; + } + + for (uint32_t i = 0; i < total_devices; i++) { + if (!sink_info[i]) { + fprintf(stderr, "Error: sound device information at index %u is NULL.\n", i); + continue; + } + + // Display sink name + printf("\n- Sound device name: %s\n", sink_info[i]->name ? sink_info[i]->name : "NULL"); + printf("\n- Sound device description: %s\n", sink_info[i]->description ? sink_info[i]->description : "NULL"); + + // Query and display the number of profiles + uint32_t profile_count = get_profile_count(i); + printf(" - Number of profiles: %u\n", profile_count); + + // Get and display the ALSA name + const char *alsa_name = get_alsa_output_name(sink_info[i]->name); + const char *alsa_id = get_alsa_output_id(sink_info[i]->name); + int sample_rate = get_output_sample_rate(alsa_id, sink_info[i]); + + printf(" - Sample rate: %i\n", sample_rate); + printf("\n- Alsa ID is: %s\n", alsa_id ? alsa_id : "NULL"); + + if (alsa_name) { + printf(" - ALSA name: %s\n", alsa_name); + } else { + printf(" - No corresponding ALSA name found.\n"); + } + // Get and display the minimum and maximum channels + int min_channels = get_min_output_channels(alsa_id, sink_info[i]); + int max_channels = get_max_output_channels(alsa_id, sink_info[i]); + + if(min_channels > 0) printf(" - Minimum channels: %d\n", min_channels); + if(max_channels > 0) printf(" - Maximum channels: %d\n", max_channels); + free((char *)alsa_name); // Free the memory allocated for alsa_name + } + + delete_output_devices(sink_info); + return 0; +} diff --git a/v-0.10/examples/mute_input_demo b/v-0.10/examples/mute_input_demo new file mode 100755 index 0000000000000000000000000000000000000000..4268ffaa85445ed202cb47c48a23e21f034535f9 GIT binary patch literal 98064 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 XLep)9y1PvEhmx}XNe{!GOXL3oY2^!p literal 0 HcmV?d00001 diff --git a/v-0.10/examples/mute_input_demo.c b/v-0.10/examples/mute_input_demo.c new file mode 100644 index 0000000..096ffe8 --- /dev/null +++ b/v-0.10/examples/mute_input_demo.c @@ -0,0 +1,89 @@ +/** + * @file mute_input_demo.c + * @brief Demonstration program using PulseAudio to list input devices, toggle mute state. + * + * This program lists all available input devices managed by PulseAudio, checks + * if they are currently muted, and allows the user to select a device to toggle + * its mute state. The program uses the `easypulse_core` and `system_query` + * libraries to interact with the PulseAudio server. + * + * Usage: + * Run the program, and it will display a list of available input devices along + * with their mute status. The user can then input the index of the device they + * wish to toggle. The program will then change the mute state of the selected device. + * + * Example Output: + * ``` + * Available input devices: + * 0: Device 1 (muted: yes) + * 1: Device 2 (muted: no) + * Enter the index of the device you want to toggle the mute state for: + * ``` + * + * @author Mbyte2 + * @date November 11, 2023 + * + * @note This program is a simple demonstration and does not handle all edge cases + * and errors that could arise in a full-featured application. + */ + +#include +#include +#include "../easypulse_core.h" +#include "../system_query.h" + + +int main() { + // Initialize the PulseAudio manager + pulseaudio_manager *manager = manager_create(); + if (!manager) { + fprintf(stderr, "Failed to create the PulseAudio manager.\n"); + return 1; + } + + // Display available input devices + printf("\n***TOGGLING MUTE / UNMUTE FOR INPUT DEVICES DEMO***\n\nAvailable input devices:\n"); + for (uint32_t i = 0; i < manager->input_count; i++) { + const char *device_name = manager->inputs[i].name; + int is_muted = get_muted_input_status(manager->inputs[i].code); + printf("%d: %s (muted: %s)\n", (i+1), device_name, is_muted == true ? "yes" : "no"); + } + + // Ask the user for the device index to toggle mute state + printf("\nEnter the index of the device you want to toggle the mute state for: "); + uint32_t index; + if (scanf("%u", &index) != 1) { + fprintf(stderr, "Invalid input.\n"); + manager_cleanup(manager); + return 1; + } + + // Check if the index is within range + if ((index - 1) > manager->input_count) { + fprintf(stderr, "Index out of range.\n"); + manager_cleanup(manager); + return 1; + } + + // Get the current mute state + int current_mute_state = get_muted_input_status(manager->inputs[index-1].code); + if (current_mute_state == -1) { + fprintf(stderr, "Error getting the current mute state.\n"); + manager_cleanup(manager); + return 1; + } + + // Toggle the mute state of the selected source + int new_mute_state = !current_mute_state; + if (manager_toggle_input_mute(manager, (index-1), new_mute_state) != 0) { + fprintf(stderr, "Failed to toggle the mute state.\n"); + manager_cleanup(manager); + return 1; + } + + printf("The mute state of '%s' has been %s.\n", manager->inputs[index-1].name, new_mute_state ? "muted" : "unmuted"); + + // Clean up + manager_cleanup(manager); + return 0; +} diff --git a/v-0.10/examples/mute_output_demo b/v-0.10/examples/mute_output_demo new file mode 100755 index 0000000000000000000000000000000000000000..05ad014a5cb4440f3d363d33316633d18096cafa GIT binary patch literal 98072 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 +#include +#include "../easypulse_core.h" +#include "../system_query.h" + +// Forward declaration of the toggle_output_mute function +int toggle_output_mute(pulseaudio_manager *manager, uint32_t index, int state); + +int main() { + // Initialize the PulseAudio manager + pulseaudio_manager *manager = manager_create(); + if (!manager) { + fprintf(stderr, "Failed to create the PulseAudio manager.\n"); + return 1; + } + + // Display available output devices + printf("\n***TOGGLING MUTE / UNMUTE DEMO***\n\nAvailable output devices:\n"); + for (uint32_t i = 0; i < manager->output_count; i++) { + const char *device_name = manager->outputs[i].name; + int is_muted = get_muted_output_status(manager->outputs[i].code); + printf("%d: %s (muted: %s)\n", (i+1), device_name, is_muted == true ? "yes" : "no"); + } + + // Ask the user for the device index to toggle mute state + printf("\nEnter the index of the device you want to toggle the mute state for: "); + uint32_t index; + if (scanf("%u", &index) != 1) { + fprintf(stderr, "Invalid input.\n"); + manager_cleanup(manager); + return 1; + } + + // Check if the index is within range + if ((index - 1) >= manager->output_count) { + fprintf(stderr, "Index out of range.\n"); + manager_cleanup(manager); + return 1; + } + + // Get the current mute state + int current_mute_state = get_muted_output_status(manager->outputs[index-1].code); + if (current_mute_state == -1) { + fprintf(stderr, "Error getting the current mute state.\n"); + manager_cleanup(manager); + return 1; + } + + // Toggle the mute state of the selected sink + int new_mute_state = !current_mute_state; + if (manager_toggle_output_mute(manager, (index - 1), new_mute_state) != 0) { + fprintf(stderr, "Failed to toggle the mute state.\n"); + manager_cleanup(manager); + return 1; + } + + printf("The mute state of '%s' has been %s.\n", manager->outputs[index-1].name, new_mute_state ? "muted" : "unmuted"); + + // Clean up + manager_cleanup(manager); + return 0; +} diff --git a/v-0.10/examples/print-input-sources b/v-0.10/examples/print-input-sources new file mode 100755 index 0000000000000000000000000000000000000000..88433668a10a6efbb757713a5595c93397b8a828 GIT binary patch literal 99232 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 J4ErvP{|EVqI(7g6 literal 0 HcmV?d00001 diff --git a/v-0.10/examples/print-input-sources.c b/v-0.10/examples/print-input-sources.c new file mode 100644 index 0000000..09fedfa --- /dev/null +++ b/v-0.10/examples/print-input-sources.c @@ -0,0 +1,92 @@ +#include +#include "../system_query.h" + +int main() { + + char *alsa_name = NULL; + int min_channels = 0; + int max_channels = 0; + char *alsa_id = NULL; + + // Get all available input devices + pa_source_info **input_devices = get_available_input_devices(); + if (input_devices == NULL) { + fprintf(stderr, "Failed to get input devices\n"); + // Normally we would clean up here, but no cleanup function is available + return 1; + } + + // Output the number of input devices + uint32_t input_device_count = get_input_device_count(); + printf("Number of input devices: %u\n", input_device_count); + + // Iterate over each input device, print its name and sample rate + for (uint32_t i = 0; input_devices[i] != NULL; ++i) { + + + pa_source_info *source_info = input_devices[i]; + alsa_id = get_alsa_input_id(source_info->name); + + //printf("[DEBUG, main()] alsa_id is, %s\n", alsa_id); + + min_channels = get_min_input_channels(alsa_id, source_info); + max_channels = get_max_input_channels(alsa_id, source_info); + alsa_name = get_alsa_input_name(source_info->name); + + printf(" - Input Device %u:\n", (i +1)); + printf(" - Pulseaudio ID: %s\n", source_info->name); + printf(" - Pulseaudio name: %s\n", source_info->description); + + uint32_t sample_rate = get_input_sample_rate(alsa_id, source_info); + printf(" - Sample Rate: %u Hz\n", sample_rate); + + if ((alsa_name) && (alsa_id)) { + printf(" - Alsa name: %s\n", alsa_name); + printf(" - Alsa id: %s\n", alsa_id); + free(alsa_name); + free(alsa_id); + } + else { + printf(" [!] Unable to find an alsa name and ID.\n"); + printf(" [!] This is probably a pulseaudio-only virtual device.\n"); + } + + if(min_channels > 0) printf(" - Minimum channels: %i\n", min_channels); + if(max_channels > 0) printf(" - Maximum channels: %i\n\n", max_channels); + + //Reset channels for now. + min_channels = 0; + max_channels = 0; + } + + // Clean up all input devices + delete_input_devices(input_devices); + + + #if 0 + // Using the get_source_port_info function to get port information + pa_source_info_list* source_ports_info = get_source_port_info(); + + if (source_ports_info == NULL) { + fprintf(stderr, "Failed to get source port information\n"); + // Cleanup would go here + return 1; + } + + // Iterate over the source ports and print information about active and available ports + printf("Available source ports:\n"); + for (int i = 0; i < source_ports_info->num_ports; ++i) { + pa_port_info *port_info = &source_ports_info->ports[i]; + printf(" Port name: %s\n", port_info->name); + printf(" Port description: %s\n", port_info->description); + printf(" Port status: %s\n", port_info->is_active ? "active" : "inactive"); + } + + // Remember to free the source_ports_info structure after use + // Note: This assumes that the 'ports' array and its contents are dynamically allocated + free(source_ports_info->ports); + free(source_ports_info); + #endif + + return 0; +} diff --git a/v-0.10/examples/print_volume_output_devices b/v-0.10/examples/print_volume_output_devices new file mode 100755 index 0000000000000000000000000000000000000000..aa40e83b7c614a3e2aa80acc40403d85a18a9f2a GIT binary patch literal 98744 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"$q{Xm$4kcN~7>oh8v$PsnfFX1hXy|-#^JI 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 + +/** + * @brief Main function which queries and displays audio device information. + * + * The function initializes necessary structures for PulseAudio (done in system_query.c), + * retrieves the count of available devices, and iterates through each device + * to display its details, including the ALSA ID, sample rate, and channel volumes. + * + * @return int Returns 0 on successful execution, 1 on failure (e.g., no sinks available). + */ +int main() { + // Initialize any necessary PulseAudio structures + + // Get the count of available devices + uint32_t device_count = get_output_device_count(); + printf("Total devices: %u\n", device_count); + + // Get all available sinks + pa_sink_info **sinks = get_available_output_devices(); + if (sinks == NULL) { + printf("No sinks available.\n"); + return 1; + } + + + // Iterate through each sink + for (uint32_t i = 0; i < device_count; ++i) { + if (sinks[i] == NULL) { + continue; + } + + char **channel_names = NULL; + + printf(" Device %u: %s\n", i, sinks[i]->description); + + // Get the ALSA ID for the sink + const char *alsa_id = get_alsa_output_id(sinks[i]->name); + printf("\tALSA ID: %s\n", alsa_id); + + // Get the sample rate for the sink + int sample_rate = get_output_sample_rate(alsa_id, sinks[i]); + printf("\tSample Rate: %d Hz\n", sample_rate); + + channel_names = get_output_channel_names(sinks[i]->name, sinks[i]->channel_map.channels); + + // Iterate through each channel + for (uint8_t ch = 0; ch < sinks[i]->channel_map.channels; ++ch) { + pa_volume_t volume = get_channel_volume(sinks[i], ch); + float volume_percent = (float)volume / PA_VOLUME_NORM * 100; + printf("\tChannel %u name: %s, volume: %.2f%%\n", (ch + 1), channel_names[ch], volume_percent); + free(channel_names[ch]); + } + free(channel_names); + } + + // Cleanup + delete_output_devices(sinks); + + return 0; +} diff --git a/v-0.10/examples/switch-sink b/v-0.10/examples/switch-sink new file mode 100755 index 0000000000000000000000000000000000000000..fbfa578b3701e2f60e00a2c187fdf0f07fd8459b GIT binary patch literal 97816 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 literal 0 HcmV?d00001 diff --git a/v-0.10/examples/switch-sink-pulseaudio b/v-0.10/examples/switch-sink-pulseaudio new file mode 100755 index 0000000000000000000000000000000000000000..5a2484c77c780528de7bd26ea390b14ed92b012a GIT binary patch literal 100944 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 literal 0 HcmV?d00001 diff --git a/v-0.10/examples/switch-sink-pulseaudio.c b/v-0.10/examples/switch-sink-pulseaudio.c new file mode 100644 index 0000000..0a0c85a --- /dev/null +++ b/v-0.10/examples/switch-sink-pulseaudio.c @@ -0,0 +1,62 @@ +#include +#include +#include +#include + +static pa_threaded_mainloop *mainloop; +static pa_context *context; +static int sink_count = 0; +static char **sink_names = NULL; + +void sink_list_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + (void) userdata; + if (eol > 0) { + int chosen; + printf("Enter the number of the sink to set as default: "); + scanf("%d", &chosen); + + if (chosen >= 0 && chosen < sink_count) { + pa_context_set_default_sink(c, sink_names[chosen], NULL, NULL); + } + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + sink_names = realloc(sink_names, sizeof(char*) * (sink_count + 1)); + sink_names[sink_count] = strdup(info->name); + printf("%d: %s (%s)\n", sink_count++, info->name, info->description); +} + +void context_state_cb(pa_context *c, void *userdata) { + (void) userdata; + + if (pa_context_get_state(c) == PA_CONTEXT_READY) { + pa_operation_unref(pa_context_get_sink_info_list(c, sink_list_cb, NULL)); + } +} + +int main(void) { + mainloop = pa_threaded_mainloop_new(); + pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "sink_switcher_threaded"); + + pa_context_set_state_callback(context, context_state_cb, NULL); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + pa_threaded_mainloop_start(mainloop); + + pa_threaded_mainloop_lock(mainloop); + pa_threaded_mainloop_wait(mainloop); // Wait until sink_list_cb signals completion + + for (int i = 0; i < sink_count; i++) { + free(sink_names[i]); + } + free(sink_names); + + pa_context_disconnect(context); + pa_context_unref(context); + pa_threaded_mainloop_unlock(mainloop); + pa_threaded_mainloop_stop(mainloop); + pa_threaded_mainloop_free(mainloop); + return 0; +} diff --git a/v-0.10/examples/switch-sink.c b/v-0.10/examples/switch-sink.c new file mode 100644 index 0000000..0368692 --- /dev/null +++ b/v-0.10/examples/switch-sink.c @@ -0,0 +1,47 @@ +#include "../easypulse_core.h" +#include "../system_query.h" +#include +#include +#include + +int main() { + // Initialize the PulseAudio Manager + pulseaudio_manager *manager = manager_create(); + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudioManager.\n"); + return 1; + } + + // Display available output devices to the user + printf("\n\n***OUTPUT SWITCHING DEMO***\n\nAvailable output devices:\n"); + for (uint32_t i = 0; i < manager->output_count; i++) { + printf("%d. %s - %s\n", i + 1, manager->outputs[i].name, manager->outputs[i].code); + } + + // Prompt the user to select a device + printf("Enter the number of the output device you want to switch to: "); + uint32_t choice; + scanf("%u", &choice); + + + // Validate the user's choice + if ((choice - 1) > manager->output_count) { + fprintf(stderr, "Invalid choice.\n"); + manager_cleanup(manager); + return 1; + } + + // Switch to the selected device + if (manager_switch_default_output(manager, manager->outputs[choice - 1].index) == true) { + printf("Successfully switched to the selected output device.\n"); + } else { + fprintf(stderr, "Failed to switch to the selected output device.\n"); + manager_cleanup(manager); + return 1; + } + + // Cleanup + manager_cleanup(manager); + + return 0; +} diff --git a/v-0.10/examples/volume-change b/v-0.10/examples/volume-change new file mode 100755 index 0000000000000000000000000000000000000000..a1b1c023c8fc8ff83a5c7f21ace9661aef0917e9 GIT binary patch literal 97896 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 l@oL-ShU(wfrzNG=tM;{~x8>*TVn+ literal 0 HcmV?d00001 diff --git a/v-0.10/examples/volume-change-pulseaudio.c b/v-0.10/examples/volume-change-pulseaudio.c new file mode 100644 index 0000000..aa629ab --- /dev/null +++ b/v-0.10/examples/volume-change-pulseaudio.c @@ -0,0 +1,101 @@ +/** + * @file volume-change-pulseaudio.c + * @brief Change the volume of the default PulseAudio sink. + * + * This program prompts the user for a desired volume level, displays the current volume + * of the default sink, sets the volume of the default sink to the user's input, and then + * displays the volume after the change. + */ + +#include +#include +#include + +static pa_threaded_mainloop *mainloop; +static pa_context *context; + +/** + * @brief Callback function to set the volume of the default sink. + * + * This function fetches the current volume of the default sink, displays it, + * then prompts the user for a desired volume level, sets the volume, and finally + * displays the volume after the change. + * + * @param c The PulseAudio context. + * @param info Information about the current sink. + * @param eol End-of-list flag. + * @param userdata User data (unused). + */ +void set_volume_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + (void) userdata; + + if (eol > 0) { + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + // Prompt the user for the desired volume level first + int volume_percentage; + printf("Enter the desired volume (0-100): "); + scanf("%d", &volume_percentage); + + // Display the current volume percentage + int volume_percentage_before = (int)(100.0f * pa_cvolume_avg(&info->volume) / PA_VOLUME_NORM + 0.5); + printf("Volume before change: %d%%\n", volume_percentage_before); + + // Set the volume based on user input + pa_cvolume volume; + pa_cvolume_set(&volume, info->channel_map.channels, (volume_percentage * PA_VOLUME_NORM) / 100); + pa_context_set_sink_volume_by_index(c, info->index, &volume, NULL, NULL); + + // Display the volume after the change + int volume_percentage_after = (int)(100.0f * pa_cvolume_avg(&volume) / PA_VOLUME_NORM + 0.5); + printf("Volume after change: %d%%\n", volume_percentage_after); + + pa_threaded_mainloop_signal(mainloop, 0); +} + +/** + * @brief Callback function for context state changes. + * + * This function checks if the context is ready and then triggers the retrieval + * of the default sink's information. + * + * @param c The PulseAudio context. + * @param userdata User data (unused). + */ +void context_state_cb(pa_context *c, void *userdata) { + (void) c; + (void) userdata; + + if (pa_context_get_state(c) == PA_CONTEXT_READY) { + pa_operation_unref(pa_context_get_sink_info_by_name(c, "@DEFAULT_SINK@", set_volume_cb, NULL)); + } +} + +int main(void) { + // Initialize PulseAudio threaded mainloop and context + mainloop = pa_threaded_mainloop_new(); + pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "volume_changer_threaded"); + + // Set context state callback and connect the context + pa_context_set_state_callback(context, context_state_cb, NULL); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + + // Start the threaded mainloop + pa_threaded_mainloop_start(mainloop); + + // Lock the mainloop and wait for operations to complete + pa_threaded_mainloop_lock(mainloop); + pa_threaded_mainloop_wait(mainloop); + + // Cleanup and free resources + pa_context_disconnect(context); + pa_context_unref(context); + pa_threaded_mainloop_unlock(mainloop); + pa_threaded_mainloop_stop(mainloop); + pa_threaded_mainloop_free(mainloop); + return 0; +} diff --git a/v-0.10/examples/volume-change.c b/v-0.10/examples/volume-change.c new file mode 100644 index 0000000..013d39d --- /dev/null +++ b/v-0.10/examples/volume-change.c @@ -0,0 +1,67 @@ +/** + * @file volume-change.c + * @brief PulseAudio Manager demo program + * + * This program demonstrates the usage of the PulseAudio Manager API. + * It creates a manager instance, lists the available output devices, + * asks the user to select one of the output devices and to enter a master volume. + * It then sets the master volume of the selected output device to the given value. + * + * @author mbyte-2 + * @date 11-07-2023 + */ +#include +#include "../easypulse_core.h" // Assuming this is the header file where your API is defined + +int main() { + // Create a manager instance + pulseaudio_manager *manager = manager_create(); + if (!manager) { + fprintf(stderr, "Failed to create manager.\n"); + return 1; + } + + // List the outputs + printf("Available output devices:\n"); + for (uint32_t i = 0; i < get_output_device_count(); ++i) { + printf("%d: %s\n", (i+1), manager->outputs[i].name); + } + + // Ask the user to select one of the outputs + uint32_t selected_output; + printf("Please enter the number of the output device you want to use: "); + scanf("%u", &selected_output); + + // Check if the selected output is valid + if ((selected_output - 1) >= get_output_device_count()) { + fprintf(stderr, "Invalid output device number.\n"); + manager_cleanup(manager); + return 1; + } + + // Ask the user to type a master volume + int master_volume; + printf("Please enter the master volume (0-100): "); + scanf("%d", &master_volume); + + // Check if the master volume is valid + if (master_volume < 0 || master_volume > 100) { + fprintf(stderr, "Invalid master volume. It should be between 0 and 100.\n"); + manager_cleanup(manager); + return 1; + } + + // Set the master volume to the given value + if (manager_set_master_volume(manager, (selected_output -1), master_volume) != 0) { + fprintf(stderr, "Failed to set master volume.\n"); + manager_cleanup(manager); + return 1; + } + + printf("Master volume for output device '%s' has been set to %d.\n", manager->outputs[(selected_output-1)].name, master_volume); + + // Clean up + manager_cleanup(manager); + + return 0; +} diff --git a/v-0.10/libeasypulse_core.a b/v-0.10/libeasypulse_core.a new file mode 100644 index 0000000000000000000000000000000000000000..21939444a4d0b86b520c4183cce7c79355ca49bc GIT binary patch literal 35336 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 literal 0 HcmV?d00001 diff --git a/v-0.10/system_query.c b/v-0.10/system_query.c new file mode 100644 index 0000000..a06a0cd --- /dev/null +++ b/v-0.10/system_query.c @@ -0,0 +1,2492 @@ +#include "system_query.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include // Include this for the isdigit() function +#include + +// Since pulseaudio uses callbacks, we need something that will allow us to share data +// between functions. +typedef struct { + pa_threaded_mainloop *mainloop; + pa_mainloop_api *mainloop_api; + pa_context *context; +} _shared_data_1; + +static _shared_data_1 shared_data_1; + +// Structure to share data between get_alsa_name and its callback. +typedef struct { + char *alsa_name; + char *alsa_id; +} _shared_data_2; + +static _shared_data_2 shared_data_2 = {.alsa_name = NULL}; + + +// Structure to share data between get_available_output_devices and its callback. +typedef struct { + pa_sink_info **sinks; // An array of pointers to pa_sink_info + uint32_t count; +} _shared_data_3; + +static _shared_data_3 shared_data_3; + +// Structure to share data between get_profiles and its callback. +typedef struct { + pa_card_profile_info *profiles; + int num_profiles; +} _shared_data_4; + +_shared_data_4 shared_data_4 = {NULL, 0}; + +// Structure to share data between get_available_input_devices and its callback. +static struct { + pa_source_info **sources; // Array of pointers to pa_source_info structures + uint32_t count; // Count of available sources + uint32_t allocated; // Allocated size of the sources array +} shared_data_sources = {NULL, 0, 0}; + + + + +static void pulse_cleanup(void); +static bool is_pulse_initialized(void); +static void get_output_device_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata); +static void get_profile_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata); + +// Utility function to print all properties in the proplist +void print_proplist(const pa_proplist *p) { + void *state = NULL; + const char *key; + while ((key = pa_proplist_iterate(p, &state))) { + const char *value = pa_proplist_gets(p, key); + if (value) { + printf("%s = %s\n", key, value); + } else { + printf("%s = \n", key); + } + } +} + +/** + * @brief Iterates through operations in the pulseaudio threaded loop. + * + * @param loop Pointer to the threaded loop instance. + * @param op Pointer to the pa_operation instance. + */ +static void iterate(pa_operation *op) { + //fprintf(stderr, "[DEBUG] Entering %s\n", __FUNCTION__); // Debug statement for entry + + //Leaves if operation is invalid. + if (!op) { + fprintf(stderr, "[DEBUG] Operation is NULL\n"); // Debug statement for NULL operation + return; + } + + bool is_in_mainloop_thread = pa_threaded_mainloop_in_thread(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Is in mainloop thread: %d\n", is_in_mainloop_thread); // Debug statement for thread check + + // If we're not in the mainloop thread, lock it. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_lock(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Mainloop locked\n"); // Debug statement for mainloop locked + } + + //Wait for the operation to complete. + //The signaling to continue is performed inside the callback operation (op). + while (pa_operation_get_state(op) == PA_OPERATION_RUNNING) { + pa_threaded_mainloop_wait(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Waiting in mainloop...\n"); // Debug message while waiting + } + + //Debug code if needed. + #if 0 + // Check the operation state after waiting + switch (pa_operation_get_state(op)) { + case PA_OPERATION_DONE: + fprintf(stderr, "[DEBUG] Operation completed successfully\n"); // Debug message for successful completion + break; + case PA_OPERATION_CANCELLED: + fprintf(stderr, "[DEBUG] Operation was cancelled\n"); // Debug message for cancellation + break; + case PA_OPERATION_RUNNING: // This case should not be possible after the wait + default: + fprintf(stderr, "[DEBUG] Operation is in an unexpected state: %d\n", pa_operation_get_state(op)); // Debug message for unexpected state + break; + } + #endif + + //Cleaning up. + pa_operation_unref(op); + //fprintf(stderr, "[DEBUG] Operation unreferenced and cleaned up\n"); // Debug statement for cleanup + + // If we locked the mainloop earlier, unlock it now. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Mainloop unlocked\n"); // Debug statement for mainloop unlocked + } + + //fprintf(stderr, "[DEBUG] Exiting %s\n", __FUNCTION__); // Debug statement for exit +} + + +/** + * @brief Callback function to handle changes in PulseAudio context state. + * + * This function is triggered whenever the state of the PulseAudio context changes. + * It signals the mainloop to continue execution whenever the context is in a READY, FAILED, + * or TERMINATED state. + * + * @param c Pointer to the PulseAudio context. + * @param userdata Pointer to the data shared with the main function, which contains the mainloop. + */ +static void context_state_cb(pa_context *c, void *userdata) { + (void) userdata; + pa_context_state_t state = pa_context_get_state(c); + + // If the context is in a READY, FAILED, or TERMINATED state, signal the mainloop to continue. + if (state == PA_CONTEXT_READY || state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } +} + +/** + * @brief Utility function to check if PulseAudio is initialized and in a READY state. + * + * This function checks the state of the PulseAudio context and other key PulseAudio resources + * to determine if PulseAudio has been successfully initialized and is in a READY state. + * + * @return True if PulseAudio is initialized and in a READY state, false otherwise. + */ +static bool is_pulse_initialized(void) { + + + // Check if the main components of PulseAudio (mainloop, mainloop_api, and context) are initialized. + if (shared_data_1.mainloop && shared_data_1.mainloop_api && shared_data_1.context) { + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + + // If the context is in a READY state, PulseAudio is initialized. + if (state == PA_CONTEXT_READY) { + return true; + } + } + return false; +} + +/** + * @brief Initializes the PulseAudio mainloop and context for querying audio information. + * + * This function sets up the necessary PulseAudio components for subsequent queries + * to the audio subsystem. It creates a new threaded mainloop, obtains the mainloop API, + * and creates a new context with a specified name. It also starts the mainloop and + * connects the context to the PulseAudio server, waiting until the context is ready + * or an error occurs. + * + * @note If this function fails at any point, it ensures that all allocated resources are + * cleaned up before returning. + * + * @return true if the PulseAudio components were initialized successfully, false otherwise. + */ +bool initialize_pulse() { + shared_data_1.mainloop = pa_threaded_mainloop_new(); + if (!shared_data_1.mainloop) { + fprintf(stderr, "Failed to create mainloop.\n"); + return false; + } + + shared_data_1.mainloop_api = pa_threaded_mainloop_get_api(shared_data_1.mainloop); + if (!shared_data_1.mainloop_api) { + fprintf(stderr, "Failed to get mainloop API.\n"); + pa_threaded_mainloop_free(shared_data_1.mainloop); + return false; + } + + shared_data_1.context = pa_context_new(shared_data_1.mainloop_api, "Easypulse query API"); + if (!shared_data_1.context) { + fprintf(stderr, "Failed to create context.\n"); + pa_threaded_mainloop_free(shared_data_1.mainloop); + return false; + } + + + pa_context_set_state_callback(shared_data_1.context, context_state_cb, shared_data_1.mainloop); + + // Start the threaded mainloop + pa_threaded_mainloop_start(shared_data_1.mainloop); + + // Lock the mainloop and connect the context + pa_threaded_mainloop_lock(shared_data_1.mainloop); + if (pa_context_connect(shared_data_1.context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + pulse_cleanup(); + return false; + } + + // Wait for the context to be ready + while (true) { + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + if (state == PA_CONTEXT_READY) { + break; + } else if (state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + pulse_cleanup(); + return false; + } + pa_threaded_mainloop_wait(shared_data_1.mainloop); + } + + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + return true; +} + + +/** + * @brief Cleanup function to properly disconnect and free PulseAudio resources. + * + * This function ensures that all the PulseAudio resources are properly disconnected, + * dereferenced, and freed to avoid any resource leaks. It should be called whenever + * PulseAudio operations are done and the program wishes to terminate or release PulseAudio. + */ +static void pulse_cleanup(void) { + if (shared_data_1.context) { + // Check if the context is in a state where it can be disconnected + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + if (state == PA_CONTEXT_READY) { + pa_context_disconnect(shared_data_1.context); + } + pa_context_unref(shared_data_1.context); + shared_data_1.context = NULL; + } + if (shared_data_1.mainloop) { + pa_threaded_mainloop_free(shared_data_1.mainloop); + shared_data_1.mainloop = NULL; + } +} + +/** + * @brief Callback function used to retrieve the count of audio profiles for a specific card. + * + * This function is called by PulseAudio when querying for the list of profiles for a given card index. + * It sets the profile_count with the number of profiles available for the card. + * If there's an error or the list is exhausted, the function signals the mainloop to continue + * without further processing. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current card information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function, which contains the mainloop + * and the profile_count to be set. + */ +static void get_profile_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + + uint32_t *profile_count = (uint32_t *) userdata; + + // Handle errors in retrieving profile count. + if (eol < 0) { + fprintf(stderr, "Failed to get profile count.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // If we've reached the end of the list of profiles, signal the mainloop to continue. + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Set the profile_count with the number of profiles available for the card. + *profile_count = i->n_profiles; +} + + +/** + * @brief Retrieve the count of audio profiles for a specific card. + * + * This function queries PulseAudio to get a count of all available audio profiles + * for a specified card index. If PulseAudio is not initialized, the function attempts + * to initialize it. If there's an error in fetching the profile count or initializing + * PulseAudio, it returns UINT32_MAX. + * + * @param card_index The index of the card for which to retrieve the profile count. + * @return Count of audio profiles or UINT32_MAX on error. + */ +uint32_t get_profile_count(uint32_t card_index) { + uint32_t profile_count = 0; // Initialize profile count to zero. + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "get_profiles_count(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails. + } + } + + // Query PulseAudio for the list of audio profiles for the specified card. + // The callback get_profile_count_cb will populate the profile_count variable. + count_op = pa_context_get_card_info_by_index(shared_data_1.context, card_index, get_profile_count_cb, &profile_count); + + // Wait for the PulseAudio operation to complete. + iterate(count_op); + + return profile_count; // Return the total count of profiles. +} + +/** + * @brief Callback function used to populate the list of available audio sinks. + * + * This function is called for each audio sink found by PulseAudio when querying + * for the list of sinks. The function populates the `shared_sink_data` structure + * with `pa_sink_info` for each sink. When the list is exhausted or there's an error, + * the function exits without further processing. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio sink information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function. + */ +static void get_available_output_devices_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + (void) userdata; + + uint32_t *count = &shared_data_3.count; + + // Handle errors in retrieving sink information. + if (eol < 0) { + fprintf(stderr, "Failed to get sink info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // If we've reached the end of the list of sinks, mark the end and exit the callback. + if (eol > 0) { + shared_data_3.sinks[*count] = NULL; // Set the last element to NULL as sentinel + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Allocate memory for the pa_sink_info structure. + shared_data_3.sinks[*count] = malloc(sizeof(pa_sink_info)); + if (shared_data_3.sinks[*count] == NULL) { + fprintf(stderr, "Failed to allocate memory for sink info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Copy the pa_sink_info structure. + *(shared_data_3.sinks[*count]) = *i; + + // Duplicate the strings to ensure they remain valid. + if (i->name != NULL) { + shared_data_3.sinks[*count]->name = strdup(i->name); + } + if (i->description != NULL) { + shared_data_3.sinks[*count]->description = strdup(i->description); + } + + (*count)++; +} + +/** + * @brief Retrieve the list of available audio sinks for a specific card. + * + * This function queries PulseAudio to get a list of all available audio sinks + * for a specified card index. It dynamically allocates memory based on the count + * of sinks to store the list of sinks. + * If PulseAudio is not initialized, the function attempts to initialize it. + * + * @param card_index The index of the card for which to retrieve the sinks. + * @return Pointer to the first sink in the list or NULL on error. + */ +pa_sink_info **get_available_output_devices() { + pa_operation *op = NULL; + + // Using get_output_device_count() to obtain the number of sinks + uint32_t max_sinks = get_output_device_count(); + + // Allocate memory for pointers + shared_data_3.sinks = malloc((max_sinks + 1) * sizeof(pa_sink_info*)); + shared_data_3.count = 0; // Reset count + + // Check for successful memory allocation + if (!shared_data_3.sinks) { + fprintf(stderr, "Failed to allocate memory for sinks.\n"); + return NULL; + } + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_available_output_devices(): failed to initialize pulseaudio.\n"); + free(shared_data_3.sinks); + shared_data_3.sinks = NULL; + return NULL; + } + } + + + // Query PulseAudio for the list of available sinks for the specified card + op = pa_context_get_sink_info_list(shared_data_1.context, get_available_output_devices_cb, NULL); + + // Wait for the PulseAudio operation to complete + iterate(op); + + return shared_data_3.sinks; +} + +/** + * @brief Frees the memory allocated for an array of output devices (sinks). + * + * This function iterates over an array of `pa_sink_info` pointers, freeing the memory for + * each sink's name and description strings, followed by the sink structure itself. It concludes + * by freeing the memory for the array of pointers. + * + * @param sinks A pointer to the first element in an array of `pa_sink_info` pointers, which + * must be terminated with a NULL pointer. If NULL is passed, the function does nothing. + */ +void delete_output_devices(pa_sink_info **sinks) { + if (sinks == NULL) { + return; + } + + for (int i = 0; sinks[i] != NULL; ++i) { + if (sinks[i]->name) { + free((char*)sinks[i]->name); + } + if (sinks[i]->description) { + free((char*)sinks[i]->description); + } + free(sinks[i]); + } + + free(sinks); +} + +/** + * @brief Frees the memory allocated for an array of input devices (sources). + * + * This function iterates over an array of `pa_source_info` pointers, freeing the memory for + * each source's name and description strings, followed by the source structure itself. It concludes + * by freeing the memory for the array of pointers. + * + * @param sources A pointer to the first element in an array of `pa_source_info` pointers, which + * must be terminated with a NULL pointer. If NULL is passed, the function does nothing. + */ +void delete_input_devices(pa_source_info **sources) { + if (!sources) { + return; // Nothing to do if the pointer is NULL + } + + // Iterate through each source info and free its memory + for (int i = 0; sources[i] != NULL; i++) { + if (sources[i]->name) { + free((char*)sources[i]->name); + } + if (sources[i]->description) { + free((char*)sources[i]->description); + } + free(sources[i]); + } + + // Free the array of pointers itself + free(sources); +} + + +/** + * @brief Callback function used to count the available audio devices (cards). + * + * This function is called for each audio device found by PulseAudio when querying + * for the list of devices. The function increments the device_count for each device. + * When the list is exhausted or there's an error, it signals the mainloop to continue. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio device information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function. + */ +static void get_output_device_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + (void) i; + + uint32_t *device_count = (uint32_t *) userdata; + + if (eol < 0) { + // Handle error + //fprintf(stderr,"[DEBUG, get_output_device_count_cb()] Reached elo < 0. Signal triggered.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + if (eol > 0) { + // End of list + //fprintf(stderr,"[DEBUG, get_output_device_count_cb()] Reached elo > 0. Signal triggered.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + ++(*device_count); +} + + + +/** + * @brief Retrieve the count of audio devices in the system. + * + * This function queries PulseAudio to get a count of all available audio devices (cards). + * If PulseAudio is not initialized, the function attempts to initialize it. If the initialization + * fails or there's an error in fetching the device count, it returns UINT32_MAX. + * + * @return Count of audio devices or UINT32_MAX on error. + */ +uint32_t get_output_device_count(void) { + uint32_t device_count = 0; // Initialize device count to zero. + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "get_device_count(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails. + } + } + + // Check if context is valid after initialization attempt. + if (!shared_data_1.context) { + fprintf(stderr, "Context is NULL in get_device_count.\n"); + return UINT32_MAX; + } + + //fprintf(stderr,"[get_device_count()] context is, %p\n",&shared_data_1.context); + //fprintf(stderr,"[get_device_count()] mainloop is, %p\n",&shared_data_1.mainloop); + + // Query PulseAudio for the list of audio devices (cards). + // The callback get_device_count_cb will increment the device_count for each device found. + count_op = pa_context_get_card_info_list(shared_data_1.context, get_output_device_count_cb, &device_count); + + // Wait for the PulseAudio operation to complete. + iterate(count_op); + + return device_count; // Return the total count of devices. +} + +/** + * @brief Retrieves the minimum number of channels for the given ALSA device name. + * + * This function opens the specified ALSA device in capture mode, retrieves + * its hardware parameters, and then queries for the minimum number of channels + * supported by the device. + * + * @param alsa_name Name of the ALSA device. + * @return Minimum number of channels supported by the device or -1 on error. + */ +int get_min_input_channels(const char *alsa_id, const pa_source_info *source_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int min_channels = 0; + int err; + + if ((!alsa_id) && (!source_info)) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + //The input device was found, but there's no alsa information about it. + //Attempt to retrieve used channels instead. + else if((!alsa_id) && (source_info)) { + return source_info->sample_spec.channels; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK)) < 0) { + fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return source_info->sample_spec.channels; // Return channels from PulseAudio if ALSA fails + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return source_info->sample_spec.channels; + } + + if ((err = snd_pcm_hw_params_get_channels_min(params, &min_channels)) < 0) { + fprintf(stderr, "Error getting min channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return source_info->sample_spec.channels; + } + + snd_pcm_close(handle); + return min_channels; +} + + +/** + * @brief Retrieves the maximum number of channels for the given ALSA device name. + * + * This function opens the specified ALSA device in capture mode, retrieves + * its hardware parameters, and then queries for the maximum number of channels + * supported by the device. If ALSA fails, it will fall back to using the + * information from PulseAudio. + * + * @param alsa_name Name of the ALSA device. + * @param source_info Information about the PulseAudio source. + * @return Maximum number of channels supported by the device or -1 on error. + */ +int get_max_input_channels(const char *alsa_id, const pa_source_info *source_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int max_channels = 0; + int err; + + if ((!alsa_id) && (!source_info)) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + //The input device was found, but there's no alsa information about it. + //Attempt to retrieve used channels instead. + else if((!alsa_id) && (source_info)) { + return source_info->sample_spec.channels; + } + + // Try to open the ALSA device in capture mode + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK)) < 0) { + //fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + // ALSA failed, fall back to PulseAudio information + return source_info->sample_spec.channels; + } + + // Allocate hardware parameters object + snd_pcm_hw_params_alloca(¶ms); + + // Fill it in with default values + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return source_info->sample_spec.channels; + } + + // Get the maximum number of channels + if ((err = snd_pcm_hw_params_get_channels_max(params, &max_channels)) < 0) { + fprintf(stderr, "Error getting max channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return source_info->sample_spec.channels; + } + + // Close the device + snd_pcm_close(handle); + + return max_channels; +} + +/** + * @brief Retrieves the maximum number of channels for the given ALSA device name. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the maximum number of channels + * supported by the device. + * + * @param alsa_name Name of the ALSA device. + * @return Maximum number of channels supported by the device or -1 on error. + */ +int get_max_output_channels(const char *alsa_id, const pa_sink_info *sink_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int max_channels = 0; + int err; + + if ((!alsa_id) && (!sink_info)) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + //The input device was found, but there's no alsa information about it. + //Attempt to retrieve used channels instead. + else if((!alsa_id) && (sink_info)) { + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { + //fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return sink_info->sample_spec.channels; // Return channels from PulseAudio if ALSA fails + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + //fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_hw_params_get_channels_max(params, &max_channels)) < 0) { + //fprintf(stderr, "Error getting max channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + //fprintf(stderr, "[DEBUG, get_max_channels()] sink_info->sample_spec.channels is %i\n", sink_info->sample_spec.channels); + return sink_info->sample_spec.channels; + } + + snd_pcm_close(handle); + return max_channels; +} + +/** + * @brief Retrieves the minimum number of channels for the given ALSA device id. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the minimum number of channels + * supported by the device. + * + * @param alsa_name Name of the ALSA device. + * @return Minimum number of channels supported by the device or -1 on error. + */ +int get_min_output_channels(const char *alsa_id, const pa_sink_info *sink_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int min_channels = 0; + int err; + + //fprintf(stderr, "[DEBUG, get_min_output_channels()] sink_info->sample_spec.channels is %i\n", sink_info->sample_spec.channels); + + if ((!alsa_id) && (!sink_info)) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + //The input device was found, but there's no alsa information about it. + //Attempt to retrieve used channels instead. + else if((!alsa_id) && (sink_info)) { + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { + //fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return sink_info->sample_spec.channels; + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + //fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_hw_params_get_channels_min(params, &min_channels)) < 0) { + //fprintf(stderr, "Error getting min channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.channels; + } + + snd_pcm_close(handle); + return min_channels; +} + +/** + * @brief Callback function for retrieving the ALSA card name of a PulseAudio source. + * + * This callback is called by the PulseAudio context during the operation to retrieve + * information about each available source. It is registered with the + * pa_context_get_source_info_by_name() function call. + * + * @param c The PulseAudio context. + * @param i The source information structure containing details about the source. + * @param eol End of list indicator. If non-zero, indicates no more data to process. + * @param userdata User data provided when registering the callback. In this case, it is + * expected to be the name of the source for which we want the ALSA card name. + * + * @note This function is intended to be used internally and should not be called directly. + * + * @warning This function uses global shared data (shared_data_2.alsa_name) to store the + * retrieved ALSA name, and signals the main loop to stop waiting. Ensure that + * the main loop and shared data are properly managed. + */ +static void get_alsa_input_name_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; + + if (eol < 0 || !i) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; // Handle error or invalid source info + } + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; // End of list + } + + // Check if this source is the one we're interested in + if (userdata && strcmp(i->name, (const char *)userdata) == 0) { + const char *prop_alsa_card_name = pa_proplist_gets(i->proplist, "alsa.card_name"); + if (prop_alsa_card_name) { + shared_data_2.alsa_name = strdup(prop_alsa_card_name); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); // Signal to stop the loop + } + } +} + +/** + * @brief Retrieves the ALSA name of a given PulseAudio source. + * + * @param source_name The name of the source for which to retrieve the ALSA name. + * @return The ALSA name of the source or NULL if not found or on error. + */ +char* get_alsa_input_name(const char *source_name) { + if (!source_name) { + fprintf(stderr, "get_alsa_input_name(): Invalid source name.\n"); + return NULL; + } + + shared_data_2.alsa_name = NULL; // Ensure alsa_name is initialized to NULL + + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "get_alsa_input_name(): PulseAudio initialization failed.\n"); + return NULL; + } + + pa_operation *name_op = pa_context_get_source_info_by_name(shared_data_1.context, source_name, get_alsa_input_name_cb, (void*)source_name); + iterate(name_op); + + return shared_data_2.alsa_name; +} + + +/** + * @brief Callback function to retrieve the ALSA name from the card info. + * + * This callback checks for the "alsa.card_name" property in the card's + * proplist. If the property is found, it assigns the property's value + * to the shared data structure for further use. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the card info structure. + * @param eol Flag indicating end of list. + * @param userdata User-defined data pointer (unused in this callback). + */ +static void get_alsa_output_name_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + + if (eol) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + const char *target_sink_name = userdata; + if (target_sink_name && strcmp(target_sink_name, i->name) != 0) { + return; // Skip this sink, as it does not match the specified name + } + + const char *alsa_name = pa_proplist_gets(i->proplist, "alsa.card_name"); + if (alsa_name) { + shared_data_2.alsa_name = strdup(alsa_name); + if (!shared_data_2.alsa_name) { + fprintf(stderr, "Failed to allocate memory for ALSA name.\n"); + } + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } +} + + + +/** + * @brief Retrieves the ALSA name of the first audio device encountered. + * + * This function initializes PulseAudio (if not already initialized), then + * queries PulseAudio for the list of audio devices. It waits for the + * retrieval operation to complete and then returns the ALSA name + * of the first device it finds with the "alsa.card_name" property. + * + * @return ALSA name of the device or NULL if not found or on error. + */ +char* get_alsa_output_name(const char *sink_name) { + pa_operation *name_op; + + shared_data_2.alsa_name = NULL; // Ensure alsa_name is initialized to NULL + + + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "get_alsa_name(): PulseAudio initialization failed.\n"); + return NULL; + } + + name_op = pa_context_get_sink_info_list(shared_data_1.context, get_alsa_output_name_cb, (void*)sink_name); + iterate(name_op); + + return shared_data_2.alsa_name; +} + +/** + * @brief Callback function to retrieve the ALSA device string based on PulseAudio source information. + * + * This function is called for each available PulseAudio source. It checks if the source's name matches + * the target source name provided in the userdata. If a match is found, it retrieves the "alsa.card" and + * "alsa.device" properties from the source's proplist, constructs the ALSA device string in the format + * "hw:,", and stores it in shared data for later retrieval. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the source information structure. + * @param eol End of list flag. If non-zero, indicates the end of the source list. + * @param userdata User-defined data pointer. In this case, it points to the target source name string. + */ +static void get_alsa_input_id_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; // Unused parameter + + // Check for end of list + if (eol) { + // Signal the main loop to unblock the iterate function + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + free(userdata); + return; + } + + // Retrieve the target source name from userdata + const char *target_source_name = (const char *)userdata; + + // Skip this source if it does not match the specified target name + if (target_source_name && strcmp(target_source_name, i->name) != 0) { + return; + } + + // Attempt to retrieve the "alsa.card" and "alsa.device" properties + const char *alsa_card = pa_proplist_gets(i->proplist, "alsa.card"); + const char *alsa_device = pa_proplist_gets(i->proplist, "alsa.device"); + + //print_proplist(i->proplist); + //printf("[DEBUG, get_alsa_input_id_cb] alsa_card is %s\n", alsa_card); + //printf("[DEBUG, get_alsa_input_id_cb] alsa_device is %s\n", alsa_device); + + // Construct the ALSA device string if both properties are available + if (alsa_card && alsa_device && isdigit((unsigned char)alsa_device[0])) { + char alsa_device_string[128]; + snprintf(alsa_device_string, sizeof(alsa_device_string), "hw:%s,%s", alsa_card, alsa_device); + + // Store the ALSA device string in shared data + shared_data_2.alsa_id = strdup(alsa_device_string); + if (!shared_data_2.alsa_id) { + fprintf(stderr, "Failed to allocate memory for ALSA device id.\n"); + } + } else { + // Log an error if ALSA properties are not found or are invalid + //fprintf(stderr, " - ALSA properties not found or invalid for source.\n"); + shared_data_2.alsa_id = NULL; + } + + // Signal the main loop to unblock the iterate function + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + +/** + * @brief Retrieves the ALSA device string for a given PulseAudio source name. + * + * This function initializes PulseAudio (if not already initialized), then queries PulseAudio for the + * information of a specific source by its name. It waits for the retrieval operation to complete and then + * returns the constructed ALSA device string based on the "alsa.card" and "alsa.device" properties of + * the source. + * + * @param source_name The name of the PulseAudio source. + * @return ALSA device string in the format "hw:," or NULL if not found or on error. + */ +char* get_alsa_input_id(const char *source_name) { + // Operation object for asynchronous PulseAudio calls + pa_operation *op; + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_alsa_input_id(): PulseAudio initialization failed.\n"); + return NULL; + } + } + + // Duplicate the source name to ensure it remains valid throughout the operation + char *source_name_copy = strdup(source_name); + if (!source_name_copy) { + fprintf(stderr, "get_alsa_input_id(): Failed to allocate memory for source name.\n"); + return NULL; + } + + // Start querying PulseAudio for the specified source information + op = pa_context_get_source_info_by_name(shared_data_1.context, source_name_copy, get_alsa_input_id_cb, source_name_copy); + + // Block and wait for the operation to complete + iterate(op); + + // After the callback has been called with the source information, the ALSA device ID will be stored + // Return the stored ALSA device ID + return shared_data_2.alsa_id; +} + + + +/** + * @brief Callback function to retrieve the ALSA device string based on the PulseAudio sink information. + * + * This function is called for each available PulseAudio sink. It checks if the sink's name matches the + * target sink name provided in the userdata. If a match is found, it retrieves the "alsa.card" and + * "alsa.device" properties from the sink's proplist, constructs the ALSA device string in the format + * "hw:,", and stores it in shared data for later retrieval. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the sink information structure. + * @param eol End of list flag. If non-zero, indicates the end of the sink list. + * @param userdata User-defined data pointer. In this case, it points to the target sink name string. + */ +static void get_alsa_output_id_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; // Unused parameter + + // Check for end of list + if (eol) { + // Signal the main loop to unblock the iterate function + //fprintf(stderr,"[DEBUG, get_alsa_id_cb()] End of function reached.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + free(userdata); + return; + } + + // Retrieve the target sink name from userdata + const char *target_sink_name = userdata; + + // If a target sink name is provided, check if it matches the current sink's name + if (target_sink_name && strcmp(target_sink_name, i->name) != 0) { + return; // Skip this sink, as it does not match the specified name + } + + // Attempt to retrieve the "alsa.card" and "alsa.device" properties + const char *alsa_card = pa_proplist_gets(i->proplist, "alsa.card"); + const char *alsa_device = pa_proplist_gets(i->proplist, "alsa.device"); + + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()], alsa.card is %s\n", alsa_card); + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()], alsa.device is %s\n", alsa_device); + + // Check if both properties are available and alsa.device is a digit + if (alsa_card && alsa_device && isdigit((unsigned char)alsa_device[0])) { + // Construct the ALSA device string + char alsa_device_string[128]; + snprintf(alsa_device_string, sizeof(alsa_device_string), "hw:%s,%s", alsa_card, alsa_device); + + // Store the ALSA device string in shared data + shared_data_2.alsa_id = strdup(alsa_device_string); + if (!shared_data_2.alsa_id) { + fprintf(stderr, "Failed to allocate memory for ALSA device id.\n"); + } + } else { + shared_data_2.alsa_id = NULL; + //fprintf(stderr, " - ALSA properties not found or invalid for sink.\n"); + } + + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()] alsa ID is %s\n", shared_data_2.alsa_id); + + // Signal the main loop to unblock the iterate function + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + + +/** + * @brief Retrieves the ALSA device string for a given PulseAudio sink name. + * + * This function initializes PulseAudio (if not already initialized), then queries PulseAudio for the + * information of a specific sink by its name. It waits for the retrieval operation to complete and then + * returns the constructed ALSA device string based on the "alsa.card" and "alsa.device" properties of + * the sink. + * + * @param sink_name The name of the PulseAudio sink. + * @return ALSA device string in the format "hw:," or NULL if not found or on error. + */ +char* get_alsa_output_id(const char *sink_name) { + pa_operation *op; + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_alsa_id(): PulseAudio initialization failed.\n"); + return NULL; + } + } + + // Make a copy of the sink name to ensure it remains valid + char *sink_name_copy = strdup(sink_name); + if (!sink_name_copy) { + fprintf(stderr, "get_alsa_id(): Failed to allocate memory for sink name.\n"); + return NULL; + } + + // Query PulseAudio for the information of the specified sink + //fprintf(stderr,"[DEBUG, get_alsa_id()] sink name is: %s\n", sink_name_copy); + op = pa_context_get_sink_info_by_name(shared_data_1.context, sink_name_copy, get_alsa_output_id_cb, sink_name_copy); + + // Wait for the PulseAudio operation to complete + iterate(op); + + // Return the ALSA device string retrieved by the callback function + return shared_data_2.alsa_id; +} + + +/** + * @brief Retrieves the sample rate of the specified PulseAudio source by ALSA identifier. + * + * Attempts to open the ALSA device corresponding to the given PulseAudio source + * to query the sample rate. If the ALSA query fails, the function falls back to + * returning the sample rate as reported by the PulseAudio source information. + * + * @param alsa_id The ALSA device identifier corresponding to the PulseAudio source. + * @param source_info The PulseAudio source information structure. + * @return The sample rate of the source in Hz on success, or -1 on error. + */ +int get_input_sample_rate(const char *alsa_id, pa_source_info *source_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int sample_rate = 0; // Default to a known value + int err; + + // Output debug information to stderr + //fprintf(stderr, "[DEBUG, get_input_sample_rate()] called with alsa_id: '%s'\n", alsa_id); + + // If alsa_id is NULL, return the PulseAudio rate + if (!alsa_id && source_info) { + //fprintf(stderr, "alsa_id is NULL, returning PulseAudio sample rate: %u Hz\n", source_info->sample_spec.rate); + return source_info->sample_spec.rate; + } + + // Validate parameters + if (!alsa_id || !source_info) { + //fprintf(stderr, "Invalid parameters provided to get_input_sample_rate.\n"); + return -1; + } + + // Attempt to open the ALSA device + //fprintf(stderr, "[DEBUG, get_input_sample_rate()] Attempting to open ALSA device: '%s'\n", alsa_id); + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK)) < 0) { + fprintf(stderr, "Unable to open PCM device: '%s', error: %s\n", alsa_id, snd_strerror(err)); + return source_info->sample_spec.rate; + } + + // ALSA device successfully opened + //fprintf(stderr, "ALSA device: '%s' successfully opened.\n", alsa_id); + snd_pcm_hw_params_alloca(¶ms); + + // Initialize hardware parameters + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the access type for the hardware parameters + if ((err = snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { + fprintf(stderr, "Cannot set access type: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the sample format for the hardware parameters + if ((err = snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE)) < 0) { + fprintf(stderr, "Cannot set sample format: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the channel count for the hardware parameters + if ((err = snd_pcm_hw_params_set_channels(handle, params, source_info->sample_spec.channels)) < 0) { + fprintf(stderr, "Cannot set channel count: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Apply the hardware parameters to the device + if ((err = snd_pcm_hw_params(handle, params)) < 0) { + fprintf(stderr, "Cannot set hardware parameters: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Now try to get the sample rate + if ((err = snd_pcm_hw_params_get_rate(params, &sample_rate, 0)) < 0) { + fprintf(stderr, "Error getting sample rate for device: '%s', error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Sample rate successfully obtained + //fprintf(stderr, "Sample rate for ALSA device: '%s' is %u Hz\n", alsa_id, sample_rate); + snd_pcm_close(handle); + return sample_rate; // Successfully obtained sample rate +} + + + +/** + * @brief Retrieves the sample rate of the given ALSA device. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the sample rate. + * + * @param alsa_id Name of the ALSA device. + * @param sink_info Pointer to a PulseAudio sink_info structure. + * @return Sample rate of the device or -1 on error. + */ +/** + * @brief Retrieves the sample rate of the specified PulseAudio sink by ALSA identifier. + * + * Attempts to open the ALSA device corresponding to the given PulseAudio sink + * to query the sample rate. If the ALSA query fails, the function falls back to + * returning the sample rate as reported by the PulseAudio sink information. + * + * @param alsa_id The ALSA device identifier corresponding to the PulseAudio sink. + * @param sink_info The PulseAudio sink information structure. + * @return The sample rate of the sink in Hz on success, or -1 on error. + */ +int get_output_sample_rate(const char *alsa_id, const pa_sink_info *sink_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int sample_rate = 0; // Default to a known value + int err; + + //fprintf(stderr, "[DEBUG, get_output_sample_rate()] called with alsa_id: '%s'\n", alsa_id); + + if (!alsa_id && sink_info) { + //fprintf(stderr, "alsa_id is NULL, returning PulseAudio sample rate: %u Hz\n", sink_info->sample_spec.rate); + return sink_info->sample_spec.rate; + } + + if (!alsa_id || !sink_info) { + //fprintf(stderr, "Invalid parameters provided to get_output_sample_rate.\n"); + return -1; + } + + //fprintf(stderr, "Attempting to open ALSA device: '%s'\n", alsa_id); + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, 0)) < 0) { + fprintf(stderr, "Unable to open PCM device: '%s', error: %s\n", alsa_id, snd_strerror(err)); + return sink_info->sample_spec.rate; + } + + //fprintf(stderr, "ALSA device: '%s' successfully opened.\n", alsa_id); + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the access type for the hardware parameters + if ((err = snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { + fprintf(stderr, "Cannot set access type: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the sample format for the hardware parameters + if ((err = snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE)) < 0) { + fprintf(stderr, "Cannot set sample format: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the channel count for the hardware parameters + if ((err = snd_pcm_hw_params_set_channels(handle, params, sink_info->sample_spec.channels)) < 0) { + fprintf(stderr, "Cannot set channel count: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Apply the hardware parameters to the device + if ((err = snd_pcm_hw_params(handle, params)) < 0) { + fprintf(stderr, "Cannot set hardware parameters: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Now try to get the sample rate + if ((err = snd_pcm_hw_params_get_rate(params, &sample_rate, 0)) < 0) { + fprintf(stderr, "Error getting sample rate for device: '%s', error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + //fprintf(stderr, "Sample rate for ALSA device: '%s' is %u Hz\n", alsa_id, sample_rate); + snd_pcm_close(handle); + return sample_rate; // Successfully obtained sample rate +} + + +// Callback for source information to get ports +void get_source_ports(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; + + pa_source_info_list *info_list = (pa_source_info_list *)userdata; + if (eol > 0) { + info_list->done = 1; + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + info_list->ports = realloc(info_list->ports, (info_list->num_ports + 1) * sizeof(pa_port_info)); + pa_port_info *port = &info_list->ports[info_list->num_ports]; + port->name = strdup(i->name); + port->description = strdup(i->description); + port->is_active = 0; // Will be set in the active port callback + + info_list->num_ports++; +} + +// Callback for source information to get the active port +void get_active_port(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; + pa_source_info_list *info_list = (pa_source_info_list *)userdata; + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (i->active_port) { + for (int j = 0; j < info_list->num_ports; ++j) { + if (strcmp(info_list->ports[j].name, i->active_port->name) == 0) { + info_list->ports[j].is_active = 1; + break; + } + } + } +} + +// Function to collect source port information and return it +pa_source_info_list* get_source_port_info() { + pa_source_info_list* info_list = malloc(sizeof(pa_source_info_list)); + if (!info_list) { + // Handle malloc failure + return NULL; + } + memset(info_list, 0, sizeof(pa_source_info_list)); + + // Call the function to get the list of sources + pa_operation *op = pa_context_get_source_info_list(shared_data_1.context, get_source_ports, info_list); + iterate(op); + + // Now iterate over the collected sources and get detailed info for each one + for (int i = 0; i < info_list->num_ports; ++i) { + op = pa_context_get_source_info_by_name(shared_data_1.context, info_list->ports[i].name, get_active_port, info_list); + + iterate(op); + } + + // The info_list now contains all the ports and their active status + return info_list; +} + + +/** + * @brief Retrieves the volume of a given channel from a PulseAudio sink. + * + * This function takes a pointer to a pa_sink_info structure and a channel index + * and returns the volume of that channel. The volume is given as a pa_volume_t, + * which is an unsigned 32-bit integer. The function checks if the channel index + * is within the valid range for the sink. + * + * @param sink_info A pointer to a pa_sink_info structure containing the sink details. + * @param channel_index The index of the channel for which to retrieve the volume. + * @return The volume of the specified channel as a pa_volume_t, or PA_VOLUME_INVALID on error. + */ +pa_volume_t get_channel_volume(const pa_sink_info *sink_info, unsigned int channel_index) { + // Check if the sink_info is NULL + if (sink_info == NULL) { + return PA_VOLUME_INVALID; // Return invalid volume if sink_info is NULL + } + + // Check if the provided channel index is valid + if (channel_index >= sink_info->channel_map.channels) { + return PA_VOLUME_INVALID; // Return invalid volume if the channel_index is out of range + } + + // Retrieve the volume of the given channel + return sink_info->volume.values[channel_index]; +} + + + +/** + * @brief Callback function for processing each available audio input device (source) found. + * + * This function is called by the PulseAudio context as part of the operation initiated by + * `get_available_input_devices`. It is invoked for each source found, and is responsible for + * storing the details of each source into a dynamically allocated array. The function handles + * memory allocation for the array of `pa_source_info` structures, as well as for the strings + * within them. It also handles error conditions and signals the mainloop to terminate the wait + * when the end of the source list is reached or an error occurs. + * + * @param c The PulseAudio context. + * @param i The `pa_source_info` structure containing details about the current source. + * @param eol End-Of-List indicator. If positive, indicates the end of the list; if negative, indicates an error. + * @param userdata User data pointer provided during the context operation setup; unused in this callback. + */ +static void get_available_input_devices_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void)c; // Unused parameter + (void)userdata; // Unused parameter + + // Error or end of list + if (eol < 0) { + fprintf(stderr, "Error occurred while getting source info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (eol > 0) { + shared_data_sources.sources[shared_data_sources.count] = NULL; // Sentinel value + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (shared_data_sources.count >= shared_data_sources.allocated) { + size_t new_alloc = shared_data_sources.allocated + 8; + void *temp = realloc(shared_data_sources.sources, new_alloc * sizeof(pa_source_info *)); + if (!temp) { + fprintf(stderr, "Out of memory when reallocating sources array.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + shared_data_sources.sources = temp; + shared_data_sources.allocated = new_alloc; + } + + shared_data_sources.sources[shared_data_sources.count] = malloc(sizeof(pa_source_info)); + if (!shared_data_sources.sources[shared_data_sources.count]) { + fprintf(stderr, "Out of memory when allocating source info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + *(shared_data_sources.sources[shared_data_sources.count]) = *i; + + if (i->name) { + shared_data_sources.sources[shared_data_sources.count]->name = strdup(i->name); + if (!shared_data_sources.sources[shared_data_sources.count]->name) { + fprintf(stderr, "Out of memory when duplicating source name.\n"); + } + } + if (i->description) { + shared_data_sources.sources[shared_data_sources.count]->description = strdup(i->description); + if (!shared_data_sources.sources[shared_data_sources.count]->description) { + fprintf(stderr, "Out of memory when duplicating source description.\n"); + } + } + + shared_data_sources.count++; +} + + +/** + * @brief Retrieves an array of available audio input devices (sources). + * + * This function queries the PulseAudio server for a list of all audio input devices + * currently available. It ensures that PulseAudio is initialized before making the query + * and locks the main loop to provide thread safety during the operation. + * + * Each call to this function should be followed by a call to `delete_input_devices` + * to free the allocated memory for the returned array of `pa_source_info` pointers. + * + * @note The array is terminated with a NULL pointer as the last element. + * + * @return On success, a pointer to an array of `pa_source_info` pointers, each representing + * an audio input device. On failure, or if PulseAudio is not initialized, NULL is returned. + */ +pa_source_info **get_available_input_devices() { + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "Failed to initialize PulseAudio.\n"); + return NULL; + } + } + + // Initialize the data structure for storing the sources + shared_data_sources.sources = NULL; + shared_data_sources.count = 0; + shared_data_sources.allocated = 0; + + // Start the operation to get available input devices + pa_operation *op = pa_context_get_source_info_list(shared_data_1.context, get_available_input_devices_cb, NULL); + if (op) { + // iterate handles locking, waiting, and cleanup + iterate(op); + } else { + fprintf(stderr, "Failed to create the operation to get source info.\n"); + return NULL; + } + + // Allocate one extra pointer to NULL at the end as a sentinel + shared_data_sources.sources = realloc(shared_data_sources.sources, (shared_data_sources.count + 1) * sizeof(pa_source_info *)); + if (shared_data_sources.sources) { + shared_data_sources.sources[shared_data_sources.count] = NULL; // Set the sentinel value + } else { + fprintf(stderr, "Out of memory while allocating sources array.\n"); + } + + return shared_data_sources.sources; +} + + +/** + * @brief Callback function used to count the available audio input devices (sources). + * + * This function is called for each audio input device found by PulseAudio when querying + * for the list of sources. The function increments the device_count for each device. + * When the list is exhausted or there's an error, it signals the mainloop to continue. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio input device information. + * @param eol End-Of-List indicator. If positive, indicates the end of the list; if negative, indicates an error. + * @param userdata Pointer to the user data, which in this case is expected to be a pointer to the device_count. + */ +static void get_input_device_count_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; // Suppress unused parameter warning + (void) i; // Suppress unused parameter warning + + uint32_t *device_count = (uint32_t *) userdata; + + if (eol < 0) { + // Handle error + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + if (eol > 0) { + // End of list + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + ++(*device_count); +} + + +/** + * @brief Retrieve the count of audio input devices in the system. + * + * This function queries PulseAudio to get a count of all available audio input devices (sources). + * If PulseAudio is not initialized, the function attempts to initialize it. If the initialization + * fails or there's an error in fetching the device count, it returns UINT32_MAX. + * + * @return Count of audio input devices or UINT32_MAX on error. + */ +uint32_t get_input_device_count(void) { + uint32_t device_count = 0; // Initialize device count to zero + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_input_device_count(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails + } + } + + // Check if context is valid after initialization attempt + if (!shared_data_1.context) { + fprintf(stderr, "Context is NULL in get_input_device_count.\n"); + return UINT32_MAX; + } + + // Query PulseAudio for the list of audio input devices (sources) + count_op = pa_context_get_source_info_list(shared_data_1.context, get_input_device_count_cb, &device_count); + + // Wait for the PulseAudio operation to complete + iterate(count_op); + + return device_count; // Return the total count of input devices +} + + +/** + * @brief Get the channel names for a specific sink identified by its name. + * + * This function retrieves the channel names for a given sink using its unique name. + * It allocates an array of strings where each entry corresponds to a channel name + * of the sink. The caller is responsible for freeing the memory allocated for the + * array of channel names and the strings themselves. + * + * @param sink_name The name of the sink whose channel names are to be retrieved. + * @param num_channels Number of channels of the sink. + * @return A pointer to an array of strings containing the channel names, or NULL if + * the sink is not found or in case of an error. + */ +char** get_output_channel_names(const char *pulse_id, int num_channels) { + // Validate input parameters + if (!pulse_id) { + return NULL; // Return NULL if the sink name is not provided + } + + // Retrieve the sink information for the specified sink name + pa_sink_info *device_info = get_output_device_by_name(pulse_id); + + // Check if the sink was found + if (!device_info) { + return NULL; // Return NULL if the sink is not found or in case of an error + } + + char **channel_names = calloc(num_channels, sizeof(char*)); + + if (!channel_names) { + free((char *)device_info->description); // Free the description if allocated + free(device_info); // Free the device_info structure + return NULL; // Return NULL if memory allocation fails + } + + // Copy the channel names into the array + for (int i = 0; i < num_channels; ++i) { + channel_names[i] = strdup(pa_channel_position_to_pretty_string(device_info->channel_map.map[i])); + if (!channel_names[i]) { + // Handle allocation failure for a channel name + // Free all previously allocated names and the array itself + while (i--) free(channel_names[i]); + free(channel_names); + free((char *)device_info->description); // Free the description if allocated + free(device_info); // Free the device_info structure + return NULL; // Return NULL if memory allocation fails + } + } + + // Free the sink_info structure and its description field + if (device_info->description) { + free((char *)device_info->description); // Corrected free statement + } + free(device_info); + + // Return the array of channel names + return channel_names; +} + +/** + * @brief Get the channel names for a specific source identified by its name. + * + * This function retrieves the channel names for a given source using its unique name. + * It allocates an array of strings where each entry corresponds to a channel name + * of the source. The caller is responsible for freeing the memory allocated for the + * array of channel names and the strings themselves. + * + * @param source_name The name of the source whose channel names are to be retrieved. + * @param num_channels Number of channels of the source. + * @return A pointer to an array of strings containing the channel names, or NULL if + * the source is not found or in case of an error. + */ +char** get_input_channel_names(const char *pulse_code, int num_channels) { + // Validate input parameters + if (!pulse_code) { + return NULL; // Return NULL if the source name is not provided + } + + // Retrieve the source information for the specified source name + pa_source_info *device_info = get_input_device_by_name(pulse_code); + + // Check if the source was found + if (!device_info) { + return NULL; // Return NULL if the source is not found or in case of an error + } + + char **channel_names = calloc(num_channels, sizeof(char*)); + if (!channel_names) { + free((char *)device_info->description); // Free the description if allocated + free(device_info); // Free the device_info structure + return NULL; // Return NULL if memory allocation fails + } + + // Copy the channel names into the array + for (int i = 0; i < num_channels; ++i) { + channel_names[i] = strdup(pa_channel_position_to_pretty_string(device_info->channel_map.map[i])); + if (!channel_names[i]) { + // Handle allocation failure for a channel name + while (i--) free(channel_names[i]); // Free all previously allocated names + free(channel_names); // Free the array itself + free((char *)device_info->description); // Free the description if allocated + free(device_info); // Free the device_info structure + return NULL; // Return NULL if memory allocation fails + } + } + + // Free the source_info structure and its description field + if (device_info->description) { + free((char *)device_info->description); + } + free(device_info); + + // Return the array of channel names + return channel_names; +} + +/** + * @brief Retrieve a source (input device) information by its name. + * + * This function searches for an audio source with the given name and returns its information + * if found. The caller is responsible for freeing the memory allocated for the source info + * and its description. + * + * @param source_name The name of the source to be retrieved. + * @return A pointer to a pa_source_info structure containing the source information, + * or NULL if the source is not found or in case of an error. + */ +pa_source_info *get_input_device_by_name(const char *source_name) { + if (!source_name) { + return NULL; // Handle null pointer argument + } + + // Retrieve the list of available input devices (sources) + pa_source_info **available_sources = get_available_input_devices(); + if (!available_sources) { + return NULL; // Handle error in retrieving sources + } + + pa_source_info *input_device_info = NULL; + + // Iterate over the list of sources to find the one with the matching name + for (int i = 0; available_sources[i] != NULL; ++i) { + if (strcmp(available_sources[i]->name, source_name) == 0) { + // Found the matching source, make a copy of the source_info structure + input_device_info = malloc(sizeof(pa_source_info)); + if (input_device_info) { + memcpy(input_device_info, available_sources[i], sizeof(pa_source_info)); + + // If the source has a description, also copy that string + if (available_sources[i]->description) { + input_device_info->description = strdup(available_sources[i]->description); + } + } + break; // Exit the loop after finding the matching source + } + } + + // Clean up the source information now that we're done with it + // Assuming there's a function to delete input devices similar to delete_output_devices + delete_input_devices(available_sources); + + return input_device_info; // Return the found source or NULL if not found +} + + + +/** + * @brief Retrieve a copy of the sink information for a given sink name. + * + * This function searches through the available output devices and returns a copy of the + * pa_sink_info structure for the sink that matches the provided name. It uses the + * get_available_output_devices function to obtain the list of all sinks and then + * iterates through them to find the sink with the given name. + * + * @param sink_name The name of the sink to search for. Must not be NULL. + * @return A pointer to a newly allocated pa_sink_info structure containing the sink + * information, or NULL if the sink is not found or if an error occurs. The + * caller is responsible for freeing the returned structure and its description + * field (if not NULL) when no longer needed. + * + * @note The function allocates memory for the returned pa_sink_info structure and its + * description field. It is the responsibility of the caller to free this memory + * using free(). If the sink has other dynamically allocated fields, these must + * also be freed by the caller. + * + * @warning The function returns NULL if the sink_name argument is NULL, or if the + * get_available_output_devices function fails to retrieve the sinks. + * + * Usage Example: + * @code + * pa_sink_info *sink_info = get_sink_by_name("alsa_output.pci-0000_00_1b.0.analog-stereo"); + * if (sink_info) { + * // Use the sink information + * ... + * // Free the memory allocated for the description + * if (sink_info->description) { + * free(sink_info->description); + * } + * // Free the memory allocated for the sink_info structure + * free(sink_info); + * } + * @endcode + */ +pa_sink_info *get_output_device_by_name(const char *sink_name) { + if (!sink_name) { + return NULL; // Handle null pointer argument + } + + // Retrieve the list of available output devices (sinks) + pa_sink_info **available_sinks = get_available_output_devices(); + if (!available_sinks) { + return NULL; // Handle error in retrieving sinks + } + + pa_sink_info *output_device_to_return = NULL; + + // Iterate over the list of sinks to find the one with the matching name + for (int i = 0; available_sinks[i] != NULL; ++i) { + if (strcmp(available_sinks[i]->name, sink_name) == 0) { + // Found the matching output_device, make a copy of the sink_info structure + output_device_to_return = malloc(sizeof(pa_sink_info)); + if (output_device_to_return) { + memcpy(output_device_to_return, available_sinks[i], sizeof(pa_sink_info)); + + // If the sink has a description, also copy that string + if (available_sinks[i]->description) { + output_device_to_return->description = strdup(available_sinks[i]->description); + } + } + break; // Exit the loop after finding the matching sink + } + } + + // Clean up the sink information now that we're done with it + delete_output_devices(available_sinks); + + return output_device_to_return; // Return the found sink or NULL if not found +} + +/** + * @brief Callback for handling the result of the sink information fetch operation. + * + * This callback is called by the PulseAudio library when sink information is ready to be + * retrieved, or when the iteration over sinks has finished. The function will copy the sink + * information to the provided user data structure if available, or signal the main loop to + * continue if the end of the list is reached or if an error occurs. + * + * @param c The PulseAudio context. + * @param i The sink information structure provided by PulseAudio. + * @param eol End of list indicator. If positive, indicates the end of the list; if negative, + * indicates failure to retrieve sink information. + * @param userdata User data pointer provided to the pa_context_get_sink_info_by_index function, + * expected to be a pointer to a pa_sink_info structure. + */ +static void get_output_device_by_index_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + + pa_sink_info *sink_info = userdata; + + if (eol < 0 || eol > 0 || !i) { + // Either an error occurred, or we've reached the end of the list without finding the sink + // Signal main loop to continue in case of end of list + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } + return; + } + + // Copy the sink information to the allocated structure + *sink_info = *i; // Shallow copy first + + // Now duplicate any strings + if (i->name) { + sink_info->name = strdup(i->name); + } + if (i->description) { + sink_info->description = strdup(i->description); + } + + // Signal the main loop that the data is ready + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + +/** + * @brief Retrieve the sink information for a given output device by its index. + * + * This function initiates an asynchronous operation to fetch the sink information + * for the specified device index. The operation is handled synchronously within this + * function using a threaded mainloop to wait for completion. + * + * @param index The index of the sink for which information is to be retrieved. + * @param sink_info A pointer to a pa_sink_info structure where the sink information will be stored. + * @return int Returns 1 on success or 0 if the operation fails. + * + */ +pa_sink_info* get_output_device_by_index(uint32_t index) { + if (!shared_data_1.context || !shared_data_1.mainloop) { + fprintf(stderr, "Invalid shared data context or mainloop.\n"); + return NULL; + } + + // Allocate memory for sink_info + pa_sink_info *sink_info = malloc(sizeof(pa_sink_info)); + if (!sink_info) { + fprintf(stderr, "Memory allocation for sink_info failed.\n"); + return NULL; + } + + // Start the operation to get the sink information + pa_operation *op = pa_context_get_sink_info_by_index(shared_data_1.context, index, get_output_device_by_index_cb, sink_info); + iterate(op); + + // Check if the operation was successful + if (sink_info->name == NULL) { + // The operation was not successful, free the allocated memory. + free(sink_info); + return NULL; + } + + return sink_info; // Return the allocated sink_info +} + +/** + * @brief Callback for retrieving information about a specific audio input source by index. + * + * This function is the callback used by `pa_context_get_source_info_by_index` within + * the `get_input_device_by_index` function to handle the response from PulseAudio. + * It is called by the PulseAudio main loop when the source information is available or + * when an error or end-of-list condition is signaled. + * + * @param c Pointer to the PulseAudio context, not used in this callback. + * @param i Pointer to the source information structure containing the details of the source. + * @param eol End-of-list flag that is positive if there is no more data to process, negative + * if an error occurred during the iteration. + * @param userdata User data provided when initiating the operation; expected to be a pointer + * to a `pa_source_info` structure where the source information will be stored. + * + */ +static void get_input_device_by_index_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; + + pa_source_info *source_info = userdata; + + if (eol < 0 || eol > 0 || !i) { + // Either an error occurred, or we've reached the end of the list without finding the source + if (eol != 0) { + // Signal main loop to continue + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } + return; + } + + // Copy the source information to the allocated structure + *source_info = *i; // Shallow copy first + + // Now duplicate any strings + if (i->name) { + source_info->name = strdup(i->name); + } + if (i->description) { + source_info->description = strdup(i->description); + } + + // Signal the main loop that the data is ready + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + +/** + * @brief Retrieves the information of an audio input device (source) by its index. + * + * This function attempts to allocate memory for a `pa_source_info` structure and retrieve + * the information for the specified source index using PulseAudio's API. It blocks until + * the asynchronous operation to fetch the source information is complete or an error occurs. + * + * @param index The index of the input device (source) as recognized by PulseAudio. + * @return A pointer to the allocated `pa_source_info` structure containing the source + * information, or NULL if the operation failed or the specified index was not valid. + * The caller is responsible for freeing the allocated structure and any associated + * strings when they are no longer needed. + * + */ +pa_source_info* get_input_device_by_index(uint32_t index) { + if (!shared_data_1.context || !shared_data_1.mainloop) { + fprintf(stderr, "Invalid shared data context or mainloop.\n"); + return NULL; + } + + // Allocate memory for source_info + pa_source_info *source_info = malloc(sizeof(pa_source_info)); + if (!source_info) { + fprintf(stderr, "Memory allocation for source_info failed.\n"); + return NULL; + } + + // Start the operation to get the source information + pa_operation *op = pa_context_get_source_info_by_index(shared_data_1.context, index, get_input_device_by_index_cb, source_info); + iterate(op); + + // Check if the operation was successful + if (source_info->name == NULL) { + // The operation was not successful, free the allocated memory. + free(source_info); + return NULL; + } + + return source_info; // Return the allocated source_info +} + +/** + * @brief Callback function for getting the default output device from the PulseAudio server. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the server information structure. + * @param userdata The user data passed to the callback function, which is a pointer to a char*. + */ +static void get_default_output_cb(pa_context *c, const pa_server_info *i, void *userdata) { + //fprintf(stderr, "[DEBUG, get_default_output()] Callback reached.\n"); + + (void)c; // Unused parameter + + char **default_sink_name = (char**)userdata; + + // Always signal the mainloop to unblock the iterate function, even if i is NULL + if (!i) { + fprintf(stderr, "Failed to get default sink information.\n"); + } else if (i->default_sink_name) { + // Duplicate the name string to our output variable + *default_sink_name = strdup(i->default_sink_name); + } + + // Signal the mainloop to unblock the iterate function, regardless of the outcome + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + + +/** + * @brief Retrieves the name of the default sink (output device) in the system. + * + * This function checks if PulseAudio is initialized and if not, tries to initialize it. + * Then, it queries the PulseAudio server for the default output device and waits for + * the operation to complete. + * + * @param mainloop A pointer to the mainloop structure. + * @param context A pointer to the PulseAudio context. + * @return A dynamically allocated string containing the default sink name, or NULL on error. + * The caller is responsible for freeing this string. + */ +char* get_default_output(pa_context *context) { + + //fprintf(stderr,"[DEBUG, get_default_output()] Function reached.\n"); + + // Check if PulseAudio is initialized, and if not, initialize it + if (!is_pulse_initialized()) { + if (!initialize_pulse()) { + fprintf(stderr, "Failed to initialize PulseAudio.\n"); + return NULL; + } + } + + char *default_sink_name = NULL; + + // Start the operation to get the default sink + pa_operation *op = pa_context_get_server_info(context, get_default_output_cb, &default_sink_name); + + if (op) { + // Wait for the operation to complete using the iterate function + iterate(op); // This function should handle the waiting and signaling + // pa_operation_unref(op); is called inside iterate, no need to call here + } else { + fprintf(stderr, "Failed to create the operation to get server info.\n"); + } + + return default_sink_name; // Caller must free this string +} +/** + * @brief Callback function for getting the default input device from the PulseAudio server. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the server information structure. + * @param userdata The user data passed to the callback function, which is a pointer to a char*. + */ +static void get_default_input_cb(pa_context *c, const pa_server_info *i, void *userdata) { + (void)c; // Unused parameter + + char **default_source_name = (char**)userdata; + + //fprintf(stderr, "[DEBUG, get_default_input_cb()] callback reached.\n"); + + if (!i) { + fprintf(stderr, "Failed to get default source information.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (i->default_source_name) { + // Duplicate the name string to our output variable + *default_source_name = strdup(i->default_source_name); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); // Signal to stop the loop + } +} + + +/** + * @brief Retrieves the name of the default source (input device) in the system. + * + * This function queries the PulseAudio server for all available input devices + * and iterates through them to find the one that is in the RUNNING state, + * which typically indicates that it is the default source being used by the system. + * The name of the default source is then returned. + * + * @note The caller is responsible for freeing the memory allocated for the + * returned source name using the standard free() function to avoid memory leaks. + * + * @return A pointer to a dynamically allocated string containing the name of + * the default source. If no active default source is found or in case of an error, + * NULL is returned. + */ +char* get_default_input(pa_context *context) { + + //fprintf(stderr, "[DEBUG, get_default_input()] Function reached.\n"); + + // Check if PulseAudio is initialized, and if not, initialize it + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "Failed to initialize PulseAudio.\n"); + return NULL; + } + + char *default_source_name = NULL; + + // Start the operation to get the default source + pa_operation *op = pa_context_get_server_info(context, get_default_input_cb, &default_source_name); + iterate(op); + + return default_source_name; // Caller must free this string +} + +/** + * @brief Fetches all profiles associated with a given sound card. + * + * This function queries the PulseAudio server for all profiles associated with the sound card + * specified by the card_index. It blocks until all profiles are fetched or an error occurs. + * + * @param pa_ctx A pointer to the initialized pa_context representing the connection to the PulseAudio server. + * @param card_index The index of the sound card for which to fetch profiles. + * @param num_profiles A pointer to an integer where the number of fetched profiles will be stored. + * @return A pointer to an array of pa_card_profile_info2 structures containing the profile info. + * This pointer must be freed by the caller. NULL is returned if an error occurs. + */ +void get_profiles_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + (void) userdata; + + if (eol < 0) { + fprintf(stderr, "Failed to fetch profiles.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (eol > 0) { + // All profiles have been fetched, the operation is complete + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Reallocate memory for profiles array to add new profiles + shared_data_4.profiles = realloc(shared_data_4.profiles, sizeof(pa_card_profile_info2) * (shared_data_4.num_profiles + i->n_profiles)); + + // Now copy the profiles from the PulseAudio provided array + for (unsigned int j = 0; j < i->n_profiles; ++j) { + shared_data_4.profiles[shared_data_4.num_profiles + j] = i->profiles[j]; + } + + // Update the number of profiles fetched + shared_data_4.num_profiles += i->n_profiles; +} + + + +/** + * @brief Fetches all profiles associated with a given sound card. + * + * This function queries the PulseAudio server for all profiles associated with the sound card + * specified by the card_index. It blocks until all profiles are fetched or an error occurs. + * + * @param pa_ctx A pointer to the initialized pa_context representing the connection to the PulseAudio server. + * @param card_index The index of the sound card for which to fetch profiles. + * @param num_profiles A pointer to an integer where the number of fetched profiles will be stored. + * @return A pointer to an array of pa_card_profile_info2 structures containing the profile info. + * This pointer must be freed by the caller. NULL is returned if an error occurs. + */ +pa_card_profile_info *get_profiles(pa_context *pa_ctx, uint32_t card_index) { + // Reset the static global variable before use + free(shared_data_4.profiles); + shared_data_4.profiles = NULL; + shared_data_4.num_profiles = 0; + + // Start the operation to fetch the profiles + pa_operation *op = pa_context_get_card_info_by_index(pa_ctx, card_index, get_profiles_cb, NULL); + + // Wait for the operation to complete + iterate(op); + + return shared_data_4.profiles; // Return the static global profiles array +} + +/** + * Callback function for retrieving the mute status of a sink. + * + * This callback is provided to the PulseAudio context as part of a request + * to obtain information about a particular sink. It will be called by the + * PulseAudio main loop when the sink information is available. The end of list + * (eol) parameter indicates whether the data received is the last in the list. + * + * @param c A pointer to the PulseAudio context. + * @param i A pointer to the sink information structure. + * @param eol An end-of-list flag that is positive if there is no more data to process. + * @param userdata A pointer to user data, expected to be a pointer to an integer that + * will be set to the mute status of the sink. + * + * @note The function sets the integer pointed to by `userdata` to the mute state + * of the sink. The mute state is non-zero when the sink is muted and zero + * when it is not muted. This function is not intended to be called directly + * by the user but as a callback from the PulseAudio API when + * pa_context_get_sink_info_by_name() is called. + */ +static void get_muted_output_status_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + + //fprintf(stderr, "[DEBUG, get_muted_output_status_cb]: inside callback.\n"); + + // If eol is set to a positive number, you're at the end of the list + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + //fprintf(stderr, "[DEBUG, get_muted_output_status_cb]: leaving callback.\n"); + return; + } + + // If eol is negative, an error occurred + if (eol < 0) { + int err = pa_context_errno(c); // Retrieve the error number from the context + fprintf(stderr, "[ERROR, get_muted_output_status_cb]: Error occurred during iteration - %s\n", pa_strerror(err)); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Cast the userdata to a boolean pointer + int *is_muted = (int *)userdata; + + // If the sink information is valid, set is_muted to the sink's mute state + if (i) { + *is_muted = i->mute; + } +} + + + +/** + * Queries the mute status of a specified output sink. + * + * This function initiates an asynchronous operation to retrieve the mute status + * of the sink specified by `sink_name`. It requires a valid `pulseaudio_manager` + * instance that has been previously initialized with a mainloop and context. + * The function blocks until the operation is complete or an error occurs. + * + * @param self A pointer to the initialized `pulseaudio_manager` instance. + * @param sink_name The name of the sink whose mute status is being queried. + * + * @return Returns 1 if the sink is muted, 0 if not muted, and -1 if an error + * occurred or the sink was not found. In the case of an error, an + * appropriate message will be printed to standard error. + * + * @note The function uses `iterate` to block and process the mainloop until + * the operation is complete. It is assumed that `iterate` and + * `get_muted_output_status_cb` are implemented elsewhere and are + * responsible for iterating the mainloop and handling the callback + * from the sink information operation, respectively. + */ +int get_muted_output_status(const char *sink_name) { + + //fprintf(stderr,"[DEBUG, get_muted_output_status()] sink_name is %s\n", sink_name); + + if (!shared_data_1.mainloop || !shared_data_1.context || !sink_name) { + fprintf(stderr, "Invalid arguments provided.\n"); + return -1; + } + + pa_operation *op = NULL; + int is_muted = -1; // Default to -1 in case of error or sink not found + + // Start a PulseAudio operation to get information about the sink + op = pa_context_get_sink_info_by_name(shared_data_1.context, sink_name, get_muted_output_status_cb, &is_muted); + iterate(op); + + // -1 will be returned if the sink was not found or another error occurred + return is_muted; +} + +/** + * @brief Callback function for retrieving the mute status of an audio input source. + * + * This callback is invoked by the PulseAudio main loop when the source information + * becomes available. It is used as part of an asynchronous operation initiated by + * `get_muted_input_status` to obtain the mute status of a specified audio source. + * The `eol` parameter indicates if the data received is the last in the list or if + * an error has occurred during the iteration. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the source information structure containing details of the source. + * @param eol End-of-list flag that is positive if there is no more data to process, + * negative if an error occurred during the iteration. + * @param userdata User data provided when initiating the operation; expected to be a + * pointer to an integer that will be set to the mute status of the source. + * + */ +static void get_muted_input_status_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + //fprintf(stderr, "[DEBUG, get_muted_input_status_cb]: inside callback.\n"); + + // If eol is set to a positive number, you're at the end of the list + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + //fprintf(stderr, "[DEBUG, get_muted_input_status_cb]: leaving callback.\n"); + return; + } + + // If eol is negative, an error occurred + if (eol < 0) { + int err = pa_context_errno(c); // Retrieve the error number from the context + fprintf(stderr, "[ERROR, get_muted_input_status_cb]: Error occurred during iteration - %s\n", pa_strerror(err)); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Cast the userdata to a boolean pointer + int *is_muted = (int *)userdata; + + // If the source information is valid, set is_muted to the source's mute state + if (i) { + *is_muted = i->mute; + } +} + + +/** + * @brief Queries the mute status of a specified audio input (source). + * + * This function initiates an asynchronous operation to retrieve the mute status + * of the source specified by `source_name`. It requires a valid PulseAudio mainloop + * and context to have been previously initialized and stored in shared_data_1. + * The function blocks until the operation is complete or an error occurs. + * + * @param source_name The name of the source whose mute status is being queried. + * This should be the exact name as recognized by PulseAudio. + * + * @return int Returns 1 if the source is muted, 0 if not muted, and -1 if an error + * occurred or the source was not found. In the case of an error, an + * appropriate message will be printed to standard error. + * + */ +int get_muted_input_status(const char *source_name) { + //fprintf(stderr,"[DEBUG, get_muted_input_status()] source_name is %s\n", source_name); + + if (!shared_data_1.mainloop || !shared_data_1.context || !source_name) { + fprintf(stderr, "Invalid arguments provided.\n"); + return -1; + } + + pa_operation *op = NULL; + int is_muted = -1; // Default to -1 in case of error or source not found + + // Start a PulseAudio operation to get information about the source + op = pa_context_get_source_info_by_name(shared_data_1.context, source_name, get_muted_input_status_cb, &is_muted); + iterate(op); + + // -1 will be returned if the source was not found or another error occurred + return is_muted; +} + + +/** + * @brief Callback function for handling sink information response. + * + * This function is called by the PulseAudio main loop when the information about a sink + * is available. It processes the sink information and stores the index of the sink in the + * provided userdata pointer. + * + * @param c Pointer to the PulseAudio context. + * @param info Pointer to the sink information structure. + * @param eol End-of-list flag indicating if there are more entries to process. + * @param userdata Pointer to user data where the sink index will be stored. + */ +static void get_output_device_index_by_code_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + + uint32_t *index_ptr = (uint32_t *) userdata; + + if (eol < 0) { + fprintf(stderr, "Error occurred in sink_info_cb.\n"); + return; + } + + if (!eol && info) { + *index_ptr = info->index; + } + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + +/** + * @brief Callback function for handling source information response. + * + * This function is called by the PulseAudio main loop when the information about a source + * is available. It processes the source information and stores the index of the source in the + * provided userdata pointer. + * + * @param c Pointer to the PulseAudio context. + * @param info Pointer to the source information structure. + * @param eol End-of-list flag indicating if there are more entries to process. + * @param userdata Pointer to user data where the source index will be stored. + */ +static void get_input_device_index_by_code_cb(pa_context *c, const pa_source_info *info, int eol, void *userdata) { + (void) c; + + uint32_t *index_ptr = (uint32_t *) userdata; + + if (eol < 0) { + fprintf(stderr, "Error occurred in source_info_cb.\n"); + return; + } + + if (!eol && info) { + *index_ptr = info->index; + } + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + +/** + * @brief Retrieves the index of an input device based on its code (PulseAudio name). + * + * This function initiates an asynchronous operation to get information about an input device (source) + * based on its PulseAudio name. The function requires a valid PulseAudio context and a callback to + * process the source information once it's received. It waits for the completion of the operation + * and returns the index of the source. + * + * @param context Pointer to the initialized PulseAudio context. + * @param device_code The pulseaudio code of the source whose index is to be retrieved. + * @return The index of the input device if found, or UINT32_MAX if not found or in case of error. + */ +uint32_t get_input_device_index_by_code(pa_context *context, const char *device_code) { + + // Initializing the result variable. + uint32_t index = 0; + + if (!context || !device_code) { + fprintf(stderr, "Invalid arguments.\n"); + return UINT32_MAX; + } + + pa_operation *op = pa_context_get_source_info_by_name(context, device_code, get_input_device_index_by_code_cb, &index); + iterate(op); + + return index; +} + +/** + * @brief Retrieves the index of an output device based on its code (PulseAudio name). + * + * This function initiates an asynchronous operation to get information about an output device (sink) + * based on its PulseAudio name. The function requires a valid PulseAudio context and a callback to + * process the sink information once it's received. It waits for the completion of the operation + * and returns the index of the sink. + * + * @param context Pointer to the initialized PulseAudio context. + * @param device_code The pulseaudio code of the sink whose index is to be retrieved. + * @return The index of the output device if found, or UINT32_MAX if not found or in case of error. + */ +uint32_t get_output_device_index_by_code(pa_context *context, const char *device_code) { + + //Initializing the result variable. + uint32_t index = 0; + + if (!context || !device_code) { + fprintf(stderr, "Invalid arguments.\n"); + return UINT32_MAX; + } + + pa_operation *op = pa_context_get_sink_info_by_name(context, device_code, get_output_device_index_by_code_cb, &index); + iterate(op); + + return index; +} + diff --git a/v-0.10/system_query.h b/v-0.10/system_query.h new file mode 100644 index 0000000..d8a52c6 --- /dev/null +++ b/v-0.10/system_query.h @@ -0,0 +1,95 @@ +//Header definition files to query about sound card properties (number of sinks, profiles...) +#ifndef SYSTEM_QUERY_H +#define SYSTEM_QUERY_H + +#include +#include +#include +#include + +//Structures to get source port information (e.g, line in, microphone...) +//Used by get_source_port_info, get_active_port, and get_source_ports. +typedef struct pa_port_info { + char *name; // Port name + char *description; // Port description + bool is_active; // Is this the active port +} pa_port_info; + +typedef struct pa_source_info_list { + pa_port_info *ports; // Array of ports + int num_ports; // Number of ports + bool done; // Indicates if the callback has been called +} pa_source_info_list; + +void print_proplist(const pa_proplist *p); // Utility function to print all properties in the proplist +uint32_t get_output_device_count(void); //Gets the number of output devices in the system. +uint32_t get_input_device_count(void); //Gets the number of input devices in the system. +uint32_t get_profile_count(uint32_t card_index); //Gets the number of profiles for a given soundcard. +pa_sink_info **get_available_output_devices(); //Gets the total available sinks (output devices) for this system. +pa_source_info **get_available_input_devices(); //Gets the total available sources (input devices) for this system. + +char* get_alsa_input_name(const char *source_name); //Gets the corresponding alsa name of a pulseaudio source (input device). +char* get_alsa_output_name(const char *sink_name); //Gets the corresponding alsa name of a pulseaudio sink (output device). + +pa_source_info *get_input_device_by_name(const char *source_name); //Gets alsa name of a pulseaudio source (input device) by its name. + +pa_sink_info* get_output_device_by_index(uint32_t index); //Gets alsa name of a pulseaudio sink (output device) by its index. +pa_source_info* get_input_device_by_index(uint32_t index); //Gets alsa name of a pulseaudio source (output device) by its index. + +pa_source_info_list* get_source_port_info(); //Returns which ports in the source are available (mic, line in...). + + +char** get_input_channel_names(const char *pulse_id, +int num_channels); //Returns the channel names of an input device. +char** get_output_channel_names(const char *pulse_id, +int num_channels); //Returns the channel names of an output device. + +int get_min_input_channels(const char *alsa_id, +const pa_source_info *source_info); //Gets the maximum output channels an ALSA card supports. + +int get_max_input_channels(const char *alsa_id, +const pa_source_info *source_info); //Gets the maximum output channels an ALSA card supports. + +int get_max_output_channels(const char *alsa_id, +const pa_sink_info *sink_info); //Gets the maximum output channels an ALSA card supports. + +int get_min_output_channels(const char *alsa_id, +const pa_sink_info *sink_info); //Gets the maximum output channels an ALSA card supports. + +char* get_alsa_input_id(const char *source_name); //Gets the alsa input id based on the pulseaudio channel name. + +char* get_alsa_output_id(const char *sink_name); //Gets the alsa output id based on the pulseaudio channel name. + +int get_output_sample_rate(const char *alsa_id, +const pa_sink_info *sink_info); //Gets the sample rate of a pulseaudio sink (output device). + +int get_input_sample_rate(const char *alsa_id, +pa_source_info *source_info); //Gets the sample rate of a pulseaudio source (input device). + +pa_sink_info *get_output_device_by_name(const char *sink_name); //Gets output device by name. + +uint32_t get_output_device_index_by_code(pa_context *context, +const char *device_code); //Gets index of an output device by its code (pulseaudio name). + +uint32_t get_input_device_index_by_code(pa_context *context, +const char *device_code); //Gets index of an output device by its code (pulseaudio name). + + +void delete_output_devices(pa_sink_info **sinks); //Releases memory for allocated output devices. +void delete_input_devices(pa_source_info **sources); //Releases memory for allocated input devices. +pa_volume_t get_channel_volume(const pa_sink_info *sink_info, +unsigned int channel_index); //Retrieves the volume of a given channel. + +char* get_default_output(pa_context *context); //Gets default output device (default sink). + +char* get_default_input(pa_context *context); //Gets default input device (default source). + +pa_card_profile_info *get_profiles(pa_context *pa_ctx, +uint32_t card_index); //Gets pulseaudio profiles. + +int get_muted_output_status(const char *sink_name); //Queries whether a given audio output (sink) is muted or not. + +int get_muted_input_status(const char *source_name); //Queries whether a given audio input (source) is muted or not. + + +#endif From c228aa51d066346f8a3163d1a5dd92384cd25f7b Mon Sep 17 00:00:00 2001 From: NMagic Date: Sun, 12 Nov 2023 15:18:55 -0300 Subject: [PATCH 15/20] Sample rate functions, stability fixes. --- v-0.11/Makefile | 20 + .../pa_context -- interface overview.docx | Bin 0 -> 33970 bytes .../pavucontrol sink update flow.txt | 41 + .../pulseaudio/introspect.c summary | 79 + .../pulseaudio/mainloop code flow.txt | 17 + v-0.11/easypulse_core.c | 892 +++++ v-0.11/easypulse_core.h | 102 + v-0.11/examples/Makefile | 19 + v-0.11/examples/alsa-mapper_pulseaudio-api | Bin 0 -> 125912 bytes v-0.11/examples/alsa-mapper_pulseaudio-api.c | 91 + v-0.11/examples/change-speaker-mode | Bin 0 -> 111632 bytes v-0.11/examples/change-speaker-mode.c | 94 + v-0.11/examples/change_global_sample_rate | Bin 0 -> 112152 bytes v-0.11/examples/change_global_sample_rate.c | 47 + .../examples/get-card-profiles-pulseaudio_api | Bin 0 -> 119312 bytes .../get-card-profiles-pulseaudio_api.c | 63 + v-0.11/examples/mute_input_demo | Bin 0 -> 118000 bytes v-0.11/examples/mute_input_demo.c | 89 + v-0.11/examples/mute_output_demo | Bin 0 -> 118000 bytes v-0.11/examples/mute_output_demo.c | 89 + v-0.11/examples/print-input-sources | Bin 0 -> 119112 bytes v-0.11/examples/print-input-sources.c | 92 + v-0.11/examples/print_volume_output_devices | Bin 0 -> 118624 bytes v-0.11/examples/print_volume_output_devices.c | 72 + v-0.11/examples/switch-input-devices | Bin 0 -> 117888 bytes v-0.11/examples/switch-input-devices.c | 84 + v-0.11/examples/switch-output-device | Bin 0 -> 117760 bytes .../examples/switch-output-device-pulseaudio | Bin 0 -> 120840 bytes .../switch-output-device-pulseaudio.c | 62 + v-0.11/examples/switch-output-device.c | 47 + v-0.11/examples/volume-change | Bin 0 -> 117824 bytes v-0.11/examples/volume-change-pulseaudio | Bin 0 -> 120768 bytes v-0.11/examples/volume-change-pulseaudio.c | 101 + v-0.11/examples/volume-change.c | 67 + v-0.11/libeasypulse_core.a | Bin 0 -> 44396 bytes v-0.11/system_query.c | 2867 +++++++++++++++++ v-0.11/system_query.h | 101 + 37 files changed, 5136 insertions(+) create mode 100644 v-0.11/Makefile create mode 100644 v-0.11/documentation/pa_context -- interface overview.docx create mode 100644 v-0.11/documentation/pavucontrol/pavucontrol sink update flow.txt create mode 100644 v-0.11/documentation/pulseaudio/introspect.c summary create mode 100644 v-0.11/documentation/pulseaudio/mainloop code flow.txt create mode 100644 v-0.11/easypulse_core.c create mode 100644 v-0.11/easypulse_core.h create mode 100644 v-0.11/examples/Makefile create mode 100755 v-0.11/examples/alsa-mapper_pulseaudio-api create mode 100644 v-0.11/examples/alsa-mapper_pulseaudio-api.c create mode 100755 v-0.11/examples/change-speaker-mode create mode 100644 v-0.11/examples/change-speaker-mode.c create mode 100755 v-0.11/examples/change_global_sample_rate create mode 100644 v-0.11/examples/change_global_sample_rate.c create mode 100755 v-0.11/examples/get-card-profiles-pulseaudio_api create mode 100644 v-0.11/examples/get-card-profiles-pulseaudio_api.c create mode 100755 v-0.11/examples/mute_input_demo create mode 100644 v-0.11/examples/mute_input_demo.c create mode 100755 v-0.11/examples/mute_output_demo create mode 100644 v-0.11/examples/mute_output_demo.c create mode 100755 v-0.11/examples/print-input-sources create mode 100644 v-0.11/examples/print-input-sources.c create mode 100755 v-0.11/examples/print_volume_output_devices create mode 100644 v-0.11/examples/print_volume_output_devices.c create mode 100755 v-0.11/examples/switch-input-devices create mode 100644 v-0.11/examples/switch-input-devices.c create mode 100755 v-0.11/examples/switch-output-device create mode 100755 v-0.11/examples/switch-output-device-pulseaudio create mode 100644 v-0.11/examples/switch-output-device-pulseaudio.c create mode 100644 v-0.11/examples/switch-output-device.c create mode 100755 v-0.11/examples/volume-change create mode 100755 v-0.11/examples/volume-change-pulseaudio create mode 100644 v-0.11/examples/volume-change-pulseaudio.c create mode 100644 v-0.11/examples/volume-change.c create mode 100644 v-0.11/libeasypulse_core.a create mode 100644 v-0.11/system_query.c create mode 100644 v-0.11/system_query.h diff --git a/v-0.11/Makefile b/v-0.11/Makefile new file mode 100644 index 0000000..b1c5107 --- /dev/null +++ b/v-0.11/Makefile @@ -0,0 +1,20 @@ +CC = gcc +CFLAGS = -Wall -g -Wextra + +LIB_NAME = easypulse_core +LIB_SRC = easypulse_core.c +LIB_OBJ = easypulse_core.o +LIB_OUT = lib$(LIB_NAME).a + +all: $(LIB_OUT) + +$(LIB_OUT): $(LIB_OBJ) + ar rcs $(LIB_OUT) $(LIB_OBJ) + +$(LIB_OBJ): $(LIB_SRC) + $(CC) $(CFLAGS) -c $(LIB_SRC) -o $(LIB_OBJ) + +clean: + rm -f $(LIB_OBJ) $(LIB_OUT) + +.PHONY: all clean diff --git a/v-0.11/documentation/pa_context -- interface overview.docx b/v-0.11/documentation/pa_context -- interface overview.docx new file mode 100644 index 0000000000000000000000000000000000000000..6cbe2d09c38dfcab843409c88d5b9d8666c90192 GIT binary patch literal 33970 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 literal 0 HcmV?d00001 diff --git a/v-0.11/documentation/pavucontrol/pavucontrol sink update flow.txt b/v-0.11/documentation/pavucontrol/pavucontrol sink update flow.txt new file mode 100644 index 0000000..9428de8 --- /dev/null +++ b/v-0.11/documentation/pavucontrol/pavucontrol sink update flow.txt @@ -0,0 +1,41 @@ ++----------------+ +| pavucontrol | +| (initial file)| ++----------------+ + | + | Callback function triggered when there's info/change related to a sink + V ++----------------+ +| sink_cb | +| (pavucontrol.cc)| ++----------------+ + | + | - If error, show error and return + | - If end-of-list (eol) is reached, decrease outstanding tasks count and return + | - Update GUI representation of a sink using w->updateSink() + V ++---------------------------+ +| MainWindow::updateSink | +| (mainwindow.cc & .h) | ++---------------------------+ + | + | - Retrieve or create SinkWidget for the sink + | - Update SinkWidget properties (e.g., volume, mute state, active port, etc.) + | - Prepare context menu for the sink + | - Ensure the sink is displayed correctly via updateDeviceVisibility + V ++-------------------------------------+ +| MainWindow::updateDeviceVisibility | +| (mainwindow.cc & .h) | ++-------------------------------------+ + | + | - If idle source/callback is already queued, return + | - Schedule the idle_cb function to be called when the app is idle + V ++----------------+ +| idle_cb | +| (mainwindow.cc)| ++----------------+ + | + V + ... (Specific steps and logic for updating device visibility) diff --git a/v-0.11/documentation/pulseaudio/introspect.c summary b/v-0.11/documentation/pulseaudio/introspect.c summary new file mode 100644 index 0000000..d9616f2 --- /dev/null +++ b/v-0.11/documentation/pulseaudio/introspect.c summary @@ -0,0 +1,79 @@ +* !pa_tagstruct_eof (context_string_callback): this function seems to be a callback function for processing string responses from the server. It examines the incoming command and checks for errors. If there's an error or if the command isn't a reply, it sets the success flag to 0 and prepares an empty response string. If the command is a reply, it extracts the response string from the tag structure. If there's any issue with extracting the string or if there's unexpected data in the tag structure, it flags a protocol error. + +* pa_context_stat: this function sends a simple command to request statistics. It leverages another function pa_context_send_simple_command and provides the context_stat_callback as the callback function to handle the response. It's used to retrieve statistical information. + +* pa_context_get_server_info: similar to the previous function, this function sends a command to get server information. It again uses pa_context_send_simple_command, but this time with a different callback, context_get_server_info_callback, to process the server information response. + +* context_get_sink_info_callback: this function is a callback that processes information about a sink. It first ensures that the operation and context are valid. If the received command is not a reply, it handles the error. If it is a reply, it starts parsing the sink information from the tag structure, extracting details like the sink's name, description, sample specification, channel map, owner module, volume, mute status, monitor source, latency, and more. The function seems to account for different versions of the context and extracts varying levels of information based on that. + +* pa_tagstruct_getu32: this function seems to be a snippet or part of another function and is possibly not a standalone function. It attempts to retrieve a 32-bit unsigned integer from a tag structure. If unsuccessful, it returns an error indicating a protocol issue. + +* pa_context_get_sink_info_list: this function sends a command to retrieve a list of sink information. It utilizes the pa_context_send_simple_command function and provides the context_get_sink_info_callback as the callback to process the list of sinks. + +* pa_context_get_sink_info_by_index: this function requests information about a specific sink identified by its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SINK_INFO) with the specified sink index and sends it to the server. The response from the server is expected to be handled by the context_get_sink_info_callback. + +* pa_context_get_sink_info_by_name: similar to the previous function, this one requests information about a sink, but it identifies the sink by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SINK_INFO) with the specified sink name to the server. The server's response will be processed by the context_get_sink_info_callback. + +* pa_context_set_sink_port_by_index: this function is designed to set the port for a specific sink identified by its index. After some validity checks, it builds a command (PA_COMMAND_SET_SINK_PORT) with the given sink index and port information, then sends this command to the server. The acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_sink_port_by_name: this function sets the port of a sink based on its name. It first performs some validation checks, then constructs a command with the sink's name and desired port. This command is sent to the PulseAudio server, and the response will be handled by a generic acknowledgment callback. + +* context_get_source_info_callback: this callback function processes information about a source. It starts by performing some initializations and checks. If the received command is a reply, it begins parsing the source information from the tag structure. This includes extracting details like the source's name, description, sample specification, volume, mute status, latency, and more. It appears to accommodate different versions of the context, extracting varying levels of information based on that. + +* pa_context_get_source_info_list: this function sends a command to retrieve a list of source information. It employs the pa_context_send_simple_command function, providing the context_get_source_info_callback as the callback to process the list of sources. + +* pa_context_get_source_info_by_index: this function retrieves information about a specific audio source based on its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source index and sends it to the server. The response from the server is expected to be handled by the context_get_source_info_callback. + +* pa_context_get_source_info_by_name: similar to the previous function, this one retrieves information about a source but identifies the source by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source name to the server. The server's response is again expected to be processed by the context_get_source_info_callback. + +* pa_context_set_source_port_by_index: this function sets the port of a specific source based on its index. After performing some validity checks and ensuring that the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source index. This command is sent to the server, and the acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_source_port_by_name: this function is designed to set the port of a specific audio source based on its name. It constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source name and sends this command to the PulseAudio server. The server's response will be handled by a generic acknowledgment callback. + +* context_get_client_info_callback: This callback function processes client-related information. It first performs checks to ensure the received command is a reply. If it is, the function begins parsing the client information, extracting details like client index, name, owner module, and driver. The function appears to be prepared to handle multiple client records in the same response and will loop through them until the end of the tag structure. + +* pa_context_get_client_info: this function requests information about a specific client based on its index. It constructs and sends a command (PA_COMMAND_GET_CLIENT_INFO) with the specified client index to the server. The server's response is expected to be processed by the context_get_client_info_callback. + +* pa_context_get_client_info_list: this function requests a list of client information from the PulseAudio server. It utilizes the pa_context_send_simple_command function and specifies the PA_COMMAND_GET_CLIENT_INFO_LIST command. The response from the server is expected to be handled by the context_get_client_info_callback. + + +* card_info_free: this is a utility function designed to free the memory associated with a pa_card_info structure. It releases memory for various properties and profiles associated with the card, such as its property list (proplist), profiles (profiles), and extended profile information (profiles2). + +* fill_card_port_info: this function populates the port information for a given card. It starts by extracting the number of ports (n_ports) for the card from a tag structure. If the card has ports, it then proceeds to fill in details about each port. If there's a protocol error while fetching the details, it returns an error. + +* fill_card_profile_info: this function is responsible for populating the profile information of a given card. It begins by allocating memory for the profiles and then proceeds to iterate through each profile, extracting details like name, description, number of sinks, number of sources, and priority. It also accounts for different versions of the context, fetching additional details if the version is >= 29. + + +* context_get_card_info_callback: this callback function processes card-related information. It starts by performing initialization checks and then examines the received command. If the command is a reply, the function starts parsing card details like index, name, owner module, driver, and the number of profiles. It then calls the fill_card_profile_info function to populate the profiles for the card. If there are any protocol errors during this process, the function handles them accordingly. + + +* pa_tagstruct_get_proplist: This function seems to be a snippet or a partial representation of a larger function. Its purpose appears to be to extract a property list (proplist) from a tag structure. If there's any issue during this extraction, it flags an error. + + +* pa_context_get_card_info_by_index: this function requests information about a specific card based on its index. After performing several validity checks, it constructs a command (PA_COMMAND_GET_CARD_INFO) with the specified card index and sends it to the server. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_by_name: similar to the previous function, this one requests information about a card, but it identifies the card by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_CARD_INFO) with the specified card name to the server. Again, the server's response is expected to be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_list: this function requests a list of all card information from the PulseAudio server. It employs the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_CARD_INFO_LIST command. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_set_card_profile_by_index: this function sets the profile of a specific card based on its index. After checking the validity of the context and ensuring the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the specified card index and desired profile. This command is sent to the server, and the response is handled by a generic acknowledgment callback. + +* pa_context_set_card_profile_by_name: this function sets the profile of a card identified by its name. Like the previous function, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the card name and desired profile, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_module_info_callback: this callback function processes module-related information. It checks if the received command is a reply and, if so, starts parsing the module details. This includes extracting details like the module's index, name, argument, and usage count. If there's an error or unexpected end of file in the tag structure, it flags a protocol error. + +* pa_context_get_module_info: this function retrieves information about a specific module based on its index. After conducting various validity checks, it constructs a command (PA_COMMAND_GET_MODULE_INFO) with the specified module index and sends it to the server. The response from the server will be processed by the context_get_module_info_callback. + +* pa_context_get_module_info_list: this function requests a list of all module information from the PulseAudio server. It uses the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_MODULE_INFO_LIST command. The server's response will be processed by the context_get_module_info_callback. + +* context_get_sink_input_info_callback: this callback function processes information related to sink inputs. It checks if the received command is a reply and, if so, starts parsing the sink input details. This includes extracting details like the sink input's index, name, owner module, client, sink, sample specification, channel map, volume, buffer usec, sink usec, resample method, driver, and more. It also accounts for different versions of the context, extracting varying levels of information based on that. + +* pa_context_set_source_output_volume: this function sets the volume of a specific source output based on its index. It starts by performing various checks, including verifying the validity of the provided volume. It then constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_VOLUME) with the specified source output index and volume and sends it to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_set_source_output_mute: this function mutes or unmutes a specific source output based on its index. It constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_MUTE) with the desired mute status and the source output index, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_sample_info_callback: this callback function processes sample-related information. It checks if the received command is a reply and, if so, begins parsing the sample details, extracting attributes like the sample's index, name, volume, mute status, proplist, and more. The function also handles possible protocol errors and is prepared to process multiple sample records in the same response. + +* pa_context_suspend_source_by_index: this function suspends or resumes a specific source based on its index. It verifies the server version, constructs a command (PA_COMMAND_SUSPEND_SOURCE) with the desired suspend status and source index, and then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_send_message_to_object: this function sends a message to a specific object within the PulseAudio server. After checking the server version and other conditions, it constructs a command (PA_COMMAND_SEND_OBJECT_MESSAGE) with the object's path, the message, and any additional parameters. The server's response will be processed by a callback function. diff --git a/v-0.11/documentation/pulseaudio/mainloop code flow.txt b/v-0.11/documentation/pulseaudio/mainloop code flow.txt new file mode 100644 index 0000000..f4c8b96 --- /dev/null +++ b/v-0.11/documentation/pulseaudio/mainloop code flow.txt @@ -0,0 +1,17 @@ ++---------------------------------------------+ +| Mainloop | +| | +| +--------------+ +-------------------+ | +| | I/O Events | | Timers | | +| +--------------+ +-------------------+ | +| | +| +--------------+ +-------------------+ | +| | Signals | | Deferred Callbacks| | +| +--------------+ +-------------------+ | +| | +| +---------------------+ | +| | Other Asynchronous | | +| | Tasks | | +| +---------------------+ | +| | ++---------------------------------------------+ diff --git a/v-0.11/easypulse_core.c b/v-0.11/easypulse_core.c new file mode 100644 index 0000000..607b8a8 --- /dev/null +++ b/v-0.11/easypulse_core.c @@ -0,0 +1,892 @@ +/** + * @file easypulse_core.c + * @brief Implementation of the easypulse core functions. + * + * This file provides the core functionality to interact with PulseAudio, + * allowing operations like setting the default device and adjusting volume. + */ + +#include "easypulse_core.h" +#include "system_query.h" +#include +#include +#include +#include +#include +#include +#include + +#define DAEMON_CONF "/etc/pulse/daemon.conf" +#define MAX_LINE_LENGTH 1024 + + +static bool manager_initialize(pulseaudio_manager *self); +static void iterate(pulseaudio_manager *manager, pa_operation *op); + +//Shared data between manager_switch_default_output and its callbacks +typedef struct _shared_data_1 { + pulseaudio_manager *manager; + uint32_t new_index; //Index of the new default sink. + +} shared_data_1; + +/** + * @brief Creates a new pulseaudio_manager instance. + * + * This function allocates memory for a new pulseaudio_manager instance and initializes it. + * It allocates memory for the output and input devices based on the current system state, + * and initializes the PulseAudio context and mainloop. It also sets the active output and + * input devices. + * + * If any memory allocation or initialization operation fails, the function cleans up any + * resources that were successfully allocated or initialized, and returns NULL. + * + * @return A pointer to the newly created pulseaudio_manager instance, or NULL if the + * creation failed. + */ +pulseaudio_manager *manager_create(void) { + pulseaudio_manager *self = malloc(sizeof(pulseaudio_manager)); + if (!self) { + fprintf(stderr, "Failed to allocate memory for pulseaudio_manager.\n"); + return NULL; + } + + // Zero-initialize the structure to set sensible defaults + memset(self, 0, sizeof(pulseaudio_manager)); + + // Initialize manager's PulseAudio main loop and context + if (!manager_initialize(self)) { + fprintf(stderr, "Failed to initialize pulseaudio_manager.\n"); + free(self); + return NULL; + } + + // Get the count of output and input devices + self->output_count = get_output_device_count(); + self->input_count = get_input_device_count(); + + // Allocate memory for outputs + if (self->output_count > 0) { + self->outputs = calloc(self->output_count, sizeof(pulseaudio_device)); + if (!self->outputs) { + fprintf(stderr, "Failed to allocate memory for outputs.\n"); + manager_cleanup(self); + return NULL; + } + // Retrieve and populate output devices + pa_sink_info **output_devices = get_available_output_devices(); + + for (uint32_t i = 0; i < self->output_count; ++i) { + self->outputs[i].index = output_devices[i]->index; + self->outputs[i].name = strdup(output_devices[i]->description); + self->outputs[i].code = strdup(output_devices[i]->name); + + + char *alsa_id = get_alsa_output_id(output_devices[i]->name); + + //Do NOT attempt to duplicate the string if alsa_id is null, as the program can crash! + if (alsa_id) { + self->outputs[i].alsa_id = strdup(alsa_id); + } else { + self->outputs[i].alsa_id = NULL; + } + self->outputs[i].sample_rate = get_output_sample_rate(self->outputs[i].alsa_id, output_devices[i]); + self->outputs[i].max_channels = get_max_output_channels(self->outputs[i].alsa_id, output_devices[i]); + self->outputs[i].min_channels = get_min_output_channels(self->outputs[i].alsa_id, output_devices[i]); + + //Initializing the stream like that is important so that we can modify the sample rate later. + pa_sample_spec default_sample_spec = { + .format = PA_SAMPLE_S16LE, + .rate = self->outputs[i].sample_rate, + .channels = (uint8_t) self->outputs[i].max_channels + }; + + self->outputs[i].stream = pa_stream_new(self->context, self->outputs[i].name, &default_sample_spec, NULL); + if (!self->outputs[i].stream) { + fprintf(stderr, "Failed to create stream for output device: %s\n", self->outputs[i].name); + continue; + } + + // Connect the stream with PA_STREAM_VARIABLE_RATE + if (pa_stream_connect_playback(self->outputs[i].stream, NULL, NULL, PA_STREAM_VARIABLE_RATE, NULL, NULL) < 0) { + fprintf(stderr, "Failed to connect playback stream for device: %s\n", self->outputs[i].name); + pa_stream_unref(self->outputs[i].stream); + self->outputs[i].stream = NULL; + continue; + } + + self->outputs[i].channel_names = get_output_channel_names(output_devices[i]->name, self->outputs[i].max_channels); + + free(alsa_id); + } + for (uint32_t i = 0; i < self->output_count; ++i) { + if (output_devices[i]) { + // Free other dynamically allocated fields within output_devices[i] if any + free(output_devices[i]); + } + } + free(output_devices); + } + + // Allocate memory for inputs + if (self->input_count > 0) { + self->inputs = calloc(self->input_count, sizeof(pulseaudio_device)); + if (!self->inputs) { + fprintf(stderr, "Failed to allocate memory for inputs.\n"); + manager_cleanup(self); + return NULL; + } + // Retrieve and populate input devices + pa_source_info **input_devices = get_available_input_devices(); + + for (uint32_t i = 0; i < self->input_count; ++i) { + self->inputs[i].index = input_devices[i]->index; + self->inputs[i].name = strdup(input_devices[i]->description); + self->inputs[i].code = strdup(input_devices[i]->name); + + char *alsa_id = get_alsa_input_id(input_devices[i]->name); + + if (alsa_id) { + self->inputs[i].alsa_id = strdup(alsa_id); + } else { + self->inputs[i].alsa_id = NULL; + } + + self->inputs[i].sample_rate = get_input_sample_rate(self->inputs[i].alsa_id, input_devices[i]); + self->inputs[i].max_channels = get_max_input_channels(self->inputs[i].alsa_id, input_devices[i]); + self->inputs[i].min_channels = get_min_input_channels(self->inputs[i].alsa_id, input_devices[i]); + + pa_sample_spec default_sample_spec = { + .format = PA_SAMPLE_S16LE, + .rate = self->inputs[i].sample_rate, + .channels = (uint8_t) self->inputs[i].max_channels + }; + + self->inputs[i].stream = pa_stream_new(self->context, self->inputs[i].name, &default_sample_spec, NULL); + + if (!self->inputs[i].stream) { + fprintf(stderr, "Failed to create stream for output device: %s\n", self->inputs[i].name); + continue; + } + + // Connect the stream with PA_STREAM_VARIABLE_RATE to the specific device + if (pa_stream_connect_playback(self->inputs[i].stream, self->inputs[i].code, NULL, PA_STREAM_VARIABLE_RATE, NULL, NULL) < 0) { + fprintf(stderr, "Failed to connect playback stream for device: %s\n", self->inputs[i].code); + pa_stream_unref(self->inputs[i].stream); + self->inputs[i].stream = NULL; + continue; + } + + self->inputs[i].channel_names = get_input_channel_names(input_devices[i]->name, self->inputs[i].max_channels); + + free(alsa_id); + } + for (uint32_t i = 0; i < self->input_count; ++i) { + if (input_devices[i]) { + // Free other dynamically allocated fields within output_devices[i] if any + free(input_devices[i]); + } + } + free(input_devices); + } + + // Set the default output and input devices + self->active_output_device = strdup(get_default_output(self->context)); + self->active_input_device = strdup(get_default_input(self->context)); + + // Check that the active devices were set + if (!self->active_output_device || !self->active_input_device) { + fprintf(stderr, "Failed to set the active output or input device.\n"); + manager_cleanup(self); + return NULL; + } + + return self; +} + + +/** + * @brief Callback function for handling PulseAudio context state changes. + * + * This callback is invoked by the PulseAudio mainloop when the context state changes. + * It updates the `pa_ready` flag in the pulseaudio_manager structure based on the + * context's state. The `pa_ready` flag is set to 1 when the context is ready, and + * to 2 when the context has failed or terminated. This callback will signal the + * mainloop to continue its operations whenever the state changes to either READY, + * FAILED, or TERMINATED. + * + * @param c Pointer to the PulseAudio context. + * @param userdata User-provided pointer to the pulseaudio_manager structure. + */ +static void manager_initialize_cb(pa_context *c, void *userdata) { + pa_context_state_t state; + pulseaudio_manager *manager = (pulseaudio_manager *) userdata; + int *pa_ready = &(manager->pa_ready); + pa_threaded_mainloop *m = manager->mainloop; + + state = pa_context_get_state(c); + switch (state) { + // There are other states you can handle, but these are the important ones + case PA_CONTEXT_CONNECTING: + case PA_CONTEXT_AUTHORIZING: + case PA_CONTEXT_SETTING_NAME: + default: + break; + case PA_CONTEXT_READY: + *pa_ready = 1; + pa_threaded_mainloop_signal(m, 0); + break; + case PA_CONTEXT_FAILED: + case PA_CONTEXT_TERMINATED: + *pa_ready = 2; + pa_threaded_mainloop_signal(m, 0); + break; + } +} + + +/** + * @brief Initializes the PulseAudio manager. + * + * This function sets up the PulseAudio threaded mainloop and context for the given manager. + * It creates the mainloop, context, and connects to the PulseAudio server, then starts + * the mainloop and waits for the context to be ready. It also sets up a state callback + * to handle the context state changes. + * + * @param self Pointer to the pulseaudio_manager structure to be initialized. + * @return Returns true if initialization is successful, false otherwise. + * + * @note The function will clean up allocated resources and return false if any step + * of the initialization fails. + */ +static bool manager_initialize(pulseaudio_manager *self) { + // 1. Create the threaded mainloop + self->mainloop = pa_threaded_mainloop_new(); + if (!self->mainloop) { + return false; + } + + // Get the mainloop API + pa_mainloop_api *mlapi = pa_threaded_mainloop_get_api(self->mainloop); + + // Create the context + self->context = pa_context_new(mlapi, "PulseAudio Manager"); + if (!self->context) { + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // Set the state callback + pa_context_set_state_callback(self->context, manager_initialize_cb, self); + + // Lock the mainloop and connect the context + pa_threaded_mainloop_lock(self->mainloop); + + if (pa_context_connect(self->context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) { + pa_threaded_mainloop_unlock(self->mainloop); + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // 2. Start the threaded mainloop + pa_threaded_mainloop_start(self->mainloop); + + // 4. Wait for the context to be ready + while (self->pa_ready == 0) { + pa_threaded_mainloop_wait(self->mainloop); + } + + pa_threaded_mainloop_unlock(self->mainloop); + + if (self->pa_ready == 2) { + return false; + } + + return true; +} + +/** + * Cleans up and frees all resources associated with a pulseaudio_manager object. + * This function ensures that all memory allocated for output and input devices + * within the manager is released. It includes freeing of all associated strings, + * channel names, and profile data. Additionally, it shuts down and frees the + * PulseAudio context and mainloop, if they have been initialized. + * + * @param manager A pointer to the pulseaudio_manager object to be cleaned up. + * If the pointer is NULL, the function does nothing. + */ +void manager_cleanup(pulseaudio_manager *manager) { + if (manager) { + // Free output devices + if (manager->outputs) { + for (uint32_t i = 0; i < manager->output_count; ++i) { + free(manager->outputs[i].code); + free(manager->outputs[i].name); + free(manager->outputs[i].alsa_id); + if (manager->outputs[i].channel_names) { + for (int j = 0; j < manager->outputs[i].max_channels; ++j) { + free(manager->outputs[i].channel_names[j]); + } + free(manager->outputs[i].channel_names); + } + if (manager->outputs[i].profiles) { + for (uint32_t j = 0; j < manager->outputs[i].profile_count; ++j) { + free((char*)manager->outputs[i].profiles[j].name); + free((char*)manager->outputs[i].profiles[j].description); + } + free(manager->outputs[i].profiles); + } + } + free(manager->outputs); // Finally free the array itself + } + + // Free input devices + if (manager->inputs) { + for (uint32_t i = 0; i < manager->input_count; ++i) { + free(manager->inputs[i].code); + free(manager->inputs[i].name); + free(manager->inputs[i].alsa_id); + if (manager->inputs[i].channel_names) { + for (int j = 0; j < manager->inputs[i].max_channels; ++j) { + free(manager->inputs[i].channel_names[j]); + } + free(manager->inputs[i].channel_names); + } + if (manager->inputs[i].profiles) { + for (uint32_t j = 0; j < manager->inputs[i].profile_count; ++j) { + free((char*)manager->inputs[i].profiles[j].name); + free((char*)manager->inputs[i].profiles[j].description); + } + free(manager->inputs[i].profiles); + } + } + free(manager->inputs); // Finally free the array itself + } + + // Free the names of active output and input devices + free(manager->active_output_device); + free(manager->active_input_device); + + // Disconnect and unreference the context if it's there + if (manager->context) { + // Check if the context is in a state that can be disconnected + if (pa_context_get_state(manager->context) == PA_CONTEXT_READY) { + pa_context_disconnect(manager->context); + } + pa_context_unref(manager->context); + } + + // Stop and free the mainloop if it's there + if (manager->mainloop) { + pa_threaded_mainloop_stop(manager->mainloop); + pa_threaded_mainloop_free(manager->mainloop); + } + + // Free the manager itself + free(manager); + } +} + + + + +/** + * @brief Iterates through operations in the pulseaudio_manager. + * + * @param manager Pointer to the pulseaudio_manager instance. + * @param op Pointer to the pa_operation instance. + */ +static void iterate(pulseaudio_manager *manager, pa_operation *op) { + //Leaves if operation is invalid. + if (!op) return; + + bool is_in_mainloop_thread = pa_threaded_mainloop_in_thread(manager->mainloop); + + // If we're not in the mainloop thread, lock it. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_lock(manager->mainloop); + } + + //Wait for the operation to complete. + //The signaling to continue is performed inside the callback operation (op). + pa_threaded_mainloop_wait(manager->mainloop); + + //Cleaning up. + pa_operation_unref(op); + + // If we locked the mainloop earlier, unlock it now. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_unlock(manager->mainloop); + } +} + +/** + * @brief Callback function for setting master volume on a device. + * + * This function is called when the asynchronous operation to set the volume + * for a sink completes. It will signal the mainloop to stop waiting. + * + * @param c The PulseAudio context. + * @param success Non-zero if the operation succeeded, zero if it failed. + * @param userdata The userdata passed to the function, a pointer to the pulseaudio_manager. + */ +void manager_set_master_volume_cb(pa_context *c, int success, void *userdata) { + (void) c; + + pulseaudio_manager *manager = (pulseaudio_manager *)userdata; + + // Check if the operation was successful + if (success) { + printf("Volume set successfully.\n"); + } else { + printf("Failed to set volume.\n"); + } + + // Signal the mainloop to stop waiting + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + +/** + * @brief Sets the master volume of a given device. + * + * This function sets the master volume of a device specified by its PulseAudio ID. + * + * @param manager Pointer to the pulseaudio_manager instance. + * @param device_id The PulseAudio ID of the device. + * @param volume The new volume level to set. This should be a value between 0 (mute) and 100 (maximum volume). + * @return 0 if the operation was successful, or a non-zero error code if the operation failed. + */ +/** + * @brief Sets the master volume of a given device. + * + * This function sets the master volume of a device specified by its PulseAudio ID. + * + * @param manager Pointer to the pulseaudio_manager instance. + * @param device_id The PulseAudio ID of the device. + * @param volume The new volume level to set. This should be a value between 0 (mute) and 100 (maximum volume). + * @return 0 if the operation was successful, or a non-zero error code if the operation failed. + */ +int manager_set_master_volume(pulseaudio_manager *manager, uint32_t device_id, int volume) { + if (!manager) { + fprintf(stderr, "Manager is NULL\n"); + return -1; + } + + if(volume < 0 || volume > 100) { + fprintf(stderr, "[manager_set_master_volume] The volume specified is out of range (0-100).\n"); + return -1; + } + + // Fetch the sink information for the device ID + const pa_sink_info *sink_info = get_output_device_by_index(device_id); + if (!sink_info) { + fprintf(stderr, "Could not retrieve sink info for device ID %u\n", device_id); + return -1; + } + + // Calculate the PA volume from the provided percentage + pa_volume_t pa_volume = (pa_volume_t) ((double) volume / 100.0 * PA_VOLUME_NORM); + + // Initialize a pa_cvolume structure and set the volume for all channels + pa_cvolume cvolume; + pa_cvolume_set(&cvolume, sink_info->channel_map.channels, pa_volume); + + // Start the asynchronous operation to set the sink volume + pa_operation *op = pa_context_set_sink_volume_by_index(manager->context, device_id, &cvolume, manager_set_master_volume_cb, manager); + if (!op) { + fprintf(stderr, "Failed to start volume set operation\n"); + return -1; + } + + // Wait for the operation to complete + iterate(manager, op); + + return 0; +} + +/** + * @brief Callback function for handling the completion of an output mute toggle operation. + * + * This function is invoked by the PulseAudio main loop upon the completion of an operation + * to toggle the mute state of an output device (sink). It is used in conjunction with + * `pa_context_set_sink_mute_by_index` as part of the `manager_toggle_output_mute` function. + * The callback checks if the mute toggle operation was successful and signals the mainloop + * to continue processing. + * + * @param c Pointer to the PulseAudio context, not used in this callback. + * @param success An integer indicating the success of the mute toggle operation. + * A non-zero value indicates success, while zero indicates failure. + * @param userdata User data provided when initiating the operation; expected to be a pointer + * to a `pulseaudio_manager` instance. + * + */ +static void manager_toggle_output_mute_cb(pa_context *c, int success, void *userdata) { + (void) c; + + pulseaudio_manager *manager = (pulseaudio_manager *) userdata; + if (!success) { + fprintf(stderr, "Failed to toggle mute state.\n"); + } + + // Signal the mainloop to continue + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + + +/** + * Toggle the mute state of a given output device. + * + * @param manager A pointer to the initialized pulseaudio_manager instance. + * @param index The index of the output device to toggle mute state. + * @param state The desired mute state (1 for ON/mute, 0 for OFF/unmute). + * @return Returns 0 on success, -1 on failure. + */ +int manager_toggle_output_mute(pulseaudio_manager *manager, uint32_t index, int state) { + + if (!manager || !manager->context) { + fprintf(stderr, "Invalid PulseAudio manager or context.\n"); + return -1; + } + + if (index >= manager->output_count) { + fprintf(stderr, "Output device index out of range.\n"); + return -1; + } + + pa_operation *op = pa_context_set_sink_mute_by_index(manager->context, + index, state, manager_toggle_output_mute_cb, manager); + + iterate(manager, op); + + return 0; +} + +/** + * @brief Callback function for handling the completion of an input mute toggle operation. + * + * This function is called by the PulseAudio main loop when the operation to toggle + * the mute state of an input device (source) is completed. The function is used in + * conjunction with `pa_context_set_source_mute_by_index` within the `manager_toggle_input_mute` + * function. It checks if the operation was successful and signals the mainloop to continue. + * + * @param c Pointer to the PulseAudio context. This parameter is not used in this callback. + * @param success An integer indicating the success of the mute toggle operation. + * Non-zero value indicates success, zero indicates failure. + * @param userdata User data provided when initiating the operation; expected to be a pointer + * to a `pulseaudio_manager` instance. + * + */ +static void manager_toggle_input_mute_cb(pa_context *c, int success, void *userdata) { + (void) c; + + pulseaudio_manager *manager = (pulseaudio_manager *) userdata; + if (!success) { + fprintf(stderr, "Failed to toggle input mute state.\n"); + } + + // Signal the mainloop to continue + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + +/** + * Toggle the mute state of a given input device. + * + * @param manager A pointer to the initialized pulseaudio_manager instance. + * @param index The index of the input device to toggle mute state. + * @param state The desired mute state (1 for ON/mute, 0 for OFF/unmute). + * @return Returns 0 on success, -1 on failure. + */ +int manager_toggle_input_mute(pulseaudio_manager *manager, uint32_t index, int state) { + + if (!manager || !manager->context) { + fprintf(stderr, "Invalid PulseAudio manager or context.\n"); + return -1; + } + + if (index >= manager->input_count) { + fprintf(stderr, "Input device index out of range.\n"); + return -1; + } + + pa_operation *op = pa_context_set_source_mute_by_index(manager->context, + index, state, manager_toggle_input_mute_cb, manager); + + iterate(manager, op); + + return 0; +} + +/** + * @brief Callback for handling the completion of setting the default sink. + * + * This callback is invoked when the operation to set the default sink in PulseAudio + * is completed. It signals the main loop to continue the execution flow. + * + * @param c The PulseAudio context. + * @param success Indicates if the operation was successful. + * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. + */ +static void manager_switch_default_output_cb(pa_context *c, int success, void *userdata) { + (void) c; + + pulseaudio_manager *manager = (pulseaudio_manager *)userdata; + if (!success) { + fprintf(stderr, "Failed to set default sink.\n"); + } + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + +/** + * @brief Callback for handling each sink input during the process of moving them to a new sink. + * + * This callback is invoked for each sink input (audio stream) currently active. It moves + * each sink input to the new default sink specified in the shared_data. + * + * @param c The PulseAudio context. + * @param i The sink input information. + * @param eol End of list flag, indicating no more data. + * @param userdata User-provided data, expected to be a pointer to shared_data_1 structure. + */ +static void manager_switch_default_output_cb_2(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata) { + + shared_data_1 *shared_data = (shared_data_1 *) userdata; + pa_threaded_mainloop *mainloop = shared_data->manager->mainloop; + + if (eol < 0) { + // Error occurred, signal the main loop to continue + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + if (!eol && i) { + // Move sink input to the new sink index stored in shared_data + pa_operation *op_move = pa_context_move_sink_input_by_index(c, i->index, shared_data->new_index, NULL, NULL); + if (op_move) { + pa_operation_unref(op_move); + pa_threaded_mainloop_signal(mainloop, 0); + } + } + + if (eol > 0) { + // End of list, signal the main loop to continue + pa_threaded_mainloop_signal(mainloop, 0); + } +} + +/** + * @brief Switches the default output device to the specified device. + * + * This function sets the specified output device as the default sink in PulseAudio. + * It also moves all current sink inputs (audio streams) to the new default sink. + * + * @param self Pointer to the pulseaudio_manager instance. + * @param device_index Index of the output device to be set as the default. + * @return True if the operation was successful, False otherwise. + */ +bool manager_switch_default_output(pulseaudio_manager *self, uint32_t device_index) { + //To be sent to the second callback. + shared_data_1 shared_data = {self, self->outputs[device_index].index}; + + if (!self || !self->context || device_index >= self->output_count) { + fprintf(stderr, "Invalid arguments provided.\n"); + return false; + } + + const char *new_sink_name = self->outputs[device_index].code; + if (!new_sink_name) { + fprintf(stderr, "Output device code is NULL.\n"); + return false; + } + + // Set the new default sink + pa_operation *op = pa_context_set_default_sink(self->context, new_sink_name, manager_switch_default_output_cb, self); + iterate(self, op); + + shared_data.new_index = get_output_device_index_by_code(self->context, self->outputs[device_index].code); + //fprintf(stderr, "[DEBUG, manager_switch_default_output()] index is %lu\n", (unsigned long) shared_data.new_index); + + // Move all sink inputs to the new default sink + op = pa_context_get_sink_input_info_list(self->context, manager_switch_default_output_cb_2, &shared_data); + iterate(self, op); + + return true; +} + +/** + * @brief Callback for handling the completion of setting the default source. + * + * This callback is invoked when the operation to set the default source in PulseAudio + * is completed. It signals the main loop to continue the execution flow. + * + * @param c The PulseAudio context. + * @param success Indicates if the operation was successful. + * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. + */ +static void manager_switch_default_input_cb(pa_context *c, int success, void *userdata) { + (void) c; + + pulseaudio_manager *manager = (pulseaudio_manager *)userdata; + if (!success) { + fprintf(stderr, "Failed to set default source.\n"); + } + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + + +/** + * @brief Switches the default input device to the specified device. + * + * This function sets the specified input device as the default source in PulseAudio. + * It requires a valid PulseAudio context and uses the PulseAudio API to set the new default source. + * + * @param self Pointer to the pulseaudio_manager instance. + * @param device_index Index of the input device to be set as the default. + * @return True if the operation was successful, False otherwise. + */ +bool manager_switch_default_input(pulseaudio_manager *self, uint32_t device_index) { + // Validate the arguments + if (!self || !self->context || device_index >= self->input_count) { + fprintf(stderr, "Invalid arguments provided.\n"); + return false; + } + + // Retrieve the code (PulseAudio name) of the new default input device + const char *new_source_name = self->inputs[device_index].code; + if (!new_source_name) { + fprintf(stderr, "Input device code is NULL.\n"); + return false; + } + + // Lock the main loop to ensure thread safety during the operation + pa_threaded_mainloop_lock(self->mainloop); + + // Initiate the operation to set the new default source + pa_operation *op = pa_context_set_default_source(self->context, new_source_name, manager_switch_default_input_cb, self); + if (op) { + pa_operation_unref(op); + } else { + fprintf(stderr, "Failed to set default source.\n"); + pa_threaded_mainloop_unlock(self->mainloop); + return false; + } + + // Wait for the completion of the operation + pa_threaded_mainloop_wait(self->mainloop); + + // Unlock the main loop after the operation is complete + pa_threaded_mainloop_unlock(self->mainloop); + + return true; +} + +/** + * @brief Sets the global sample rate for PulseAudio. + * + * This function attempts to set the global sample rate for PulseAudio by modifying + * the PulseAudio configuration files. It first tries to update the system-wide + * configuration file (/etc/pulse/daemon.conf). If it does not have permission to + * write to the system-wide file or the file does not exist, it then tries to + * update the user's local configuration file (~/.config/pulse/daemon.conf). + * + * The function searches for the 'default-sample-rate' line in the configuration file. + * If found, it updates this line with the new sample rate. If the line is not found, + * it appends the setting to the end of the configuration file. + * + * @param sample_rate The new sample rate to set (in Hz). + * @return Returns 0 on success, -1 on failure (e.g., if both configuration files + * cannot be opened for writing). + */ +int manager_set_pulseaudio_global_rate(int sample_rate) { + + //Delay for waiting to restarting pulseaudio (in seconds). + const int restart_delay = 2; + + const char* system_conf = DAEMON_CONF; + struct passwd *pw = getpwuid(getuid()); + const char* homedir = pw ? pw->pw_dir : NULL; + char local_conf[MAX_LINE_LENGTH]; + if (homedir) { + snprintf(local_conf, sizeof(local_conf), "%s/.config/pulse/daemon.conf", homedir); + } else { + strcpy(local_conf, DAEMON_CONF); // Use system config as fallback + } + + const char* paths[] = { system_conf, local_conf }; + int operation_successful = 0; + + for (int i = 0; i < 2; ++i) { + FILE* file = fopen(paths[i], "r+"); + if (!file && i == 1) { // If local file doesn't exist, create it + file = fopen(local_conf, "w+"); + } + if (!file) { + continue; + } + + char new_config[MAX_LINE_LENGTH * 10] = ""; + char line[MAX_LINE_LENGTH]; + int found = 0; + + while (fgets(line, sizeof(line), file)) { + char *trimmed_line = line; + // Skip leading whitespace + while (*trimmed_line && isspace((unsigned char)*trimmed_line)) { + trimmed_line++; + } + + if (strncmp(trimmed_line, "default-sample-rate", 19) == 0) { + sprintf(line, "default-sample-rate = %d\n", sample_rate); + found = 1; + } + strcat(new_config, line); + } + + if (!found) { + sprintf(new_config + strlen(new_config), "default-sample-rate = %d\n", sample_rate); + } + + rewind(file); // Rewind to the beginning of the file for writing + if (fputs(new_config, file) != EOF) { + operation_successful = 1; + } + fclose(file); + + if (operation_successful) { + break; // Exit loop if operation was successful + } + } + + if (!operation_successful) { + fprintf(stderr, "Failed to update PulseAudio configuration file\n"); + return -1; + } + + // Check if running as root + if (getuid() == 0) { + // Inform the user to manually restart PulseAudio + printf("[WARNING] Pulseaudio cannot be restarted automatically as root.\n"); + printf("Please restart PulseAudio manually to apply changes.\n"); + return 0; + } + + // Check if PulseAudio is running; if so, kill it. + if (system("pulseaudio --check") == 0) { + if(system("pulseaudio --kill") != 0) { + perror("Failed to kill PulseAudio"); + return -1; // Indicate an error in restarting PulseAudio + } + sleep(restart_delay); + } + + // Restart PulseAudio to apply changes + if (system("pulseaudio --start") != 0) { + perror("Failed to restart PulseAudio"); + return -1; // Indicate an error in restarting PulseAudio + } + + return 0; // Configuration updated and PulseAudio restarted successfully +} + + + + diff --git a/v-0.11/easypulse_core.h b/v-0.11/easypulse_core.h new file mode 100644 index 0000000..a3b4b3c --- /dev/null +++ b/v-0.11/easypulse_core.h @@ -0,0 +1,102 @@ +/** + * @file core.h + * @brief EasyPulse Library Header. + * + * EasyPulse is a library designed to provide pseudo-object oriented programming + * functions to simplify access to PulseAudio. + */ + +#ifndef EASPYPULSE_CORE_H +#define EASPYPULSE_CORE_H +#include +#define DEBUG_MODE 0 // Debug mode flag + +#include +#include "system_query.h" +#include +#include +#include + +// Forward declarations +typedef struct pulseaudio_manager pulseaudio_manager; +typedef struct pulseaudio_device pulseaudio_device; +typedef struct pulseaudio_volume pulseaudio_volume; + + +typedef struct { + char *name; // Name of the profile + char *description; // Description of the profile + uint32_t channels; // Number of channels this profile has +} pulseaudio_profile; + +//Internal volume information. +typedef struct _internal_volume { + uint32_t index; + char *code; //Pulseaudio name of the volume. + pa_cvolume *volume; //Volume representation. + pa_channel_map *cmap; //Channel map representation. + +} internal_volume; + +/** + * @brief Represents a PulseAudio device. + */ +struct pulseaudio_device { + uint32_t index; // Index of the device. + char *code; // Pulseaudio name of the device. + char *name; // Pulseaudio description of the device. + char *alsa_id; // Alsa ID of the device. + int sample_rate; // Current sample rate of the device. + pa_card_profile_info *active_profile; // Active alsa profile of this device. + char **channel_names; // Public channel names. + int master_volume; // Average volume of all channels (in percentage). + int *channel_volume; // Volume of each individual channel (in percentage). + bool mute; // Mute status of the devices (true for muted, false for unmuted). + int min_channels; // The minimum number of channels of the device. + int max_channels; // The maximum number of channels of the device. + pa_card_profile_info *profiles; // Array of available profiles for the device + uint32_t profile_count; // Number of available profiles + pa_stream *stream; // Associated PulseAudio stream (audio flow to be played / recorded). +}; + +/** + * @brief Represents the main manager for PulseAudio operations. + */ +struct pulseaudio_manager { + pa_threaded_mainloop *mainloop; // Mainloop for PulseAudio operations. + pa_context *context; // PulseAudio context. + pulseaudio_device *outputs; // Array of available output devices. + pulseaudio_device *inputs; // Array of available input devices. + int pa_ready; // Indicates if PulseAudio is ready (1 for ready, 2 for error). + int devices_loaded; // Indicates if devices are loaded (0 for not loaded, 1 for loaded successfully, 2 for error). + char *active_output_device; // Pointer to active output device. + char *active_input_device; // Pointer to active input device. + uint32_t output_count; // Number of pulseaudio sinks (outputs). + uint32_t input_count; // Number of pulseaudio sources (inputs). +}; + +pulseaudio_manager *manager_create(void); +void manager_cleanup(pulseaudio_manager *manager); //Cleans up the manager. + +int manager_set_master_volume(pulseaudio_manager *manager, +uint32_t device_id, int volume); //Sets the master volume of a given volume. + +int manager_toggle_output_mute(pulseaudio_manager *manager, +uint32_t index, int state); //Toggles the volume of output device to muted / unmuted. + +int manager_toggle_input_mute(pulseaudio_manager *manager, +uint32_t index, int state); //Toggles the volume of input device to muted / unmuted. + +bool manager_switch_default_output(pulseaudio_manager *self, +uint32_t device_index); //Changes the default output device. + +bool manager_switch_default_input(pulseaudio_manager *self, +uint32_t device_index); //Changes the default input device. + +int manager_set_output_sample_rate(pulseaudio_manager *manager, +uint32_t device_index, int sample_rate); //Changes the output of an output device. + +int manager_set_pulseaudio_global_rate(int sample_rate); //Changes the output of an output device. + + +#endif // CORE_H diff --git a/v-0.11/examples/Makefile b/v-0.11/examples/Makefile new file mode 100644 index 0000000..6f11288 --- /dev/null +++ b/v-0.11/examples/Makefile @@ -0,0 +1,19 @@ +CC = gcc +CFLAGS = -Wall -Wextra -g -O0 + +LIB_DIR = ../ +LIB_SRC = $(LIB_DIR)*.c + +EXAMPLES_DIR = . +EXAMPLES_SRC = $(wildcard $(EXAMPLES_DIR)/*.c) +EXAMPLES_OUT = $(patsubst $(EXAMPLES_DIR)/%.c,$(EXAMPLES_DIR)/%,$(EXAMPLES_SRC)) + +all: $(EXAMPLES_OUT) + +$(EXAMPLES_DIR)/%: $(EXAMPLES_DIR)/%.c + $(CC) $(CFLAGS) $< $(LIB_SRC) -o $@ -lpulse -lasound + +clean: + rm -f $(EXAMPLES_DIR)/*~ $(EXAMPLES_OUT) + +.PHONY: all clean diff --git a/v-0.11/examples/alsa-mapper_pulseaudio-api b/v-0.11/examples/alsa-mapper_pulseaudio-api new file mode 100755 index 0000000000000000000000000000000000000000..7f7e94e48e102260e7686cc3a8ada35b89756ec6 GIT binary patch literal 125912 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 literal 0 HcmV?d00001 diff --git a/v-0.11/examples/alsa-mapper_pulseaudio-api.c b/v-0.11/examples/alsa-mapper_pulseaudio-api.c new file mode 100644 index 0000000..47eb39b --- /dev/null +++ b/v-0.11/examples/alsa-mapper_pulseaudio-api.c @@ -0,0 +1,91 @@ +/** + * @file pulseaudio_alsa_mapper.c + * @brief Demonstrates how to map PulseAudio sinks to their corresponding ALSA device names. + */ + +#include +#include +#include +#include + +static const char* get_alsa_friendly_name(int card_num) { + snd_ctl_t *ctl; + char name[128]; + snprintf(name, sizeof(name), "hw:%d", card_num); + + if (snd_ctl_open(&ctl, name, 0) < 0) { + return NULL; + } + + snd_ctl_card_info_t *info; + snd_ctl_card_info_alloca(&info); + if (snd_ctl_card_info(ctl, info) < 0) { + snd_ctl_close(ctl); + return NULL; + } + + const char *friendly_name = strdup(snd_ctl_card_info_get_name(info)); + snd_ctl_close(ctl); + return friendly_name; +} + +static void sink_info_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) userdata; + + if (eol > 0) { + pa_context_disconnect(c); + return; + } + + const char *udev_description = pa_proplist_gets(info->proplist, "device.description"); + const char *card_str = pa_proplist_gets(info->proplist, "alsa.card"); + const char *device_str = pa_proplist_gets(info->proplist, "alsa.device"); + + int card_num = card_str ? atoi(card_str) : -1; + const char *friendly_name = card_num != -1 ? get_alsa_friendly_name(card_num) : NULL; + + if (udev_description && card_str && device_str) { + printf("Sink: %s, UDEV description: %s, ALSA name: hw:%s,%s", info->name, udev_description, card_str, device_str); + if (friendly_name) { + printf(", Friendly ALSA name: %s", friendly_name); + free((void*)friendly_name); + } + printf("\n"); + } else if (udev_description) { + printf("Sink: %s, UDEV description: %s, Incomplete ALSA name information.\n", info->name, udev_description); + } +} + +static void context_state_cb(pa_context *c, void *userdata) { + switch (pa_context_get_state(c)) { + case PA_CONTEXT_READY: + pa_context_get_sink_info_list(c, sink_info_cb, NULL); + break; + case PA_CONTEXT_FAILED: + case PA_CONTEXT_TERMINATED: + pa_mainloop_quit((pa_mainloop*)userdata, 0); + break; + default: + break; + } +} + +int main(void) { + pa_mainloop *mainloop; + pa_mainloop_api *mainloop_api; + pa_context *context; + + mainloop = pa_mainloop_new(); + mainloop_api = pa_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "udev_description_fetcher"); + + pa_context_set_state_callback(context, context_state_cb, mainloop); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + + pa_mainloop_run(mainloop, NULL); + + pa_context_unref(context); + pa_mainloop_free(mainloop); + + return 0; +} diff --git a/v-0.11/examples/change-speaker-mode b/v-0.11/examples/change-speaker-mode new file mode 100755 index 0000000000000000000000000000000000000000..441118eaf6c97187c53a28bd6c7bda20dfac660f GIT binary patch literal 111632 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 Yn;XIYvE7@oe)s34 + +int main(void) { + // Initialize the pulseaudio_manager + pulseaudio_manager *manager = new_manager(); + //pulseaudio_manager *self = manager; + + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudio manager.\n"); + return 1; + } + + + // Detect the current mode of the active device + const char* current_mode = manager->get_device_mode_by_code(manager, manager->active_device->code); + printf("Current mode of the active device (%s): %s\n", manager->active_device->code, current_mode); + + // List available modes based on the number of channels of the active device + printf("\nAvailable modes:\n"); + printf("1. mono\n"); + printf("2. stereo\n"); + + int max_choice = 2; // To keep track of the maximum mode choice number + uint32_t channels = manager->active_device->number_of_channels; + + if (channels >= 4) { + printf("3. 4.0\n"); + max_choice = 3; + } + if (channels >= 5) { + printf("4. 5.0\n"); + max_choice = 4; + } + if (channels >= 6) { + printf("5. 5.1\n"); + max_choice = 5; + } + if (channels >= 8) { + printf("6. 7.1\n"); + max_choice = 6; + } + + // Prompt the user to select a mode + printf("\nEnter the number corresponding to the desired mode: "); + int choice; + scanf("%d", &choice); + + if (choice < 1 || choice > max_choice) { + printf("Invalid choice.\n"); + manager->destroy(self); + return 1; + } + + const char* mode_choices[] = {"mono", "stereo", "4.0", "5.0", "5.1", "7.1"}; + const char* mode_to_set = mode_choices[choice - 1]; + + // Set the mode of the active device + if (manager->set_device_mode_by_code(manager, manager->active_device->code, mode_to_set)) { + printf("Mode set to %s successfully!\n", mode_to_set); + } else { + fprintf(stderr, "Failed to set the mode.\n"); + } + + // Cleanup + manager->destroy(self); + return 0; + +} +#endif + +int main(void) { + return 0; +} diff --git a/v-0.11/examples/change_global_sample_rate b/v-0.11/examples/change_global_sample_rate new file mode 100755 index 0000000000000000000000000000000000000000..81fc50b860385caa3f10a1f5108bafb4709587ad GIT binary patch literal 112152 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 literal 0 HcmV?d00001 diff --git a/v-0.11/examples/change_global_sample_rate.c b/v-0.11/examples/change_global_sample_rate.c new file mode 100644 index 0000000..b520fc4 --- /dev/null +++ b/v-0.11/examples/change_global_sample_rate.c @@ -0,0 +1,47 @@ +/** + * @file change_global_sample_rate.c + * @brief Adjusts the global PulseAudio sample rate. + * + * This program retrieves and displays the current global sample rate for PulseAudio. + * It then prompts the user to enter a new sample rate. Upon receiving a valid input, + * it attempts to set this new sample rate as the global sample rate in PulseAudio's + * configuration files. The program first tries to update the system-wide configuration + * and then falls back to the user's local configuration if necessary. + * + * @return Returns 0 on successful execution, 1 on failure or invalid input. + */ + +#include +#include +#include "../easypulse_core.h" + + +int main() { + // Fetch the global playback sample rate from the default PulseAudio configuration file + int sample_rate = get_pulseaudio_global_playback_rate(NULL); + printf("[DEBUG, main] sample rate is: %i\n", sample_rate); + + if (sample_rate > 0) { + printf("Current global playback sample rate: %d Hz\n", sample_rate); + } else { + printf("Failed to retrieve the current global playback sample rate.\n"); + return 1; + } + + // Prompt the user for a new sample rate + printf("Enter the new sample rate to set: "); + int new_sample_rate; + if (scanf("%d", &new_sample_rate) != 1) { + printf("Invalid input.\n"); + return 1; + } + + // Set the new global sample rate + if (manager_set_pulseaudio_global_rate(new_sample_rate) == 0) { + printf("Sample rate successfully set to %d Hz.\n", new_sample_rate); + } else { + printf("Failed to set the new sample rate.\n"); + } + + return 0; +} diff --git a/v-0.11/examples/get-card-profiles-pulseaudio_api b/v-0.11/examples/get-card-profiles-pulseaudio_api new file mode 100755 index 0000000000000000000000000000000000000000..c27be41b48a46146edd49451ce19dfae65fb1dfc GIT binary patch literal 119312 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 literal 0 HcmV?d00001 diff --git a/v-0.11/examples/get-card-profiles-pulseaudio_api.c b/v-0.11/examples/get-card-profiles-pulseaudio_api.c new file mode 100644 index 0000000..829f45c --- /dev/null +++ b/v-0.11/examples/get-card-profiles-pulseaudio_api.c @@ -0,0 +1,63 @@ +/** + * @file get-card-profiles-pulseaudio_api.c + * @brief This program queries and displays information about available sound devices in a computer. + * + * It uses the PulseAudio library to interact with the sound system and retrieve information about + * available sound devices, their properties, and ALSA (Advanced Linux Sound Architecture) related data. + */ + +#include +#include "../easypulse_core.h" + +int main(void) { + // Query the total number of PulseAudio devices + uint32_t total_devices = get_output_device_count(); + + printf("Total sound devices in this computer:%lu\n", (unsigned long) total_devices); + printf("Available PulseAudio sound devices:\n"); + + pa_sink_info **sink_info = get_available_output_devices(); + if (!sink_info) { + fprintf(stderr, "Error: Could not retrieve sound device information.\n"); + return 1; + } + + for (uint32_t i = 0; i < total_devices; i++) { + if (!sink_info[i]) { + fprintf(stderr, "Error: sound device information at index %u is NULL.\n", i); + continue; + } + + // Display sink name + printf("\n- Sound device name: %s\n", sink_info[i]->name ? sink_info[i]->name : "NULL"); + printf("\n- Sound device description: %s\n", sink_info[i]->description ? sink_info[i]->description : "NULL"); + + // Query and display the number of profiles + uint32_t profile_count = get_profile_count(i); + printf(" - Number of profiles: %u\n", profile_count); + + // Get and display the ALSA name + const char *alsa_name = get_alsa_output_name(sink_info[i]->name); + const char *alsa_id = get_alsa_output_id(sink_info[i]->name); + int sample_rate = get_output_sample_rate(alsa_id, sink_info[i]); + + printf(" - Sample rate: %i\n", sample_rate); + printf("\n- Alsa ID is: %s\n", alsa_id ? alsa_id : "NULL"); + + if (alsa_name) { + printf(" - ALSA name: %s\n", alsa_name); + } else { + printf(" - No corresponding ALSA name found.\n"); + } + // Get and display the minimum and maximum channels + int min_channels = get_min_output_channels(alsa_id, sink_info[i]); + int max_channels = get_max_output_channels(alsa_id, sink_info[i]); + + if(min_channels > 0) printf(" - Minimum channels: %d\n", min_channels); + if(max_channels > 0) printf(" - Maximum channels: %d\n", max_channels); + free((char *)alsa_name); // Free the memory allocated for alsa_name + } + + delete_output_devices(sink_info); + return 0; +} diff --git a/v-0.11/examples/mute_input_demo b/v-0.11/examples/mute_input_demo new file mode 100755 index 0000000000000000000000000000000000000000..5211d6f997461ce1816edec875cc5716ac27c38e GIT binary patch literal 118000 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

  • _18YRX3sY@&NtEzAG+tM^6^@1*+#28?TSFcU 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

    )F5XbCRCdySlhNDm~{l&R8Ee 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ƒ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 literal 0 HcmV?d00001 diff --git a/v-0.11/examples/switch-output-device-pulseaudio.c b/v-0.11/examples/switch-output-device-pulseaudio.c new file mode 100644 index 0000000..0a0c85a --- /dev/null +++ b/v-0.11/examples/switch-output-device-pulseaudio.c @@ -0,0 +1,62 @@ +#include +#include +#include +#include + +static pa_threaded_mainloop *mainloop; +static pa_context *context; +static int sink_count = 0; +static char **sink_names = NULL; + +void sink_list_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + (void) userdata; + if (eol > 0) { + int chosen; + printf("Enter the number of the sink to set as default: "); + scanf("%d", &chosen); + + if (chosen >= 0 && chosen < sink_count) { + pa_context_set_default_sink(c, sink_names[chosen], NULL, NULL); + } + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + sink_names = realloc(sink_names, sizeof(char*) * (sink_count + 1)); + sink_names[sink_count] = strdup(info->name); + printf("%d: %s (%s)\n", sink_count++, info->name, info->description); +} + +void context_state_cb(pa_context *c, void *userdata) { + (void) userdata; + + if (pa_context_get_state(c) == PA_CONTEXT_READY) { + pa_operation_unref(pa_context_get_sink_info_list(c, sink_list_cb, NULL)); + } +} + +int main(void) { + mainloop = pa_threaded_mainloop_new(); + pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "sink_switcher_threaded"); + + pa_context_set_state_callback(context, context_state_cb, NULL); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + pa_threaded_mainloop_start(mainloop); + + pa_threaded_mainloop_lock(mainloop); + pa_threaded_mainloop_wait(mainloop); // Wait until sink_list_cb signals completion + + for (int i = 0; i < sink_count; i++) { + free(sink_names[i]); + } + free(sink_names); + + pa_context_disconnect(context); + pa_context_unref(context); + pa_threaded_mainloop_unlock(mainloop); + pa_threaded_mainloop_stop(mainloop); + pa_threaded_mainloop_free(mainloop); + return 0; +} diff --git a/v-0.11/examples/switch-output-device.c b/v-0.11/examples/switch-output-device.c new file mode 100644 index 0000000..0368692 --- /dev/null +++ b/v-0.11/examples/switch-output-device.c @@ -0,0 +1,47 @@ +#include "../easypulse_core.h" +#include "../system_query.h" +#include +#include +#include + +int main() { + // Initialize the PulseAudio Manager + pulseaudio_manager *manager = manager_create(); + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudioManager.\n"); + return 1; + } + + // Display available output devices to the user + printf("\n\n***OUTPUT SWITCHING DEMO***\n\nAvailable output devices:\n"); + for (uint32_t i = 0; i < manager->output_count; i++) { + printf("%d. %s - %s\n", i + 1, manager->outputs[i].name, manager->outputs[i].code); + } + + // Prompt the user to select a device + printf("Enter the number of the output device you want to switch to: "); + uint32_t choice; + scanf("%u", &choice); + + + // Validate the user's choice + if ((choice - 1) > manager->output_count) { + fprintf(stderr, "Invalid choice.\n"); + manager_cleanup(manager); + return 1; + } + + // Switch to the selected device + if (manager_switch_default_output(manager, manager->outputs[choice - 1].index) == true) { + printf("Successfully switched to the selected output device.\n"); + } else { + fprintf(stderr, "Failed to switch to the selected output device.\n"); + manager_cleanup(manager); + return 1; + } + + // Cleanup + manager_cleanup(manager); + + return 0; +} diff --git a/v-0.11/examples/volume-change b/v-0.11/examples/volume-change new file mode 100755 index 0000000000000000000000000000000000000000..92e237a57c42b298898ca47a36d3955a20e23cd7 GIT binary patch literal 117824 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 literal 0 HcmV?d00001 diff --git a/v-0.11/examples/volume-change-pulseaudio.c b/v-0.11/examples/volume-change-pulseaudio.c new file mode 100644 index 0000000..aa629ab --- /dev/null +++ b/v-0.11/examples/volume-change-pulseaudio.c @@ -0,0 +1,101 @@ +/** + * @file volume-change-pulseaudio.c + * @brief Change the volume of the default PulseAudio sink. + * + * This program prompts the user for a desired volume level, displays the current volume + * of the default sink, sets the volume of the default sink to the user's input, and then + * displays the volume after the change. + */ + +#include +#include +#include + +static pa_threaded_mainloop *mainloop; +static pa_context *context; + +/** + * @brief Callback function to set the volume of the default sink. + * + * This function fetches the current volume of the default sink, displays it, + * then prompts the user for a desired volume level, sets the volume, and finally + * displays the volume after the change. + * + * @param c The PulseAudio context. + * @param info Information about the current sink. + * @param eol End-of-list flag. + * @param userdata User data (unused). + */ +void set_volume_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + (void) userdata; + + if (eol > 0) { + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + // Prompt the user for the desired volume level first + int volume_percentage; + printf("Enter the desired volume (0-100): "); + scanf("%d", &volume_percentage); + + // Display the current volume percentage + int volume_percentage_before = (int)(100.0f * pa_cvolume_avg(&info->volume) / PA_VOLUME_NORM + 0.5); + printf("Volume before change: %d%%\n", volume_percentage_before); + + // Set the volume based on user input + pa_cvolume volume; + pa_cvolume_set(&volume, info->channel_map.channels, (volume_percentage * PA_VOLUME_NORM) / 100); + pa_context_set_sink_volume_by_index(c, info->index, &volume, NULL, NULL); + + // Display the volume after the change + int volume_percentage_after = (int)(100.0f * pa_cvolume_avg(&volume) / PA_VOLUME_NORM + 0.5); + printf("Volume after change: %d%%\n", volume_percentage_after); + + pa_threaded_mainloop_signal(mainloop, 0); +} + +/** + * @brief Callback function for context state changes. + * + * This function checks if the context is ready and then triggers the retrieval + * of the default sink's information. + * + * @param c The PulseAudio context. + * @param userdata User data (unused). + */ +void context_state_cb(pa_context *c, void *userdata) { + (void) c; + (void) userdata; + + if (pa_context_get_state(c) == PA_CONTEXT_READY) { + pa_operation_unref(pa_context_get_sink_info_by_name(c, "@DEFAULT_SINK@", set_volume_cb, NULL)); + } +} + +int main(void) { + // Initialize PulseAudio threaded mainloop and context + mainloop = pa_threaded_mainloop_new(); + pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "volume_changer_threaded"); + + // Set context state callback and connect the context + pa_context_set_state_callback(context, context_state_cb, NULL); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + + // Start the threaded mainloop + pa_threaded_mainloop_start(mainloop); + + // Lock the mainloop and wait for operations to complete + pa_threaded_mainloop_lock(mainloop); + pa_threaded_mainloop_wait(mainloop); + + // Cleanup and free resources + pa_context_disconnect(context); + pa_context_unref(context); + pa_threaded_mainloop_unlock(mainloop); + pa_threaded_mainloop_stop(mainloop); + pa_threaded_mainloop_free(mainloop); + return 0; +} diff --git a/v-0.11/examples/volume-change.c b/v-0.11/examples/volume-change.c new file mode 100644 index 0000000..013d39d --- /dev/null +++ b/v-0.11/examples/volume-change.c @@ -0,0 +1,67 @@ +/** + * @file volume-change.c + * @brief PulseAudio Manager demo program + * + * This program demonstrates the usage of the PulseAudio Manager API. + * It creates a manager instance, lists the available output devices, + * asks the user to select one of the output devices and to enter a master volume. + * It then sets the master volume of the selected output device to the given value. + * + * @author mbyte-2 + * @date 11-07-2023 + */ +#include +#include "../easypulse_core.h" // Assuming this is the header file where your API is defined + +int main() { + // Create a manager instance + pulseaudio_manager *manager = manager_create(); + if (!manager) { + fprintf(stderr, "Failed to create manager.\n"); + return 1; + } + + // List the outputs + printf("Available output devices:\n"); + for (uint32_t i = 0; i < get_output_device_count(); ++i) { + printf("%d: %s\n", (i+1), manager->outputs[i].name); + } + + // Ask the user to select one of the outputs + uint32_t selected_output; + printf("Please enter the number of the output device you want to use: "); + scanf("%u", &selected_output); + + // Check if the selected output is valid + if ((selected_output - 1) >= get_output_device_count()) { + fprintf(stderr, "Invalid output device number.\n"); + manager_cleanup(manager); + return 1; + } + + // Ask the user to type a master volume + int master_volume; + printf("Please enter the master volume (0-100): "); + scanf("%d", &master_volume); + + // Check if the master volume is valid + if (master_volume < 0 || master_volume > 100) { + fprintf(stderr, "Invalid master volume. It should be between 0 and 100.\n"); + manager_cleanup(manager); + return 1; + } + + // Set the master volume to the given value + if (manager_set_master_volume(manager, (selected_output -1), master_volume) != 0) { + fprintf(stderr, "Failed to set master volume.\n"); + manager_cleanup(manager); + return 1; + } + + printf("Master volume for output device '%s' has been set to %d.\n", manager->outputs[(selected_output-1)].name, master_volume); + + // Clean up + manager_cleanup(manager); + + return 0; +} diff --git a/v-0.11/libeasypulse_core.a b/v-0.11/libeasypulse_core.a new file mode 100644 index 0000000000000000000000000000000000000000..90915fd99c163abe816b036ab98d071038b9b4b2 GIT binary patch literal 44396 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 F{|6gDy9NLN literal 0 HcmV?d00001 diff --git a/v-0.11/system_query.c b/v-0.11/system_query.c new file mode 100644 index 0000000..649a2eb --- /dev/null +++ b/v-0.11/system_query.c @@ -0,0 +1,2867 @@ +#include "system_query.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include // Include this for the isdigit() function +#include +#include + +#define DAEMON_CONF "/etc/pulse/daemon.conf" +#define MAX_LINE_LENGTH 1024 + +// Since pulseaudio uses callbacks, we need something that will allow us to share data +// between functions. +typedef struct { + pa_threaded_mainloop *mainloop; + pa_mainloop_api *mainloop_api; + pa_context *context; +} _shared_data_1; + +static _shared_data_1 shared_data_1; + +// Structure to share data between get_alsa_name and its callback. +typedef struct { + char *alsa_name; + char *alsa_id; +} _shared_data_2; + +static _shared_data_2 shared_data_2 = {.alsa_name = NULL}; + + +// Structure to share data between get_available_output_devices and its callback. +typedef struct { + pa_sink_info **sinks; // An array of pointers to pa_sink_info + uint32_t count; +} _shared_data_3; + +static _shared_data_3 shared_data_3; + +// Structure to share data between get_profiles and its callback. +typedef struct { + pa_card_profile_info *profiles; + int num_profiles; +} _shared_data_4; + +_shared_data_4 shared_data_4 = {NULL, 0}; + +// Structure to share data between get_available_input_devices and its callback. +static struct { + pa_source_info **sources; // Array of pointers to pa_source_info structures + uint32_t count; // Count of available sources + uint32_t allocated; // Allocated size of the sources array +} shared_data_sources = {NULL, 0, 0}; + + + + +static void pulse_cleanup(void); +static bool is_pulse_initialized(void); +static void get_output_device_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata); +static void get_profile_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata); + +// Utility function to print all properties in the proplist +void print_proplist(const pa_proplist *p) { + void *state = NULL; + const char *key; + while ((key = pa_proplist_iterate(p, &state))) { + const char *value = pa_proplist_gets(p, key); + if (value) { + printf("%s = %s\n", key, value); + } else { + printf("%s = \n", key); + } + } +} + +/** + * @brief Iterates through operations in the pulseaudio threaded loop. + * + * @param loop Pointer to the threaded loop instance. + * @param op Pointer to the pa_operation instance. + */ +static void iterate(pa_operation *op) { + //fprintf(stderr, "[DEBUG] Entering %s\n", __FUNCTION__); // Debug statement for entry + + //Leaves if operation is invalid. + if (!op) { + fprintf(stderr, "[DEBUG] Operation is NULL\n"); // Debug statement for NULL operation + return; + } + + bool is_in_mainloop_thread = pa_threaded_mainloop_in_thread(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Is in mainloop thread: %d\n", is_in_mainloop_thread); // Debug statement for thread check + + // If we're not in the mainloop thread, lock it. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_lock(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Mainloop locked\n"); // Debug statement for mainloop locked + } + + //Wait for the operation to complete. + //The signaling to continue is performed inside the callback operation (op). + while (pa_operation_get_state(op) == PA_OPERATION_RUNNING) { + pa_threaded_mainloop_wait(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Waiting in mainloop...\n"); // Debug message while waiting + } + + //Debug code if needed. + #if 0 + // Check the operation state after waiting + switch (pa_operation_get_state(op)) { + case PA_OPERATION_DONE: + fprintf(stderr, "[DEBUG] Operation completed successfully\n"); // Debug message for successful completion + break; + case PA_OPERATION_CANCELLED: + fprintf(stderr, "[DEBUG] Operation was cancelled\n"); // Debug message for cancellation + break; + case PA_OPERATION_RUNNING: // This case should not be possible after the wait + default: + fprintf(stderr, "[DEBUG] Operation is in an unexpected state: %d\n", pa_operation_get_state(op)); // Debug message for unexpected state + break; + } + #endif + + //Cleaning up. + pa_operation_unref(op); + //fprintf(stderr, "[DEBUG] Operation unreferenced and cleaned up\n"); // Debug statement for cleanup + + // If we locked the mainloop earlier, unlock it now. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + //fprintf(stderr, "[DEBUG] Mainloop unlocked\n"); // Debug statement for mainloop unlocked + } + + //fprintf(stderr, "[DEBUG] Exiting %s\n", __FUNCTION__); // Debug statement for exit +} + + +/** + * @brief Callback function to handle changes in PulseAudio context state. + * + * This function is triggered whenever the state of the PulseAudio context changes. + * It signals the mainloop to continue execution whenever the context is in a READY, FAILED, + * or TERMINATED state. + * + * @param c Pointer to the PulseAudio context. + * @param userdata Pointer to the data shared with the main function, which contains the mainloop. + */ +static void context_state_cb(pa_context *c, void *userdata) { + (void) userdata; + pa_context_state_t state = pa_context_get_state(c); + + // If the context is in a READY, FAILED, or TERMINATED state, signal the mainloop to continue. + if (state == PA_CONTEXT_READY || state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } +} + +/** + * @brief Utility function to check if PulseAudio is initialized and in a READY state. + * + * This function checks the state of the PulseAudio context and other key PulseAudio resources + * to determine if PulseAudio has been successfully initialized and is in a READY state. + * + * @return True if PulseAudio is initialized and in a READY state, false otherwise. + */ +static bool is_pulse_initialized(void) { + + + // Check if the main components of PulseAudio (mainloop, mainloop_api, and context) are initialized. + if (shared_data_1.mainloop && shared_data_1.mainloop_api && shared_data_1.context) { + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + + // If the context is in a READY state, PulseAudio is initialized. + if (state == PA_CONTEXT_READY) { + return true; + } + } + return false; +} + +/** + * @brief Initializes the PulseAudio mainloop and context for querying audio information. + * + * This function sets up the necessary PulseAudio components for subsequent queries + * to the audio subsystem. It creates a new threaded mainloop, obtains the mainloop API, + * and creates a new context with a specified name. It also starts the mainloop and + * connects the context to the PulseAudio server, waiting until the context is ready + * or an error occurs. + * + * @note If this function fails at any point, it ensures that all allocated resources are + * cleaned up before returning. + * + * @return true if the PulseAudio components were initialized successfully, false otherwise. + */ +bool initialize_pulse() { + shared_data_1.mainloop = pa_threaded_mainloop_new(); + if (!shared_data_1.mainloop) { + fprintf(stderr, "Failed to create mainloop.\n"); + return false; + } + + shared_data_1.mainloop_api = pa_threaded_mainloop_get_api(shared_data_1.mainloop); + if (!shared_data_1.mainloop_api) { + fprintf(stderr, "Failed to get mainloop API.\n"); + pa_threaded_mainloop_free(shared_data_1.mainloop); + return false; + } + + shared_data_1.context = pa_context_new(shared_data_1.mainloop_api, "Easypulse query API"); + if (!shared_data_1.context) { + fprintf(stderr, "Failed to create context.\n"); + pa_threaded_mainloop_free(shared_data_1.mainloop); + return false; + } + + + pa_context_set_state_callback(shared_data_1.context, context_state_cb, shared_data_1.mainloop); + + // Start the threaded mainloop + pa_threaded_mainloop_start(shared_data_1.mainloop); + + // Lock the mainloop and connect the context + pa_threaded_mainloop_lock(shared_data_1.mainloop); + if (pa_context_connect(shared_data_1.context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + pulse_cleanup(); + return false; + } + + // Wait for the context to be ready + while (true) { + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + if (state == PA_CONTEXT_READY) { + break; + } else if (state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) { + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + pulse_cleanup(); + return false; + } + pa_threaded_mainloop_wait(shared_data_1.mainloop); + } + + pa_threaded_mainloop_unlock(shared_data_1.mainloop); + return true; +} + + +/** + * @brief Cleanup function to properly disconnect and free PulseAudio resources. + * + * This function ensures that all the PulseAudio resources are properly disconnected, + * dereferenced, and freed to avoid any resource leaks. It should be called whenever + * PulseAudio operations are done and the program wishes to terminate or release PulseAudio. + */ +static void pulse_cleanup(void) { + if (shared_data_1.context) { + // Check if the context is in a state where it can be disconnected + pa_context_state_t state = pa_context_get_state(shared_data_1.context); + if (state == PA_CONTEXT_READY) { + pa_context_disconnect(shared_data_1.context); + } + pa_context_unref(shared_data_1.context); + shared_data_1.context = NULL; + } + if (shared_data_1.mainloop) { + pa_threaded_mainloop_free(shared_data_1.mainloop); + shared_data_1.mainloop = NULL; + } +} + +/** + * @brief Callback function used to retrieve the count of audio profiles for a specific card. + * + * This function is called by PulseAudio when querying for the list of profiles for a given card index. + * It sets the profile_count with the number of profiles available for the card. + * If there's an error or the list is exhausted, the function signals the mainloop to continue + * without further processing. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current card information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function, which contains the mainloop + * and the profile_count to be set. + */ +static void get_profile_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + + uint32_t *profile_count = (uint32_t *) userdata; + + // Handle errors in retrieving profile count. + if (eol < 0) { + fprintf(stderr, "Failed to get profile count.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // If we've reached the end of the list of profiles, signal the mainloop to continue. + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Set the profile_count with the number of profiles available for the card. + *profile_count = i->n_profiles; +} + + +/** + * @brief Retrieve the count of audio profiles for a specific card. + * + * This function queries PulseAudio to get a count of all available audio profiles + * for a specified card index. If PulseAudio is not initialized, the function attempts + * to initialize it. If there's an error in fetching the profile count or initializing + * PulseAudio, it returns UINT32_MAX. + * + * @param card_index The index of the card for which to retrieve the profile count. + * @return Count of audio profiles or UINT32_MAX on error. + */ +uint32_t get_profile_count(uint32_t card_index) { + uint32_t profile_count = 0; // Initialize profile count to zero. + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "get_profiles_count(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails. + } + } + + // Query PulseAudio for the list of audio profiles for the specified card. + // The callback get_profile_count_cb will populate the profile_count variable. + count_op = pa_context_get_card_info_by_index(shared_data_1.context, card_index, get_profile_count_cb, &profile_count); + + // Wait for the PulseAudio operation to complete. + iterate(count_op); + + return profile_count; // Return the total count of profiles. +} + +/** + * @brief Callback function used to populate the list of available audio sinks. + * + * This function is called for each audio sink found by PulseAudio when querying + * for the list of sinks. The function populates the `shared_sink_data` structure + * with `pa_sink_info` for each sink. When the list is exhausted or there's an error, + * the function exits without further processing. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio sink information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function. + */ +static void get_available_output_devices_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + (void) userdata; + + uint32_t *count = &shared_data_3.count; + + // Handle errors in retrieving sink information. + if (eol < 0) { + fprintf(stderr, "Failed to get sink info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // If we've reached the end of the list of sinks, mark the end and exit the callback. + if (eol > 0) { + shared_data_3.sinks[*count] = NULL; // Set the last element to NULL as sentinel + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Allocate memory for the pa_sink_info structure. + shared_data_3.sinks[*count] = malloc(sizeof(pa_sink_info)); + if (shared_data_3.sinks[*count] == NULL) { + fprintf(stderr, "Failed to allocate memory for sink info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Copy the pa_sink_info structure. + *(shared_data_3.sinks[*count]) = *i; + + // Duplicate the strings to ensure they remain valid. + if (i->name != NULL) { + shared_data_3.sinks[*count]->name = strdup(i->name); + } + if (i->description != NULL) { + shared_data_3.sinks[*count]->description = strdup(i->description); + } + + (*count)++; +} + +/** + * @brief Retrieve the list of available audio sinks for a specific card. + * + * This function queries PulseAudio to get a list of all available audio sinks + * for a specified card index. It dynamically allocates memory based on the count + * of sinks to store the list of sinks. + * If PulseAudio is not initialized, the function attempts to initialize it. + * + * @param card_index The index of the card for which to retrieve the sinks. + * @return Pointer to the first sink in the list or NULL on error. + */ +pa_sink_info **get_available_output_devices() { + pa_operation *op = NULL; + + // Using get_output_device_count() to obtain the number of sinks + uint32_t max_sinks = get_output_device_count(); + + // Allocate memory for pointers + shared_data_3.sinks = malloc((max_sinks + 1) * sizeof(pa_sink_info*)); + shared_data_3.count = 0; // Reset count + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_available_output_devices(): failed to initialize pulseaudio.\n"); + free(shared_data_3.sinks); + shared_data_3.sinks = NULL; + return NULL; + } + } + + // Check for successful memory allocation + if (!shared_data_3.sinks) { + fprintf(stderr, "Failed to allocate memory for sinks.\n"); + return NULL; + } + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "get_available_output_devices(): failed to initialize pulseaudio.\n"); + free(shared_data_3.sinks); + shared_data_3.sinks = NULL; + return NULL; + } + } + + + // Query PulseAudio for the list of available sinks for the specified card + op = pa_context_get_sink_info_list(shared_data_1.context, get_available_output_devices_cb, NULL); + + // Wait for the PulseAudio operation to complete + iterate(op); + + return shared_data_3.sinks; +} + +/** + * @brief Frees the memory allocated for an array of output devices (sinks). + * + * This function iterates over an array of `pa_sink_info` pointers, freeing the memory for + * each sink's name and description strings, followed by the sink structure itself. It concludes + * by freeing the memory for the array of pointers. + * + * @param sinks A pointer to the first element in an array of `pa_sink_info` pointers, which + * must be terminated with a NULL pointer. If NULL is passed, the function does nothing. + */ +void delete_output_devices(pa_sink_info **sinks) { + if (sinks == NULL) { + return; + } + + for (int i = 0; sinks[i] != NULL; ++i) { + if (sinks[i]->name) { + free((char*)sinks[i]->name); + } + if (sinks[i]->description) { + free((char*)sinks[i]->description); + } + free(sinks[i]); + } + + free(sinks); +} + +/** + * @brief Frees the memory allocated for an array of input devices (sources). + * + * This function iterates over an array of `pa_source_info` pointers, freeing the memory for + * each source's name and description strings, followed by the source structure itself. It concludes + * by freeing the memory for the array of pointers. + * + * @param sources A pointer to the first element in an array of `pa_source_info` pointers, which + * must be terminated with a NULL pointer. If NULL is passed, the function does nothing. + */ +void delete_input_devices(pa_source_info **sources) { + if (!sources) { + return; // Nothing to do if the pointer is NULL + } + + // Iterate through each source info and free its memory + for (int i = 0; sources[i] != NULL; i++) { + if (sources[i]->name) { + free((char*)sources[i]->name); + } + if (sources[i]->description) { + free((char*)sources[i]->description); + } + free(sources[i]); + } + + // Free the array of pointers itself + free(sources); +} + + +/** + * @brief Callback function used to count the available audio devices (cards). + * + * This function is called for each audio device found by PulseAudio when querying + * for the list of devices. The function increments the device_count for each device. + * When the list is exhausted or there's an error, it signals the mainloop to continue. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio device information. + * @param eol Indicates the end of the list or an error. + * @param userdata Pointer to the data shared with the main function. + */ +static void get_output_device_count_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + (void) i; + + uint32_t *device_count = (uint32_t *) userdata; + + if (eol < 0) { + // Handle error + //fprintf(stderr,"[DEBUG, get_output_device_count_cb()] Reached elo < 0. Signal triggered.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + if (eol > 0) { + // End of list + //fprintf(stderr,"[DEBUG, get_output_device_count_cb()] Reached elo > 0. Signal triggered.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + ++(*device_count); +} + + + +/** + * @brief Retrieve the count of audio devices in the system. + * + * This function queries PulseAudio to get a count of all available audio devices (cards). + * If PulseAudio is not initialized, the function attempts to initialize it. If the initialization + * fails or there's an error in fetching the device count, it returns UINT32_MAX. + * + * @return Count of audio devices or UINT32_MAX on error. + */ +uint32_t get_output_device_count(void) { + uint32_t device_count = 0; // Initialize device count to zero. + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "get_device_count(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails. + } + } + + // Check if context is valid after initialization attempt. + if (!shared_data_1.context) { + fprintf(stderr, "Context is NULL in get_device_count.\n"); + return UINT32_MAX; + } + + //fprintf(stderr,"[get_device_count()] context is, %p\n",&shared_data_1.context); + //fprintf(stderr,"[get_device_count()] mainloop is, %p\n",&shared_data_1.mainloop); + + // Query PulseAudio for the list of audio devices (cards). + // The callback get_device_count_cb will increment the device_count for each device found. + count_op = pa_context_get_card_info_list(shared_data_1.context, get_output_device_count_cb, &device_count); + + // Wait for the PulseAudio operation to complete. + iterate(count_op); + + return device_count; // Return the total count of devices. +} + +/** + * @brief Retrieves the minimum number of channels for the given ALSA device name. + * + * This function opens the specified ALSA device in capture mode, retrieves + * its hardware parameters, and then queries for the minimum number of channels + * supported by the device. + * + * @param alsa_name Name of the ALSA device. + * @return Minimum number of channels supported by the device or -1 on error. + */ +int get_min_input_channels(const char *alsa_id, const pa_source_info *source_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int min_channels = 0; + int err; + + if ((!alsa_id) && (!source_info)) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + //The input device was found, but there's no alsa information about it. + //Attempt to retrieve used channels instead. + else if((!alsa_id) && (source_info)) { + return source_info->sample_spec.channels; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK)) < 0) { + fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return source_info->sample_spec.channels; // Return channels from PulseAudio if ALSA fails + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return source_info->sample_spec.channels; + } + + if ((err = snd_pcm_hw_params_get_channels_min(params, &min_channels)) < 0) { + fprintf(stderr, "Error getting min channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return source_info->sample_spec.channels; + } + + snd_pcm_close(handle); + return min_channels; +} + + +/** + * @brief Retrieves the maximum number of channels for the given ALSA device name. + * + * This function opens the specified ALSA device in capture mode, retrieves + * its hardware parameters, and then queries for the maximum number of channels + * supported by the device. If ALSA fails, it will fall back to using the + * information from PulseAudio. + * + * @param alsa_name Name of the ALSA device. + * @param source_info Information about the PulseAudio source. + * @return Maximum number of channels supported by the device or -1 on error. + */ +int get_max_input_channels(const char *alsa_id, const pa_source_info *source_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int max_channels = 0; + int err; + + if ((!alsa_id) && (!source_info)) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + + //The input device was found, but there's no alsa information about it. + //Attempt to retrieve used channels instead. + else if((!alsa_id) && (source_info)) { + return source_info->sample_spec.channels; + } + + // Try to open the ALSA device in capture mode + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK)) < 0) { + //fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + // ALSA failed, fall back to PulseAudio information + return source_info->sample_spec.channels; + } + + // Allocate hardware parameters object + snd_pcm_hw_params_alloca(¶ms); + + // Fill it in with default values + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return source_info->sample_spec.channels; + } + + // Get the maximum number of channels + if ((err = snd_pcm_hw_params_get_channels_max(params, &max_channels)) < 0) { + fprintf(stderr, "Error getting max channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return source_info->sample_spec.channels; + } + + // Close the device + snd_pcm_close(handle); + + return max_channels; +} + +/** + * @brief Retrieves the maximum number of channels for the given ALSA device name. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the maximum number of channels + * supported by the device. + * + * @param alsa_name Name of the ALSA device. + * @return Maximum number of channels supported by the device or -1 on error. + */ +int get_max_output_channels(const char *alsa_id, const pa_sink_info *sink_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int max_channels = 0; + int err; + + if ((!alsa_id) && (!sink_info)) { + fprintf(stderr, "[get_max_output_channels()] Invalid parameters provided.\n"); + return -1; + } + //The input device was found, but there's no alsa information about it. + //Attempt to retrieve used channels instead. + else if((!alsa_id) && (sink_info)) { + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { + //fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return sink_info->sample_spec.channels; // Return channels from PulseAudio if ALSA fails + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + //fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_hw_params_get_channels_max(params, &max_channels)) < 0) { + //fprintf(stderr, "Error getting max channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + //fprintf(stderr, "[DEBUG, get_max_channels()] sink_info->sample_spec.channels is %i\n", sink_info->sample_spec.channels); + return sink_info->sample_spec.channels; + } + + snd_pcm_close(handle); + return max_channels; +} + +/** + * @brief Retrieves the minimum number of channels for the given ALSA device id. + * + * This function opens the specified ALSA device in playback mode, retrieves + * its hardware parameters, and then queries for the minimum number of channels + * supported by the device. + * + * @param alsa_name Name of the ALSA device. + * @return Minimum number of channels supported by the device or -1 on error. + */ +int get_min_output_channels(const char *alsa_id, const pa_sink_info *sink_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int min_channels = 0; + int err; + + //fprintf(stderr, "[DEBUG, get_min_output_channels()] sink_info->sample_spec.channels is %i\n", sink_info->sample_spec.channels); + + if ((!alsa_id) && (!sink_info)) { + fprintf(stderr, "Invalid parameters provided.\n"); + return -1; + } + //The input device was found, but there's no alsa information about it. + //Attempt to retrieve used channels instead. + else if((!alsa_id) && (sink_info)) { + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { + //fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); + return sink_info->sample_spec.channels; + } + + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + //fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.channels; + } + + if ((err = snd_pcm_hw_params_get_channels_min(params, &min_channels)) < 0) { + //fprintf(stderr, "Error getting min channels for device: %s, error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return sink_info->sample_spec.channels; + } + + snd_pcm_close(handle); + return min_channels; +} + +/** + * @brief Callback function for retrieving the ALSA card name of a PulseAudio source. + * + * This callback is called by the PulseAudio context during the operation to retrieve + * information about each available source. It is registered with the + * pa_context_get_source_info_by_name() function call. + * + * @param c The PulseAudio context. + * @param i The source information structure containing details about the source. + * @param eol End of list indicator. If non-zero, indicates no more data to process. + * @param userdata User data provided when registering the callback. In this case, it is + * expected to be the name of the source for which we want the ALSA card name. + * + * @note This function is intended to be used internally and should not be called directly. + * + * @warning This function uses global shared data (shared_data_2.alsa_name) to store the + * retrieved ALSA name, and signals the main loop to stop waiting. Ensure that + * the main loop and shared data are properly managed. + */ +static void get_alsa_input_name_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; + + if (eol < 0 || !i) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; // Handle error or invalid source info + } + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; // End of list + } + + // Check if this source is the one we're interested in + if (userdata && strcmp(i->name, (const char *)userdata) == 0) { + const char *prop_alsa_card_name = pa_proplist_gets(i->proplist, "alsa.card_name"); + if (prop_alsa_card_name) { + shared_data_2.alsa_name = strdup(prop_alsa_card_name); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); // Signal to stop the loop + } + } +} + +/** + * @brief Retrieves the ALSA name of a given PulseAudio source. + * + * @param source_name The name of the source for which to retrieve the ALSA name. + * @return The ALSA name of the source or NULL if not found or on error. + */ +char* get_alsa_input_name(const char *source_name) { + if (!source_name) { + fprintf(stderr, "[get_alsa_input_name()] Invalid source name.\n"); + return NULL; + } + + shared_data_2.alsa_name = NULL; // Ensure alsa_name is initialized to NULL + + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "get_alsa_input_name(): PulseAudio initialization failed.\n"); + return NULL; + } + + pa_operation *name_op = pa_context_get_source_info_by_name(shared_data_1.context, source_name, get_alsa_input_name_cb, (void*)source_name); + iterate(name_op); + + return shared_data_2.alsa_name; +} + + +/** + * @brief Callback function to retrieve the ALSA name from the card info. + * + * This callback checks for the "alsa.card_name" property in the card's + * proplist. If the property is found, it assigns the property's value + * to the shared data structure for further use. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the card info structure. + * @param eol Flag indicating end of list. + * @param userdata User-defined data pointer (unused in this callback). + */ +static void get_alsa_output_name_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + + if (eol) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + const char *target_sink_name = userdata; + if (target_sink_name && strcmp(target_sink_name, i->name) != 0) { + return; // Skip this sink, as it does not match the specified name + } + + const char *alsa_name = pa_proplist_gets(i->proplist, "alsa.card_name"); + if (alsa_name) { + shared_data_2.alsa_name = strdup(alsa_name); + if (!shared_data_2.alsa_name) { + fprintf(stderr, "Failed to allocate memory for ALSA name.\n"); + } + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } +} + + + +/** + * @brief Retrieves the ALSA name of the first audio device encountered. + * + * This function initializes PulseAudio (if not already initialized), then + * queries PulseAudio for the list of audio devices. It waits for the + * retrieval operation to complete and then returns the ALSA name + * of the first device it finds with the "alsa.card_name" property. + * + * @return ALSA name of the device or NULL if not found or on error. + */ +char* get_alsa_output_name(const char *sink_name) { + pa_operation *name_op; + + shared_data_2.alsa_name = NULL; // Ensure alsa_name is initialized to NULL + + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "[get_alsa_output_name()] PulseAudio initialization failed.\n"); + return NULL; + } + + name_op = pa_context_get_sink_info_list(shared_data_1.context, get_alsa_output_name_cb, (void*)sink_name); + iterate(name_op); + + return shared_data_2.alsa_name; +} + +/** + * @brief Callback function to retrieve the ALSA device string based on PulseAudio source information. + * + * This function is called for each available PulseAudio source. It checks if the source's name matches + * the target source name provided in the userdata. If a match is found, it retrieves the "alsa.card" and + * "alsa.device" properties from the source's proplist, constructs the ALSA device string in the format + * "hw:,", and stores it in shared data for later retrieval. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the source information structure. + * @param eol End of list flag. If non-zero, indicates the end of the source list. + * @param userdata User-defined data pointer. In this case, it points to the target source name string. + */ +static void get_alsa_input_id_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; // Unused parameter + + // Check for end of list + if (eol) { + // Signal the main loop to unblock the iterate function + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + free(userdata); + return; + } + + // Retrieve the target source name from userdata + const char *target_source_name = (const char *)userdata; + + // Skip this source if it does not match the specified target name + if (target_source_name && strcmp(target_source_name, i->name) != 0) { + return; + } + + // Attempt to retrieve the "alsa.card" and "alsa.device" properties + const char *alsa_card = pa_proplist_gets(i->proplist, "alsa.card"); + const char *alsa_device = pa_proplist_gets(i->proplist, "alsa.device"); + + //print_proplist(i->proplist); + //printf("[DEBUG, get_alsa_input_id_cb] alsa_card is %s\n", alsa_card); + //printf("[DEBUG, get_alsa_input_id_cb] alsa_device is %s\n", alsa_device); + + // Construct the ALSA device string if both properties are available + if (alsa_card && alsa_device && isdigit((unsigned char)alsa_device[0])) { + char alsa_device_string[128]; + snprintf(alsa_device_string, sizeof(alsa_device_string), "hw:%s,%s", alsa_card, alsa_device); + + // Store the ALSA device string in shared data + shared_data_2.alsa_id = strdup(alsa_device_string); + if (!shared_data_2.alsa_id) { + fprintf(stderr, "Failed to allocate memory for ALSA device id.\n"); + } + } else { + // Log an error if ALSA properties are not found or are invalid + //fprintf(stderr, " - ALSA properties not found or invalid for source.\n"); + shared_data_2.alsa_id = NULL; + } + + // Signal the main loop to unblock the iterate function + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + +/** + * @brief Retrieves the ALSA device string for a given PulseAudio source name. + * + * This function initializes PulseAudio (if not already initialized), then queries PulseAudio for the + * information of a specific source by its name. It waits for the retrieval operation to complete and then + * returns the constructed ALSA device string based on the "alsa.card" and "alsa.device" properties of + * the source. + * + * @param source_name The name of the PulseAudio source. + * @return ALSA device string in the format "hw:," or NULL if not found or on error. + */ +char* get_alsa_input_id(const char *source_name) { + // Operation object for asynchronous PulseAudio calls + pa_operation *op; + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "[get_alsa_input_id()] PulseAudio initialization failed.\n"); + return NULL; + } + } + + // Duplicate the source name to ensure it remains valid throughout the operation + char *source_name_copy = strdup(source_name); + if (!source_name_copy) { + fprintf(stderr, "[get_alsa_input_id()] Failed to allocate memory for source name.\n"); + return NULL; + } + + // Start querying PulseAudio for the specified source information + op = pa_context_get_source_info_by_name(shared_data_1.context, source_name_copy, get_alsa_input_id_cb, source_name_copy); + + // Block and wait for the operation to complete + iterate(op); + + // After the callback has been called with the source information, the ALSA device ID will be stored + // Return the stored ALSA device ID + return shared_data_2.alsa_id; +} + + +/** + * @brief Callback function to retrieve the ALSA device string based on the PulseAudio sink information. + * + * This function is called for each available PulseAudio sink. It checks if the sink's name matches the + * target sink name provided in the userdata. If a match is found, it retrieves the "alsa.card" and + * "alsa.device" properties from the sink's proplist, constructs the ALSA device string in the format + * "hw:,", and stores it in shared data for later retrieval. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the sink information structure. + * @param eol End of list flag. If non-zero, indicates the end of the sink list. + * @param userdata User-defined data pointer. In this case, it points to the target sink name string. + */ +static void get_alsa_output_id_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; // Unused parameter + + // Check for end of list + if (eol) { + // Signal the main loop to unblock the iterate function + //fprintf(stderr,"[DEBUG, get_alsa_id_cb()] End of function reached.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + free(userdata); + return; + } + + // Retrieve the target sink name from userdata + const char *target_sink_name = userdata; + + // If a target sink name is provided, check if it matches the current sink's name + if (target_sink_name && strcmp(target_sink_name, i->name) != 0) { + return; // Skip this sink, as it does not match the specified name + } + + // Attempt to retrieve the "alsa.card" and "alsa.device" properties + const char *alsa_card = pa_proplist_gets(i->proplist, "alsa.card"); + const char *alsa_device = pa_proplist_gets(i->proplist, "alsa.device"); + + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()], alsa.card is %s\n", alsa_card); + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()], alsa.device is %s\n", alsa_device); + + // Check if both properties are available and alsa.device is a digit + if (alsa_card && alsa_device && isdigit((unsigned char)alsa_device[0])) { + // Construct the ALSA device string + char alsa_device_string[128]; + snprintf(alsa_device_string, sizeof(alsa_device_string), "hw:%s,%s", alsa_card, alsa_device); + + // Store the ALSA device string in shared data + shared_data_2.alsa_id = strdup(alsa_device_string); + if (!shared_data_2.alsa_id) { + fprintf(stderr, "Failed to allocate memory for ALSA device id.\n"); + } + } else { + shared_data_2.alsa_id = NULL; + //fprintf(stderr, " - ALSA properties not found or invalid for sink.\n"); + } + + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()] alsa ID is %s\n", shared_data_2.alsa_id); + + // Signal the main loop to unblock the iterate function + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + + +/** + * @brief Retrieves the ALSA device string for a given PulseAudio sink name. + * + * This function initializes PulseAudio (if not already initialized), then queries PulseAudio for the + * information of a specific sink by its name. It waits for the retrieval operation to complete and then + * returns the constructed ALSA device string based on the "alsa.card" and "alsa.device" properties of + * the sink. + * + * @param sink_name The name of the PulseAudio sink. + * @return ALSA device string in the format "hw:," or NULL if not found or on error. + */ +char* get_alsa_output_id(const char *sink_name) { + pa_operation *op; + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "[get_alsa_output_id()] PulseAudio initialization failed.\n"); + return NULL; + } + } + + // Make a copy of the sink name to ensure it remains valid + char *sink_name_copy = strdup(sink_name); + if (!sink_name_copy) { + fprintf(stderr, "[get_alsa_output_id()] Failed to allocate memory for sink name.\n"); + return NULL; + } + + // Query PulseAudio for the information of the specified sink + //fprintf(stderr,"[DEBUG, get_alsa_id()] sink name is: %s\n", sink_name_copy); + op = pa_context_get_sink_info_by_name(shared_data_1.context, sink_name_copy, get_alsa_output_id_cb, sink_name_copy); + + // Wait for the PulseAudio operation to complete + iterate(op); + + // Return the ALSA device string retrieved by the callback function + return shared_data_2.alsa_id; +} + + +/** + * @brief Retrieves the sample rate of the specified PulseAudio source by ALSA identifier. + * + * Attempts to open the ALSA device corresponding to the given PulseAudio source + * to query the sample rate. If the ALSA query fails, the function falls back to + * returning the sample rate as reported by the PulseAudio source information. + * + * @param alsa_id The ALSA device identifier corresponding to the PulseAudio source. + * @param source_info The PulseAudio source information structure. + * @return The sample rate of the source in Hz on success, or -1 on error. + */ +int get_input_sample_rate(const char *alsa_id, pa_source_info *source_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int sample_rate = 0; // Default to a known value + int err; + + // Output debug information to stderr + //fprintf(stderr, "[DEBUG, get_input_sample_rate()] called with alsa_id: '%s'\n", alsa_id); + + // If alsa_id is NULL, return the PulseAudio rate + if (!alsa_id && source_info) { + //fprintf(stderr, "alsa_id is NULL, returning PulseAudio sample rate: %u Hz\n", source_info->sample_spec.rate); + return source_info->sample_spec.rate; + } + + // Validate parameters + if (!alsa_id || !source_info) { + //fprintf(stderr, "Invalid parameters provided to get_input_sample_rate.\n"); + return -1; + } + + // Attempt to open the ALSA device + //fprintf(stderr, "[DEBUG, get_input_sample_rate()] Attempting to open ALSA device: '%s'\n", alsa_id); + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK)) < 0) { + fprintf(stderr, "Unable to open PCM device: '%s', error: %s\n", alsa_id, snd_strerror(err)); + return source_info->sample_spec.rate; + } + + // ALSA device successfully opened + //fprintf(stderr, "ALSA device: '%s' successfully opened.\n", alsa_id); + snd_pcm_hw_params_alloca(¶ms); + + // Initialize hardware parameters + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the access type for the hardware parameters + if ((err = snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { + fprintf(stderr, "Cannot set access type: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the sample format for the hardware parameters + if ((err = snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE)) < 0) { + fprintf(stderr, "Cannot set sample format: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the channel count for the hardware parameters + if ((err = snd_pcm_hw_params_set_channels(handle, params, source_info->sample_spec.channels)) < 0) { + fprintf(stderr, "Cannot set channel count: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Apply the hardware parameters to the device + if ((err = snd_pcm_hw_params(handle, params)) < 0) { + fprintf(stderr, "Cannot set hardware parameters: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Now try to get the sample rate + if ((err = snd_pcm_hw_params_get_rate(params, &sample_rate, 0)) < 0) { + fprintf(stderr, "Error getting sample rate for device: '%s', error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Sample rate successfully obtained + //fprintf(stderr, "Sample rate for ALSA device: '%s' is %u Hz\n", alsa_id, sample_rate); + snd_pcm_close(handle); + return sample_rate; // Successfully obtained sample rate +} + + +/** + * @brief Retrieves the sample rate of the specified PulseAudio sink by ALSA identifier. + * + * Attempts to open the ALSA device corresponding to the given PulseAudio sink + * to query the sample rate. If the ALSA query fails, the function falls back to + * returning the sample rate as reported by the PulseAudio sink information. + * + * @param alsa_id The ALSA device identifier corresponding to the PulseAudio sink. + * @param sink_info The PulseAudio sink information structure. + * @return The sample rate of the sink in Hz on success, or -1 on error. + */ +int get_output_sample_rate(const char *alsa_id, const pa_sink_info *sink_info) { + snd_pcm_t *handle; + snd_pcm_hw_params_t *params; + unsigned int sample_rate = 0; // Default to a known value + int err; + + //fprintf(stderr, "[DEBUG, get_output_sample_rate()] called with alsa_id: '%s'\n", alsa_id); + + if (!alsa_id && sink_info) { + //fprintf(stderr, "alsa_id is NULL, returning PulseAudio sample rate: %u Hz\n", sink_info->sample_spec.rate); + return sink_info->sample_spec.rate; + } + + if (!alsa_id || !sink_info) { + //fprintf(stderr, "Invalid parameters provided to get_output_sample_rate.\n"); + return -1; + } + + //fprintf(stderr, "Attempting to open ALSA device: '%s'\n", alsa_id); + + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, 0)) < 0) { + fprintf(stderr, "Unable to open PCM device: '%s', error: %s\n", alsa_id, snd_strerror(err)); + return sink_info->sample_spec.rate; + } + + //fprintf(stderr, "ALSA device: '%s' successfully opened.\n", alsa_id); + snd_pcm_hw_params_alloca(¶ms); + if ((err = snd_pcm_hw_params_any(handle, params)) < 0) { + fprintf(stderr, "Cannot initialize hardware parameter structure: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the access type for the hardware parameters + if ((err = snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { + fprintf(stderr, "Cannot set access type: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the sample format for the hardware parameters + if ((err = snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE)) < 0) { + fprintf(stderr, "Cannot set sample format: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Set the channel count for the hardware parameters + if ((err = snd_pcm_hw_params_set_channels(handle, params, sink_info->sample_spec.channels)) < 0) { + fprintf(stderr, "Cannot set channel count: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Apply the hardware parameters to the device + if ((err = snd_pcm_hw_params(handle, params)) < 0) { + fprintf(stderr, "Cannot set hardware parameters: %s\n", snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + // Now try to get the sample rate + if ((err = snd_pcm_hw_params_get_rate(params, &sample_rate, 0)) < 0) { + fprintf(stderr, "Error getting sample rate for device: '%s', error: %s\n", alsa_id, snd_strerror(err)); + snd_pcm_close(handle); + return -1; + } + + //fprintf(stderr, "Sample rate for ALSA device: '%s' is %u Hz\n", alsa_id, sample_rate); + snd_pcm_close(handle); + return sample_rate; // Successfully obtained sample rate +} + + +/** + * @brief Callback function for retrieving source information to get ports. + * + * This function is called by the PulseAudio context as a callback during the + * operation initiated by `pa_context_get_source_info_list()`. It processes + * each `pa_source_info` structure provided by PulseAudio, storing the relevant + * data (name and description) of each source port in a `pa_source_info_list`. + * The function also handles the end-of-list (EOL) signal from PulseAudio to + * mark completion of the data retrieval process. + * + * @param c The PulseAudio context. + * @param i The source information structure provided by PulseAudio. + * @param eol End-of-list flag. A positive value indicates the end of data from PulseAudio. + * @param userdata A pointer to user-provided data, expected to be of type `pa_source_info_list`. + */ +void get_source_port_info_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; + + pa_source_info_list *info_list = (pa_source_info_list *)userdata; + if (eol > 0) { + info_list->done = 1; + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + info_list->ports = realloc(info_list->ports, (info_list->num_ports + 1) * sizeof(pa_port_info)); + pa_port_info *port = &info_list->ports[info_list->num_ports]; + port->name = strdup(i->name); + port->description = strdup(i->description); + port->is_active = 0; // Will be set in the active port callback + + info_list->num_ports++; +} + +/** + * @brief Callback function for retrieving active source port information. + * + * This function is a callback for `pa_context_get_source_info_by_name()`. It is + * used to determine which of the previously listed source ports is currently active. + * It updates the `is_active` flag in the corresponding `pa_port_info` structure + * within the `pa_source_info_list` if a match is found with the active port name. + * + * @param c The PulseAudio context. + * @param i The source information structure, including the active port details. + * @param eol End-of-list flag. A positive value indicates the end of data from PulseAudio. + * @param userdata A pointer to user-provided data, expected to be of type `pa_source_info_list`. + */ +void get_source_port_info_cb2(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; + pa_source_info_list *info_list = (pa_source_info_list *)userdata; + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (i->active_port) { + for (int j = 0; j < info_list->num_ports; ++j) { + if (strcmp(info_list->ports[j].name, i->active_port->name) == 0) { + info_list->ports[j].is_active = 1; + break; + } + } + } +} + +/** + * @brief Retrieves a list of source port information from PulseAudio. + * + * This function queries PulseAudio for the list of available source ports + * (such as microphone inputs, line-ins, etc.) and retrieves detailed information + * for each source. It initializes PulseAudio if not already initialized, then + * allocates and populates a `pa_source_info_list` structure with the source port + * information. Each entry in the list contains details about a specific source port. + * + * @note The function attempts to initialize PulseAudio if it is not already initialized. + * + * @return A pointer to a `pa_source_info_list` structure containing the list of source + * ports and their information. Returns NULL if PulseAudio cannot be initialized, + * if memory allocation fails, or if the query to PulseAudio fails. + */ +pa_source_info_list* get_source_port_info() { + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "[get_source_port_info()] Failed to initialize pulseaudio.\n"); + return NULL; // Return error if initialization fails. + } + } + + pa_source_info_list* info_list = malloc(sizeof(pa_source_info_list)); + if (!info_list) { + // Handle malloc failure + return NULL; + } + memset(info_list, 0, sizeof(pa_source_info_list)); + + // Call the function to get the list of sources + pa_operation *op = pa_context_get_source_info_list(shared_data_1.context, get_source_port_info_cb, info_list); + iterate(op); + + // Now iterate over the collected sources and get detailed info for each one + for (int i = 0; i < info_list->num_ports; ++i) { + op = pa_context_get_source_info_by_name(shared_data_1.context, info_list->ports[i].name, get_source_port_info_cb2, info_list); + + iterate(op); + } + + // The info_list now contains all the ports and their active status + return info_list; +} + + +/** + * @brief Retrieves the volume of a given channel from a PulseAudio sink. + * + * This function takes a pointer to a pa_sink_info structure and a channel index + * and returns the volume of that channel. The volume is given as a pa_volume_t, + * which is an unsigned 32-bit integer. The function checks if the channel index + * is within the valid range for the sink. + * + * @param sink_info A pointer to a pa_sink_info structure containing the sink details. + * @param channel_index The index of the channel for which to retrieve the volume. + * @return The volume of the specified channel as a pa_volume_t, or PA_VOLUME_INVALID on error. + */ +pa_volume_t get_channel_volume(const pa_sink_info *sink_info, unsigned int channel_index) { + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "get_channel_volume(): failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails. + } + } + + // Check if the sink_info is NULL + + if (sink_info == NULL) { + return PA_VOLUME_INVALID; // Return invalid volume if sink_info is NULL + } + + // Check if the provided channel index is valid + if (channel_index >= sink_info->channel_map.channels) { + return PA_VOLUME_INVALID; // Return invalid volume if the channel_index is out of range + } + + // Retrieve the volume of the given channel + return sink_info->volume.values[channel_index]; +} + + + +/** + * @brief Callback function for processing each available audio input device (source) found. + * + * This function is called by the PulseAudio context as part of the operation initiated by + * `get_available_input_devices`. It is invoked for each source found, and is responsible for + * storing the details of each source into a dynamically allocated array. The function handles + * memory allocation for the array of `pa_source_info` structures, as well as for the strings + * within them. It also handles error conditions and signals the mainloop to terminate the wait + * when the end of the source list is reached or an error occurs. + * + * @param c The PulseAudio context. + * @param i The `pa_source_info` structure containing details about the current source. + * @param eol End-Of-List indicator. If positive, indicates the end of the list; if negative, indicates an error. + * @param userdata User data pointer provided during the context operation setup; unused in this callback. + */ +static void get_available_input_devices_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void)c; // Unused parameter + (void)userdata; // Unused parameter + + // Error or end of list + if (eol < 0) { + fprintf(stderr, "Error occurred while getting source info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (eol > 0) { + shared_data_sources.sources[shared_data_sources.count] = NULL; // Sentinel value + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (shared_data_sources.count >= shared_data_sources.allocated) { + size_t new_alloc = shared_data_sources.allocated + 8; + void *temp = realloc(shared_data_sources.sources, new_alloc * sizeof(pa_source_info *)); + if (!temp) { + fprintf(stderr, "Out of memory when reallocating sources array.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + shared_data_sources.sources = temp; + shared_data_sources.allocated = new_alloc; + } + + shared_data_sources.sources[shared_data_sources.count] = malloc(sizeof(pa_source_info)); + if (!shared_data_sources.sources[shared_data_sources.count]) { + fprintf(stderr, "Out of memory when allocating source info.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + *(shared_data_sources.sources[shared_data_sources.count]) = *i; + + if (i->name) { + shared_data_sources.sources[shared_data_sources.count]->name = strdup(i->name); + if (!shared_data_sources.sources[shared_data_sources.count]->name) { + fprintf(stderr, "Out of memory when duplicating source name.\n"); + } + } + if (i->description) { + shared_data_sources.sources[shared_data_sources.count]->description = strdup(i->description); + if (!shared_data_sources.sources[shared_data_sources.count]->description) { + fprintf(stderr, "Out of memory when duplicating source description.\n"); + } + } + + shared_data_sources.count++; +} + + +/** + * @brief Retrieves an array of available audio input devices (sources). + * + * This function queries the PulseAudio server for a list of all audio input devices + * currently available. It ensures that PulseAudio is initialized before making the query + * and locks the main loop to provide thread safety during the operation. + * + * Each call to this function should be followed by a call to `delete_input_devices` + * to free the allocated memory for the returned array of `pa_source_info` pointers. + * + * @note The array is terminated with a NULL pointer as the last element. + * + * @return On success, a pointer to an array of `pa_source_info` pointers, each representing + * an audio input device. On failure, or if PulseAudio is not initialized, NULL is returned. + */ +pa_source_info **get_available_input_devices() { + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "[get_available_input_devices()] Failed to initialize PulseAudio.\n"); + return NULL; + } + } + + // Initialize the data structure for storing the sources + shared_data_sources.sources = NULL; + shared_data_sources.count = 0; + shared_data_sources.allocated = 0; + + // Start the operation to get available input devices + pa_operation *op = pa_context_get_source_info_list(shared_data_1.context, get_available_input_devices_cb, NULL); + if (op) { + // iterate handles locking, waiting, and cleanup + iterate(op); + } else { + fprintf(stderr, "Failed to create the operation to get source info.\n"); + return NULL; + } + + // Allocate one extra pointer to NULL at the end as a sentinel + shared_data_sources.sources = realloc(shared_data_sources.sources, (shared_data_sources.count + 1) * sizeof(pa_source_info *)); + if (shared_data_sources.sources) { + shared_data_sources.sources[shared_data_sources.count] = NULL; // Set the sentinel value + } else { + fprintf(stderr, "Out of memory while allocating sources array.\n"); + } + + return shared_data_sources.sources; +} + + +/** + * @brief Callback function used to count the available audio input devices (sources). + * + * This function is called for each audio input device found by PulseAudio when querying + * for the list of sources. The function increments the device_count for each device. + * When the list is exhausted or there's an error, it signals the mainloop to continue. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the current audio input device information. + * @param eol End-Of-List indicator. If positive, indicates the end of the list; if negative, indicates an error. + * @param userdata Pointer to the user data, which in this case is expected to be a pointer to the device_count. + */ +static void get_input_device_count_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; // Suppress unused parameter warning + (void) i; // Suppress unused parameter warning + + uint32_t *device_count = (uint32_t *) userdata; + + if (eol < 0) { + // Handle error + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + if (eol > 0) { + // End of list + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + ++(*device_count); +} + + +/** + * @brief Retrieve the count of audio input devices in the system. + * + * This function queries PulseAudio to get a count of all available audio input devices (sources). + * If PulseAudio is not initialized, the function attempts to initialize it. If the initialization + * fails or there's an error in fetching the device count, it returns UINT32_MAX. + * + * @return Count of audio input devices or UINT32_MAX on error. + */ +uint32_t get_input_device_count(void) { + uint32_t device_count = 0; // Initialize device count to zero + pa_operation *count_op = NULL; + + // Check if PulseAudio is initialized + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized + if (!initialize_pulse()) { + fprintf(stderr, "[get_input_device_count()] Failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails + } + } + + // Check if context is valid after initialization attempt + if (!shared_data_1.context) { + fprintf(stderr, "Context is NULL in get_input_device_count.\n"); + return UINT32_MAX; + } + + // Query PulseAudio for the list of audio input devices (sources) + count_op = pa_context_get_source_info_list(shared_data_1.context, get_input_device_count_cb, &device_count); + + // Wait for the PulseAudio operation to complete + iterate(count_op); + + return device_count; // Return the total count of input devices +} + + +/** + * @brief Get the channel names for a specific sink identified by its name. + * + * This function retrieves the channel names for a given sink using its unique name. + * It allocates an array of strings where each entry corresponds to a channel name + * of the sink. The caller is responsible for freeing the memory allocated for the + * array of channel names and the strings themselves. + * + * @param sink_name The name of the sink whose channel names are to be retrieved. + * @param num_channels Number of channels of the sink. + * @return A pointer to an array of strings containing the channel names, or NULL if + * the sink is not found or in case of an error. + */ +char** get_output_channel_names(const char *pulse_id, int num_channels) { + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "[get_output_channel_names()] Failed to initialize pulseaudio.\n"); + return NULL; // Return error if initialization fails. + } + } + + // Validate input parameters + if (!pulse_id) { + return NULL; // Return NULL if the sink name is not provided + } + + // Retrieve the sink information for the specified sink name + pa_sink_info *device_info = get_output_device_by_name(pulse_id); + + // Check if the sink was found + if (!device_info) { + return NULL; // Return NULL if the sink is not found or in case of an error + } + + char **channel_names = calloc(num_channels, sizeof(char*)); + + if (!channel_names) { + free((char *)device_info->description); // Free the description if allocated + free(device_info); // Free the device_info structure + return NULL; // Return NULL if memory allocation fails + } + + // Copy the channel names into the array + for (int i = 0; i < num_channels; ++i) { + channel_names[i] = strdup(pa_channel_position_to_pretty_string(device_info->channel_map.map[i])); + if (!channel_names[i]) { + // Handle allocation failure for a channel name + // Free all previously allocated names and the array itself + while (i--) free(channel_names[i]); + free(channel_names); + free((char *)device_info->description); // Free the description if allocated + free(device_info); // Free the device_info structure + return NULL; // Return NULL if memory allocation fails + } + } + + // Free the sink_info structure and its description field + if (device_info->description) { + free((char *)device_info->description); // Corrected free statement + } + free(device_info); + + // Return the array of channel names + return channel_names; +} + +/** + * @brief Get the channel names for a specific source identified by its name. + * + * This function retrieves the channel names for a given source using its unique name. + * It allocates an array of strings where each entry corresponds to a channel name + * of the source. The caller is responsible for freeing the memory allocated for the + * array of channel names and the strings themselves. + * + * @param source_name The name of the source whose channel names are to be retrieved. + * @param num_channels Number of channels of the source. + * @return A pointer to an array of strings containing the channel names, or NULL if + * the source is not found or in case of an error. + */ +char** get_input_channel_names(const char *pulse_code, int num_channels) { + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "[get_input_channel_names()] Failed to initialize pulseaudio.\n"); + return NULL; // Return error if initialization fails. + } + } + + // Validate input parameters + if (!pulse_code) { + return NULL; // Return NULL if the source name is not provided + } + + // Retrieve the source information for the specified source name + pa_source_info *device_info = get_input_device_by_name(pulse_code); + + // Check if the source was found + if (!device_info) { + return NULL; // Return NULL if the source is not found or in case of an error + } + + char **channel_names = calloc(num_channels, sizeof(char*)); + if (!channel_names) { + free((char *)device_info->description); // Free the description if allocated + free(device_info); // Free the device_info structure + return NULL; // Return NULL if memory allocation fails + } + + // Copy the channel names into the array + for (int i = 0; i < num_channels; ++i) { + channel_names[i] = strdup(pa_channel_position_to_pretty_string(device_info->channel_map.map[i])); + if (!channel_names[i]) { + // Handle allocation failure for a channel name + while (i--) free(channel_names[i]); // Free all previously allocated names + free(channel_names); // Free the array itself + free((char *)device_info->description); // Free the description if allocated + free(device_info); // Free the device_info structure + return NULL; // Return NULL if memory allocation fails + } + } + + // Free the source_info structure and its description field + if (device_info->description) { + free((char *)device_info->description); + } + free(device_info); + + // Return the array of channel names + return channel_names; +} + +/** + * @brief Retrieve a source (input device) information by its name. + * + * This function searches for an audio source with the given name and returns its information + * if found. The caller is responsible for freeing the memory allocated for the source info + * and its description. + * + * @param source_name The name of the source to be retrieved. + * @return A pointer to a pa_source_info structure containing the source information, + * or NULL if the source is not found or in case of an error. + */ +pa_source_info *get_input_device_by_name(const char *source_name) { + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "[get_input_device_by_name()] Failed to initialize pulseaudio.\n"); + return NULL; // Return error if initialization fails. + } + } + + if (!source_name) { + return NULL; // Handle null pointer argument + } + + // Retrieve the list of available input devices (sources) + pa_source_info **available_sources = get_available_input_devices(); + if (!available_sources) { + return NULL; // Handle error in retrieving sources + } + + pa_source_info *input_device_info = NULL; + + // Iterate over the list of sources to find the one with the matching name + for (int i = 0; available_sources[i] != NULL; ++i) { + if (strcmp(available_sources[i]->name, source_name) == 0) { + // Found the matching source, make a copy of the source_info structure + input_device_info = malloc(sizeof(pa_source_info)); + if (input_device_info) { + memcpy(input_device_info, available_sources[i], sizeof(pa_source_info)); + + // If the source has a description, also copy that string + if (available_sources[i]->description) { + input_device_info->description = strdup(available_sources[i]->description); + } + } + break; // Exit the loop after finding the matching source + } + } + + // Clean up the source information now that we're done with it + // Assuming there's a function to delete input devices similar to delete_output_devices + delete_input_devices(available_sources); + + return input_device_info; // Return the found source or NULL if not found +} + +/** + * @brief Retrieve a copy of the sink information for a given sink name. + * + * This function searches through the available output devices and returns a copy of the + * pa_sink_info structure for the sink that matches the provided name. It uses the + * get_available_output_devices function to obtain the list of all sinks and then + * iterates through them to find the sink with the given name. + * + * @param sink_name The name of the sink to search for. Must not be NULL. + * @return A pointer to a newly allocated pa_sink_info structure containing the sink + * information, or NULL if the sink is not found or if an error occurs. The + * caller is responsible for freeing the returned structure and its description + * field (if not NULL) when no longer needed. + * + * @note The function allocates memory for the returned pa_sink_info structure and its + * description field. It is the responsibility of the caller to free this memory + * using free(). If the sink has other dynamically allocated fields, these must + * also be freed by the caller. + * + * + * Usage Example: + * @code + * pa_sink_info *sink_info = get_sink_by_name("alsa_output.pci-0000_00_1b.0.analog-stereo"); + * if (sink_info) { + * // Use the sink information + * ... + * // Free the memory allocated for the description + * if (sink_info->description) { + * free(sink_info->description); + * } + * // Free the memory allocated for the sink_info structure + * free(sink_info); + * } + * @endcode + */ +pa_sink_info *get_output_device_by_name(const char *sink_name) { + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "[get_output_device_by_name()] Failed to initialize pulseaudio.\n"); + return NULL; // Return error if initialization fails. + } + } + + if (!sink_name) { + return NULL; // Handle null pointer argument + } + + // Retrieve the list of available output devices (sinks) + pa_sink_info **available_sinks = get_available_output_devices(); + if (!available_sinks) { + return NULL; // Handle error in retrieving sinks + } + + pa_sink_info *output_device_to_return = NULL; + + // Iterate over the list of sinks to find the one with the matching name + for (int i = 0; available_sinks[i] != NULL; ++i) { + if (strcmp(available_sinks[i]->name, sink_name) == 0) { + // Found the matching output_device, make a copy of the sink_info structure + output_device_to_return = malloc(sizeof(pa_sink_info)); + if (output_device_to_return) { + memcpy(output_device_to_return, available_sinks[i], sizeof(pa_sink_info)); + + // If the sink has a description, also copy that string + if (available_sinks[i]->description) { + output_device_to_return->description = strdup(available_sinks[i]->description); + } + } + break; // Exit the loop after finding the matching sink + } + } + + // Clean up the sink information now that we're done with it + delete_output_devices(available_sinks); + + return output_device_to_return; // Return the found sink or NULL if not found +} + +/** + * @brief Callback for handling the result of the sink information fetch operation. + * + * This callback is called by the PulseAudio library when sink information is ready to be + * retrieved, or when the iteration over sinks has finished. The function will copy the sink + * information to the provided user data structure if available, or signal the main loop to + * continue if the end of the list is reached or if an error occurs. + * + * @param c The PulseAudio context. + * @param i The sink information structure provided by PulseAudio. + * @param eol End of list indicator. If positive, indicates the end of the list; if negative, + * indicates failure to retrieve sink information. + * @param userdata User data pointer provided to the pa_context_get_sink_info_by_index function, + * expected to be a pointer to a pa_sink_info structure. + */ +static void get_output_device_by_index_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + + pa_sink_info *sink_info = userdata; + + if (eol < 0 || eol > 0 || !i) { + // Either an error occurred, or we've reached the end of the list without finding the sink + // Signal main loop to continue in case of end of list + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } + return; + } + + // Copy the sink information to the allocated structure + *sink_info = *i; // Shallow copy first + + // Now duplicate any strings + if (i->name) { + sink_info->name = strdup(i->name); + } + if (i->description) { + sink_info->description = strdup(i->description); + } + + // Signal the main loop that the data is ready + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + +/** + * @brief Retrieve the sink information for a given output device by its index. + * + * This function initiates an asynchronous operation to fetch the sink information + * for the specified device index. The operation is handled synchronously within this + * function using a threaded mainloop to wait for completion. + * + * @param index The index of the sink for which information is to be retrieved. + * @param sink_info A pointer to a pa_sink_info structure where the sink information will be stored. + * @return int Returns 1 on success or 0 if the operation fails. + * + */ +pa_sink_info* get_output_device_by_index(uint32_t index) { + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "[get_output_device_by_index] Failed to initialize pulseaudio.\n"); + return NULL; // Return error if initialization fails. + } + } + + if (!shared_data_1.context || !shared_data_1.mainloop) { + fprintf(stderr, "Invalid shared data context or mainloop.\n"); + return NULL; + } + + // Allocate memory for sink_info + pa_sink_info *sink_info = malloc(sizeof(pa_sink_info)); + if (!sink_info) { + fprintf(stderr, "Memory allocation for sink_info failed.\n"); + return NULL; + } + + // Start the operation to get the sink information + pa_operation *op = pa_context_get_sink_info_by_index(shared_data_1.context, index, get_output_device_by_index_cb, sink_info); + iterate(op); + + // Check if the operation was successful + if (sink_info->name == NULL) { + // The operation was not successful, free the allocated memory. + free(sink_info); + return NULL; + } + + return sink_info; // Return the allocated sink_info +} + +/** + * @brief Callback for retrieving information about a specific audio input source by index. + * + * This function is the callback used by `pa_context_get_source_info_by_index` within + * the `get_input_device_by_index` function to handle the response from PulseAudio. + * It is called by the PulseAudio main loop when the source information is available or + * when an error or end-of-list condition is signaled. + * + * @param c Pointer to the PulseAudio context, not used in this callback. + * @param i Pointer to the source information structure containing the details of the source. + * @param eol End-of-list flag that is positive if there is no more data to process, negative + * if an error occurred during the iteration. + * @param userdata User data provided when initiating the operation; expected to be a pointer + * to a `pa_source_info` structure where the source information will be stored. + * + */ +static void get_input_device_by_index_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; + + pa_source_info *source_info = userdata; + + if (eol < 0 || eol > 0 || !i) { + // Either an error occurred, or we've reached the end of the list without finding the source + if (eol != 0) { + // Signal main loop to continue + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + } + return; + } + + // Copy the source information to the allocated structure + *source_info = *i; // Shallow copy first + + // Now duplicate any strings + if (i->name) { + source_info->name = strdup(i->name); + } + if (i->description) { + source_info->description = strdup(i->description); + } + + // Signal the main loop that the data is ready + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + +/** + * @brief Retrieves the information of an audio input device (source) by its index. + * + * This function attempts to allocate memory for a `pa_source_info` structure and retrieve + * the information for the specified source index using PulseAudio's API. It blocks until + * the asynchronous operation to fetch the source information is complete or an error occurs. + * + * @param index The index of the input device (source) as recognized by PulseAudio. + * @return A pointer to the allocated `pa_source_info` structure containing the source + * information, or NULL if the operation failed or the specified index was not valid. + * The caller is responsible for freeing the allocated structure and any associated + * strings when they are no longer needed. + * + */ +pa_source_info* get_input_device_by_index(uint32_t index) { + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "[get_input_device_by_index()] Failed to initialize pulseaudio.\n"); + return NULL; // Return error if initialization fails. + } + } + + if (!shared_data_1.context || !shared_data_1.mainloop) { + fprintf(stderr, "Invalid shared data context or mainloop.\n"); + return NULL; + } + + // Allocate memory for source_info + pa_source_info *source_info = malloc(sizeof(pa_source_info)); + if (!source_info) { + fprintf(stderr, "Memory allocation for source_info failed.\n"); + return NULL; + } + + // Start the operation to get the source information + pa_operation *op = pa_context_get_source_info_by_index(shared_data_1.context, index, get_input_device_by_index_cb, source_info); + iterate(op); + + // Check if the operation was successful + if (source_info->name == NULL) { + // The operation was not successful, free the allocated memory. + free(source_info); + return NULL; + } + + return source_info; // Return the allocated source_info +} + +/** + * @brief Callback function for getting the default output device from the PulseAudio server. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the server information structure. + * @param userdata The user data passed to the callback function, which is a pointer to a char*. + */ +static void get_default_output_cb(pa_context *c, const pa_server_info *i, void *userdata) { + //fprintf(stderr, "[DEBUG, get_default_output()] Callback reached.\n"); + + (void)c; // Unused parameter + + char **default_sink_name = (char**)userdata; + + // Always signal the mainloop to unblock the iterate function, even if i is NULL + if (!i) { + fprintf(stderr, "Failed to get default sink information.\n"); + } else if (i->default_sink_name) { + // Duplicate the name string to our output variable + *default_sink_name = strdup(i->default_sink_name); + } + + // Signal the mainloop to unblock the iterate function, regardless of the outcome + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + + +/** + * @brief Retrieves the name of the default sink (output device) in the system. + * + * This function checks if PulseAudio is initialized and if not, tries to initialize it. + * Then, it queries the PulseAudio server for the default output device and waits for + * the operation to complete. + * + * @param mainloop A pointer to the mainloop structure. + * @param context A pointer to the PulseAudio context. + * @return A dynamically allocated string containing the default sink name, or NULL on error. + * The caller is responsible for freeing this string. + */ +char* get_default_output(pa_context *context) { + + //fprintf(stderr,"[DEBUG, get_default_output()] Function reached.\n"); + + // Check if PulseAudio is initialized, and if not, initialize it + if (!is_pulse_initialized()) { + if (!initialize_pulse()) { + fprintf(stderr, "Failed to initialize PulseAudio.\n"); + return NULL; + } + } + + char *default_sink_name = NULL; + + // Start the operation to get the default sink + pa_operation *op = pa_context_get_server_info(context, get_default_output_cb, &default_sink_name); + + if (op) { + // Wait for the operation to complete using the iterate function + iterate(op); // This function should handle the waiting and signaling + // pa_operation_unref(op); is called inside iterate, no need to call here + } else { + fprintf(stderr, "Failed to create the operation to get server info.\n"); + } + + return default_sink_name; // Caller must free this string +} +/** + * @brief Callback function for getting the default input device from the PulseAudio server. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the server information structure. + * @param userdata The user data passed to the callback function, which is a pointer to a char*. + */ +static void get_default_input_cb(pa_context *c, const pa_server_info *i, void *userdata) { + (void)c; // Unused parameter + + char **default_source_name = (char**)userdata; + + //fprintf(stderr, "[DEBUG, get_default_input_cb()] callback reached.\n"); + + if (!i) { + fprintf(stderr, "Failed to get default source information.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (i->default_source_name) { + // Duplicate the name string to our output variable + *default_source_name = strdup(i->default_source_name); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); // Signal to stop the loop + } +} + + +/** + * @brief Retrieves the name of the default source (input device) in the system. + * + * This function queries the PulseAudio server for all available input devices + * and iterates through them to find the one that is in the RUNNING state, + * which typically indicates that it is the default source being used by the system. + * The name of the default source is then returned. + * + * @note The caller is responsible for freeing the memory allocated for the + * returned source name using the standard free() function to avoid memory leaks. + * + * @return A pointer to a dynamically allocated string containing the name of + * the default source. If no active default source is found or in case of an error, + * NULL is returned. + */ +char* get_default_input(pa_context *context) { + + //fprintf(stderr, "[DEBUG, get_default_input()] Function reached.\n"); + + // Check if PulseAudio is initialized, and if not, initialize it + if (!is_pulse_initialized() && !initialize_pulse()) { + fprintf(stderr, "[get_default_onput()] Failed to initialize PulseAudio.\n"); + return NULL; + } + + char *default_source_name = NULL; + + // Start the operation to get the default source + pa_operation *op = pa_context_get_server_info(context, get_default_input_cb, &default_source_name); + iterate(op); + + return default_source_name; // Caller must free this string +} + +/** + * @brief Fetches all profiles associated with a given sound card. + * + * This function queries the PulseAudio server for all profiles associated with the sound card + * specified by the card_index. It blocks until all profiles are fetched or an error occurs. + * + * @param pa_ctx A pointer to the initialized pa_context representing the connection to the PulseAudio server. + * @param card_index The index of the sound card for which to fetch profiles. + * @param num_profiles A pointer to an integer where the number of fetched profiles will be stored. + * @return A pointer to an array of pa_card_profile_info2 structures containing the profile info. + * This pointer must be freed by the caller. NULL is returned if an error occurs. + */ +void get_profiles_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + (void) userdata; + + if (eol < 0) { + fprintf(stderr, "Failed to fetch profiles.\n"); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + if (eol > 0) { + // All profiles have been fetched, the operation is complete + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Reallocate memory for profiles array to add new profiles + shared_data_4.profiles = realloc(shared_data_4.profiles, sizeof(pa_card_profile_info2) * (shared_data_4.num_profiles + i->n_profiles)); + + // Now copy the profiles from the PulseAudio provided array + for (unsigned int j = 0; j < i->n_profiles; ++j) { + shared_data_4.profiles[shared_data_4.num_profiles + j] = i->profiles[j]; + } + + // Update the number of profiles fetched + shared_data_4.num_profiles += i->n_profiles; +} + + + +/** + * @brief Fetches all profiles associated with a given sound card. + * + * This function queries the PulseAudio server for all profiles associated with the sound card + * specified by the card_index. It blocks until all profiles are fetched or an error occurs. + * + * @param pa_ctx A pointer to the initialized pa_context representing the connection to the PulseAudio server. + * @param card_index The index of the sound card for which to fetch profiles. + * @param num_profiles A pointer to an integer where the number of fetched profiles will be stored. + * @return A pointer to an array of pa_card_profile_info2 structures containing the profile info. + * This pointer must be freed by the caller. NULL is returned if an error occurs. + */ +pa_card_profile_info *get_profiles(pa_context *pa_ctx, uint32_t card_index) { + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "[get_profiles()] Failed to initialize pulseaudio.\n"); + return NULL; // Return error if initialization fails. + } + } + + // Reset the static global variable before use + free(shared_data_4.profiles); + shared_data_4.profiles = NULL; + shared_data_4.num_profiles = 0; + + // Start the operation to fetch the profiles + pa_operation *op = pa_context_get_card_info_by_index(pa_ctx, card_index, get_profiles_cb, NULL); + + // Wait for the operation to complete + iterate(op); + + return shared_data_4.profiles; // Return the static global profiles array +} + +/** + * Callback function for retrieving the mute status of a sink. + * + * This callback is provided to the PulseAudio context as part of a request + * to obtain information about a particular sink. It will be called by the + * PulseAudio main loop when the sink information is available. The end of list + * (eol) parameter indicates whether the data received is the last in the list. + * + * @param c A pointer to the PulseAudio context. + * @param i A pointer to the sink information structure. + * @param eol An end-of-list flag that is positive if there is no more data to process. + * @param userdata A pointer to user data, expected to be a pointer to an integer that + * will be set to the mute status of the sink. + * + * @note The function sets the integer pointed to by `userdata` to the mute state + * of the sink. The mute state is non-zero when the sink is muted and zero + * when it is not muted. This function is not intended to be called directly + * by the user but as a callback from the PulseAudio API when + * pa_context_get_sink_info_by_name() is called. + */ +static void get_muted_output_status_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + + //fprintf(stderr, "[DEBUG, get_muted_output_status_cb]: inside callback.\n"); + + // If eol is set to a positive number, you're at the end of the list + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + //fprintf(stderr, "[DEBUG, get_muted_output_status_cb]: leaving callback.\n"); + return; + } + + // If eol is negative, an error occurred + if (eol < 0) { + int err = pa_context_errno(c); // Retrieve the error number from the context + fprintf(stderr, "[ERROR, get_muted_output_status_cb]: Error occurred during iteration - %s\n", pa_strerror(err)); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Cast the userdata to a boolean pointer + int *is_muted = (int *)userdata; + + // If the sink information is valid, set is_muted to the sink's mute state + if (i) { + *is_muted = i->mute; + } +} + + + +/** + * Queries the mute status of a specified output sink. + * + * This function initiates an asynchronous operation to retrieve the mute status + * of the sink specified by `sink_name`. It requires a valid `pulseaudio_manager` + * instance that has been previously initialized with a mainloop and context. + * The function blocks until the operation is complete or an error occurs. + * + * @param self A pointer to the initialized `pulseaudio_manager` instance. + * @param sink_name The name of the sink whose mute status is being queried. + * + * @return Returns 1 if the sink is muted, 0 if not muted, and -1 if an error + * occurred or the sink was not found. In the case of an error, an + * appropriate message will be printed to standard error. + * + * @note The function uses `iterate` to block and process the mainloop until + * the operation is complete. It is assumed that `iterate` and + * `get_muted_output_status_cb` are implemented elsewhere and are + * responsible for iterating the mainloop and handling the callback + * from the sink information operation, respectively. + */ +int get_muted_output_status(const char *sink_name) { + + //fprintf(stderr,"[DEBUG, get_muted_output_status()] sink_name is %s\n", sink_name); + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "[get_muted_output_status()] Failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails. + } + } + + if (!shared_data_1.mainloop || !shared_data_1.context || !sink_name) { + fprintf(stderr, "Invalid arguments provided.\n"); + return -1; + } + + pa_operation *op = NULL; + int is_muted = -1; // Default to -1 in case of error or sink not found + + // Start a PulseAudio operation to get information about the sink + op = pa_context_get_sink_info_by_name(shared_data_1.context, sink_name, get_muted_output_status_cb, &is_muted); + iterate(op); + + // -1 will be returned if the sink was not found or another error occurred + return is_muted; +} + +/** + * @brief Callback function for retrieving the mute status of an audio input source. + * + * This callback is invoked by the PulseAudio main loop when the source information + * becomes available. It is used as part of an asynchronous operation initiated by + * `get_muted_input_status` to obtain the mute status of a specified audio source. + * The `eol` parameter indicates if the data received is the last in the list or if + * an error has occurred during the iteration. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the source information structure containing details of the source. + * @param eol End-of-list flag that is positive if there is no more data to process, + * negative if an error occurred during the iteration. + * @param userdata User data provided when initiating the operation; expected to be a + * pointer to an integer that will be set to the mute status of the source. + * + */ +static void get_muted_input_status_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + //fprintf(stderr, "[DEBUG, get_muted_input_status_cb]: inside callback.\n"); + + // If eol is set to a positive number, you're at the end of the list + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + //fprintf(stderr, "[DEBUG, get_muted_input_status_cb]: leaving callback.\n"); + return; + } + + // If eol is negative, an error occurred + if (eol < 0) { + int err = pa_context_errno(c); // Retrieve the error number from the context + fprintf(stderr, "[ERROR, get_muted_input_status_cb]: Error occurred during iteration - %s\n", pa_strerror(err)); + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + // Cast the userdata to a boolean pointer + int *is_muted = (int *)userdata; + + // If the source information is valid, set is_muted to the source's mute state + if (i) { + *is_muted = i->mute; + } +} + + +/** + * @brief Queries the mute status of a specified audio input (source). + * + * This function initiates an asynchronous operation to retrieve the mute status + * of the source specified by `source_name`. It requires a valid PulseAudio mainloop + * and context to have been previously initialized and stored in shared_data_1. + * The function blocks until the operation is complete or an error occurs. + * + * @param source_name The name of the source whose mute status is being queried. + * This should be the exact name as recognized by PulseAudio. + * + * @return int Returns 1 if the source is muted, 0 if not muted, and -1 if an error + * occurred or the source was not found. In the case of an error, an + * appropriate message will be printed to standard error. + * + */ +int get_muted_input_status(const char *source_name) { + //fprintf(stderr,"[DEBUG, get_muted_input_status()] source_name is %s\n", source_name); + + if (!shared_data_1.mainloop || !shared_data_1.context || !source_name) { + fprintf(stderr, "Invalid arguments provided.\n"); + return -1; + } + + pa_operation *op = NULL; + int is_muted = -1; // Default to -1 in case of error or source not found + + // Start a PulseAudio operation to get information about the source + op = pa_context_get_source_info_by_name(shared_data_1.context, source_name, get_muted_input_status_cb, &is_muted); + iterate(op); + + // -1 will be returned if the source was not found or another error occurred + return is_muted; +} + + +/** + * @brief Callback function for handling sink information response. + * + * This function is called by the PulseAudio main loop when the information about a sink + * is available. It processes the sink information and stores the index of the sink in the + * provided userdata pointer. + * + * @param c Pointer to the PulseAudio context. + * @param info Pointer to the sink information structure. + * @param eol End-of-list flag indicating if there are more entries to process. + * @param userdata Pointer to user data where the sink index will be stored. + */ +static void get_output_device_index_by_code_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + + uint32_t *index_ptr = (uint32_t *) userdata; + + if (eol < 0) { + fprintf(stderr, "Error occurred in sink_info_cb.\n"); + return; + } + + if (!eol && info) { + *index_ptr = info->index; + } + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + +/** + * @brief Callback function for handling source information response. + * + * This function is called by the PulseAudio main loop when the information about a source + * is available. It processes the source information and stores the index of the source in the + * provided userdata pointer. + * + * @param c Pointer to the PulseAudio context. + * @param info Pointer to the source information structure. + * @param eol End-of-list flag indicating if there are more entries to process. + * @param userdata Pointer to user data where the source index will be stored. + */ +static void get_input_device_index_by_code_cb(pa_context *c, const pa_source_info *info, int eol, void *userdata) { + (void) c; + + uint32_t *index_ptr = (uint32_t *) userdata; + + if (eol < 0) { + fprintf(stderr, "Error occurred in source_info_cb.\n"); + return; + } + + if (!eol && info) { + *index_ptr = info->index; + } + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); +} + +/** + * @brief Retrieves the index of an input device based on its code (PulseAudio name). + * + * This function initiates an asynchronous operation to get information about an input device (source) + * based on its PulseAudio name. The function requires a valid PulseAudio context and a callback to + * process the source information once it's received. It waits for the completion of the operation + * and returns the index of the source. + * + * @param context Pointer to the initialized PulseAudio context. + * @param device_code The pulseaudio code of the source whose index is to be retrieved. + * @return The index of the input device if found, or UINT32_MAX if not found or in case of error. + */ +uint32_t get_input_device_index_by_code(pa_context *context, const char *device_code) { + + // Initializing the result variable. + uint32_t index = 0; + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "[get_input_device_index_by_code()] Failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails. + } + } + + if (!context || !device_code) { + fprintf(stderr, "Invalid arguments.\n"); + return UINT32_MAX; + } + + pa_operation *op = pa_context_get_source_info_by_name(context, device_code, get_input_device_index_by_code_cb, &index); + iterate(op); + + return index; +} + +/** + * @brief Retrieves the index of an output device based on its code (PulseAudio name). + * + * This function initiates an asynchronous operation to get information about an output device (sink) + * based on its PulseAudio name. The function requires a valid PulseAudio context and a callback to + * process the sink information once it's received. It waits for the completion of the operation + * and returns the index of the sink. + * + * @param context Pointer to the initialized PulseAudio context. + * @param device_code The pulseaudio code of the sink whose index is to be retrieved. + * @return The index of the output device if found, or UINT32_MAX if not found or in case of error. + */ +uint32_t get_output_device_index_by_code(pa_context *context, const char *device_code) { + + //Initializing the result variable. + uint32_t index = 0; + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "get_output_device_index_by_code()] Failed to initialize pulseaudio.\n"); + return UINT32_MAX; // Return error if initialization fails. + } + } + + if (!context || !device_code) { + fprintf(stderr, "Invalid arguments.\n"); + return UINT32_MAX; + } + + pa_operation *op = pa_context_get_sink_info_by_name(context, device_code, get_output_device_index_by_code_cb, &index); + iterate(op); + + return index; +} + +/** + * @brief Callback function used by get_sink_name_by_code to process information about each sink. + * + * This function is called by the PulseAudio context for each sink (output device). + * It compares the name of each sink with a provided PulseAudio code. If a match is found, + * it dynamically allocates memory and copies the sink description to the result. + * + * @param c The PulseAudio context. + * @param i Information about the current sink being processed. + * @param eol End-of-list flag, non-zero if this is the last sink in the list. + * @param userdata Pointer to a string (char pointer) where the result will be stored. + */ +void get_output_name_by_code_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + char **result = (char **)userdata; + + if (strcmp(i->name, *result) == 0) { + *result = strdup(i->description); // Dynamically allocate and copy the sink description + } +} + +/** + * @brief Finds and returns the sink name (description) corresponding to a given PulseAudio code (name). + * + * This function searches for a PulseAudio sink (output device) with a given code (name) + * and returns its description. It interacts directly with the PulseAudio server, querying + * the list of sinks and processing each one using the sink_info_callback function. + * + * The function dynamically allocates memory for the sink description, which must be freed + * by the caller. + * + * @param pa_ctx A valid and connected PulseAudio context. + * @param code The PulseAudio code (name) of the sink to search for. + * @return char* Dynamically allocated string containing the sink description, or NULL if not found. + * The caller is responsible for freeing this memory. + * + */ +char* get_output_name_by_code(pa_context *pa_ctx, const char *code) { + if (pa_ctx == NULL || code == NULL) { + return NULL; + } + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "[get_output_name_by_code()] Failed to initialize pulseaudio.\n"); + return NULL; // Return error if initialization fails. + } + } + + char *result = strdup(code); // Copy the code to result for the callback function + + // Querying the list of sinks + pa_operation *op = pa_context_get_sink_info_list(pa_ctx, get_output_name_by_code_cb, &result); + + if (op != NULL) iterate(op); + + if (result != NULL && strcmp(result, code) != 0) { + return result; // Return the dynamically allocated sink name + } + + // If no matching device is found or if the result was not updated + free(result); + + return NULL; +} + +/** + * @brief Callback function used by get_source_name_by_code to process information about each source. + * + * This function is called by the PulseAudio context for each source (input device). + * It compares the name of each source with a provided PulseAudio code. If a match is found, + * it dynamically allocates memory and copies the source description to the result. + * + * @param c The PulseAudio context. + * @param i Information about the current source being processed. + * @param eol End-of-list flag, non-zero if this is the last source in the list. + * @param userdata Pointer to a string (char pointer) where the result will be stored. + */ +void get_input_name_by_code_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { + (void) c; + + if (eol > 0) { + pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); + return; + } + + char **result = (char **)userdata; + + if (strcmp(i->name, *result) == 0) { + *result = strdup(i->description); // Dynamically allocate and copy the source description + } +} + + +/** + * @brief Finds and returns the source name (description) corresponding to a given PulseAudio code (name). + * + * This function searches for a PulseAudio source (input device) with a given code (name) + * and returns its description. It interacts directly with the PulseAudio server, querying + * the list of sources and processing each one using the get_source_name_by_code_cb function. + * + * The function dynamically allocates memory for the source description, which must be freed + * by the caller. + * + * @param pa_ctx A valid and connected PulseAudio context. + * @param code The PulseAudio code (name) of the source to search for. + * @return char* Dynamically allocated string containing the source description, or NULL if not found. + * The caller is responsible for freeing this memory. + * + */ +char* get_input_name_by_code(pa_context *pa_ctx, const char *code) { + if (pa_ctx == NULL || code == NULL) { + return NULL; + } + + // Check if PulseAudio is initialized. + if (!is_pulse_initialized()) { + // Attempt to initialize PulseAudio if it's not already initialized. + if (!initialize_pulse()) { + fprintf(stderr, "[get_input_name_by_code] Failed to initialize pulseaudio.\n"); + return NULL; // Return error if initialization fails. + } + } + + char *result = strdup(code); // Copy the code to result for the callback function + + // Querying the list of sources + pa_operation *op = pa_context_get_source_info_list(pa_ctx, get_input_name_by_code_cb, &result); + + if (op != NULL) iterate(op); + + if (result != NULL && strcmp(result, code) != 0) { + return result; // Return the dynamically allocated source name + } + + // If no matching device is found or if the result was not updated + free(result); + + return NULL; +} + +/** + * @brief Retrieves the global default playback sample rate from the PulseAudio configuration. + * + * This function reads the PulseAudio daemon configuration file to find the value of the + * `default-sample-rate` setting, which determines the default sample rate for playback streams. + * The function can optionally accept a custom path to a PulseAudio configuration file. If no + * custom path is provided, it defaults to using the standard PulseAudio configuration file + * located at '/etc/pulse/daemon.conf'. + * + * @param custom_config_path Optional path to a custom PulseAudio configuration file. If NULL, + * the function uses the default PulseAudio configuration file path. + * @return The default sample rate as an integer. Returns -1 if the function fails to open the + * configuration file or if the `default-sample-rate` setting is not found. + */ + +int get_pulseaudio_global_playback_rate(const char* custom_config_path) { + FILE* file = NULL; + struct passwd *pw = getpwuid(getuid()); + const char *homedir = pw->pw_dir; + + char local_config_path[MAX_LINE_LENGTH]; + snprintf(local_config_path, sizeof(local_config_path), "%s/.config/pulse/daemon.conf", homedir); + + if (custom_config_path != NULL) { + file = fopen(custom_config_path, "r"); + } + + if (!file) { + file = fopen(local_config_path, "r"); + } + + if (!file) { + file = fopen(DAEMON_CONF, "r"); + } + + if (!file) { + perror("Failed to open PulseAudio configuration file"); + return -1; + } + + char line[MAX_LINE_LENGTH]; + int sample_rate = -1; + + while (fgets(line, sizeof(line), file)) { + char* p = line; + // Skip leading whitespace + while (*p && isspace((unsigned char)*p)) { + p++; + } + + // Skip comment lines + if (*p == ';' || *p == '#') { + continue; + } + + // Check if the line contains the required setting + if (strncmp(p, "default-sample-rate", 19) == 0) { + char* value_str = strchr(p, '='); + if (value_str) { + value_str++; + sample_rate = atoi(value_str); + break; + } + } + } + fclose(file); + + return sample_rate; +} + diff --git a/v-0.11/system_query.h b/v-0.11/system_query.h new file mode 100644 index 0000000..4043485 --- /dev/null +++ b/v-0.11/system_query.h @@ -0,0 +1,101 @@ +//Header definition files to query about sound card properties (number of sinks, profiles...) +#ifndef SYSTEM_QUERY_H +#define SYSTEM_QUERY_H + +#include +#include +#include +#include + +//Structures to get source port information (e.g, line in, microphone...) +//Used by get_source_port_info, get_active_port, and get_source_ports. +typedef struct pa_port_info { + char *name; // Port name + char *description; // Port description + bool is_active; // Is this the active port +} pa_port_info; + +typedef struct pa_source_info_list { + pa_port_info *ports; // Array of ports + int num_ports; // Number of ports + bool done; // Indicates if the callback has been called +} pa_source_info_list; + +void print_proplist(const pa_proplist *p); // Utility function to print all properties in the proplist +uint32_t get_output_device_count(void); //Gets the number of output devices in the system. +uint32_t get_input_device_count(void); //Gets the number of input devices in the system. +uint32_t get_profile_count(uint32_t card_index); //Gets the number of profiles for a given soundcard. +pa_sink_info **get_available_output_devices(); //Gets the total available sinks (output devices) for this system. +pa_source_info **get_available_input_devices(); //Gets the total available sources (input devices) for this system. + +char* get_alsa_input_name(const char *source_name); //Gets the corresponding alsa name of a pulseaudio source (input device). +char* get_alsa_output_name(const char *sink_name); //Gets the corresponding alsa name of a pulseaudio sink (output device). + +pa_sink_info* get_output_device_by_index(uint32_t index); //Gets alsa name of a pulseaudio sink (output device) by its index. +pa_source_info* get_input_device_by_index(uint32_t index); //Gets alsa name of a pulseaudio source (output device) by its index. + +pa_source_info_list* get_source_port_info(); //Returns which ports in the source are available (mic, line in...). + + +char** get_input_channel_names(const char *pulse_id, +int num_channels); //Returns the channel names of an input device. +char** get_output_channel_names(const char *pulse_id, +int num_channels); //Returns the channel names of an output device. + +int get_min_input_channels(const char *alsa_id, +const pa_source_info *source_info); //Gets the maximum output channels an ALSA card supports. + +int get_max_input_channels(const char *alsa_id, +const pa_source_info *source_info); //Gets the maximum output channels an ALSA card supports. + +int get_max_output_channels(const char *alsa_id, +const pa_sink_info *sink_info); //Gets the maximum output channels an ALSA card supports. + +int get_min_output_channels(const char *alsa_id, +const pa_sink_info *sink_info); //Gets the maximum output channels an ALSA card supports. + +char* get_alsa_input_id(const char *source_name); //Gets the alsa input id based on the pulseaudio channel name. + +char* get_alsa_output_id(const char *sink_name); //Gets the alsa output id based on the pulseaudio channel name. + +int get_output_sample_rate(const char *alsa_id, +const pa_sink_info *sink_info); //Gets the sample rate of a pulseaudio sink (output device). + +int get_input_sample_rate(const char *alsa_id, +pa_source_info *source_info); //Gets the sample rate of a pulseaudio source (input device). + +pa_source_info *get_input_device_by_name(const char *pulse_code); //Gets alsa name of a pulseaudio source (input device) by its name. +pa_sink_info *get_output_device_by_name(const char *pulse_code); //Gets alsa name of a pulseaudio sink (output device) by its name. + +uint32_t get_output_device_index_by_code(pa_context *context, +const char *device_code); //Gets index of an output device by its code (pulseaudio name). + +uint32_t get_input_device_index_by_code(pa_context *context, +const char *device_code); //Gets index of an output device by its code (pulseaudio name). + +int get_muted_output_status(const char *sink_name); //Queries whether a given audio output (sink) is muted or not. + +int get_muted_input_status(const char *source_name); //Queries whether a given audio input (source) is muted or not. + +pa_volume_t get_channel_volume(const pa_sink_info *sink_info, +unsigned int channel_index); //Retrieves the volume of a given channel. + +char* get_default_output(pa_context *context); //Gets default output device (default sink). + +char* get_default_input(pa_context *context); //Gets default input device (default source). + +pa_card_profile_info *get_profiles(pa_context *pa_ctx, +uint32_t card_index); //Gets pulseaudio profiles. + +char* get_input_name_by_code(pa_context *pa_ctx, +const char *code); //Gets input name (pulseaudio device description) by code. + +char* get_output_name_by_code(pa_context *pa_ctx, +const char *code); //Gets output name (pulseaudio device description) by code. + +void delete_output_devices(pa_sink_info **sinks); //Releases memory for allocated output devices. +void delete_input_devices(pa_source_info **sources); //Releases memory for allocated input devices. + +int get_pulseaudio_global_playback_rate(const char* custom_config_path); //Gets the global pulseaudio playback rate from pulseaudio. + +#endif From 4cef24699657578040a7965522401a339a674134 Mon Sep 17 00:00:00 2001 From: NMagic Date: Mon, 13 Nov 2023 00:35:36 -0300 Subject: [PATCH 16/20] Added muting of individual channels for output and input devices. Please note that functions for muting individual channels of input devices are untested. --- v-0.12/Makefile | 20 + .../pa_context -- interface overview.docx | Bin 0 -> 33970 bytes .../pavucontrol sink update flow.txt | 41 + .../pulseaudio/introspect.c summary | 79 + .../pulseaudio/mainloop code flow.txt | 17 + v-0.12/easypulse_core.c | 1104 ++++++ v-0.12/easypulse_core.h | 108 + v-0.12/examples/Makefile | 19 + v-0.12/examples/alsa-mapper_pulseaudio-api | Bin 0 -> 128928 bytes v-0.12/examples/alsa-mapper_pulseaudio-api.c | 91 + v-0.12/examples/change-speaker-mode | Bin 0 -> 118752 bytes v-0.12/examples/change-speaker-mode.c | 94 + v-0.12/examples/change_global_sample_rate | Bin 0 -> 119272 bytes v-0.12/examples/change_global_sample_rate.c | 47 + .../examples/get-card-profiles-pulseaudio_api | Bin 0 -> 122336 bytes .../get-card-profiles-pulseaudio_api.c | 63 + v-0.12/examples/mute_input_demo | Bin 0 -> 121024 bytes v-0.12/examples/mute_input_demo.c | 89 + v-0.12/examples/mute_output_demo | Bin 0 -> 121024 bytes v-0.12/examples/mute_output_demo.c | 89 + v-0.12/examples/print-input-sources | Bin 0 -> 122136 bytes v-0.12/examples/print-input-sources.c | 92 + v-0.12/examples/print_volume_output_devices | Bin 0 -> 121648 bytes v-0.12/examples/print_volume_output_devices.c | 72 + v-0.12/examples/switch-input-devices | Bin 0 -> 120912 bytes v-0.12/examples/switch-input-devices.c | 84 + v-0.12/examples/switch-output-device | Bin 0 -> 120784 bytes .../examples/switch-output-device-pulseaudio | Bin 0 -> 123864 bytes .../switch-output-device-pulseaudio.c | 62 + v-0.12/examples/switch-output-device.c | 47 + v-0.12/examples/toggle_mute_output_demo | Bin 0 -> 121352 bytes v-0.12/examples/toggle_mute_output_demo.c | 84 + v-0.12/examples/volume-change | Bin 0 -> 120840 bytes v-0.12/examples/volume-change-pulseaudio | Bin 0 -> 123784 bytes v-0.12/examples/volume-change-pulseaudio.c | 101 + v-0.12/examples/volume-change.c | 67 + v-0.12/libeasypulse_core.a | Bin 0 -> 49120 bytes v-0.12/system_query.c | 3012 +++++++++++++++++ v-0.12/system_query.h | 109 + 39 files changed, 5591 insertions(+) create mode 100644 v-0.12/Makefile create mode 100644 v-0.12/documentation/pa_context -- interface overview.docx create mode 100644 v-0.12/documentation/pavucontrol/pavucontrol sink update flow.txt create mode 100644 v-0.12/documentation/pulseaudio/introspect.c summary create mode 100644 v-0.12/documentation/pulseaudio/mainloop code flow.txt create mode 100644 v-0.12/easypulse_core.c create mode 100644 v-0.12/easypulse_core.h create mode 100644 v-0.12/examples/Makefile create mode 100755 v-0.12/examples/alsa-mapper_pulseaudio-api create mode 100644 v-0.12/examples/alsa-mapper_pulseaudio-api.c create mode 100755 v-0.12/examples/change-speaker-mode create mode 100644 v-0.12/examples/change-speaker-mode.c create mode 100755 v-0.12/examples/change_global_sample_rate create mode 100644 v-0.12/examples/change_global_sample_rate.c create mode 100755 v-0.12/examples/get-card-profiles-pulseaudio_api create mode 100644 v-0.12/examples/get-card-profiles-pulseaudio_api.c create mode 100755 v-0.12/examples/mute_input_demo create mode 100644 v-0.12/examples/mute_input_demo.c create mode 100755 v-0.12/examples/mute_output_demo create mode 100644 v-0.12/examples/mute_output_demo.c create mode 100755 v-0.12/examples/print-input-sources create mode 100644 v-0.12/examples/print-input-sources.c create mode 100755 v-0.12/examples/print_volume_output_devices create mode 100644 v-0.12/examples/print_volume_output_devices.c create mode 100755 v-0.12/examples/switch-input-devices create mode 100644 v-0.12/examples/switch-input-devices.c create mode 100755 v-0.12/examples/switch-output-device create mode 100755 v-0.12/examples/switch-output-device-pulseaudio create mode 100644 v-0.12/examples/switch-output-device-pulseaudio.c create mode 100644 v-0.12/examples/switch-output-device.c create mode 100755 v-0.12/examples/toggle_mute_output_demo create mode 100644 v-0.12/examples/toggle_mute_output_demo.c create mode 100755 v-0.12/examples/volume-change create mode 100755 v-0.12/examples/volume-change-pulseaudio create mode 100644 v-0.12/examples/volume-change-pulseaudio.c create mode 100644 v-0.12/examples/volume-change.c create mode 100644 v-0.12/libeasypulse_core.a create mode 100644 v-0.12/system_query.c create mode 100644 v-0.12/system_query.h diff --git a/v-0.12/Makefile b/v-0.12/Makefile new file mode 100644 index 0000000..b1c5107 --- /dev/null +++ b/v-0.12/Makefile @@ -0,0 +1,20 @@ +CC = gcc +CFLAGS = -Wall -g -Wextra + +LIB_NAME = easypulse_core +LIB_SRC = easypulse_core.c +LIB_OBJ = easypulse_core.o +LIB_OUT = lib$(LIB_NAME).a + +all: $(LIB_OUT) + +$(LIB_OUT): $(LIB_OBJ) + ar rcs $(LIB_OUT) $(LIB_OBJ) + +$(LIB_OBJ): $(LIB_SRC) + $(CC) $(CFLAGS) -c $(LIB_SRC) -o $(LIB_OBJ) + +clean: + rm -f $(LIB_OBJ) $(LIB_OUT) + +.PHONY: all clean diff --git a/v-0.12/documentation/pa_context -- interface overview.docx b/v-0.12/documentation/pa_context -- interface overview.docx new file mode 100644 index 0000000000000000000000000000000000000000..6cbe2d09c38dfcab843409c88d5b9d8666c90192 GIT binary patch literal 33970 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 literal 0 HcmV?d00001 diff --git a/v-0.12/documentation/pavucontrol/pavucontrol sink update flow.txt b/v-0.12/documentation/pavucontrol/pavucontrol sink update flow.txt new file mode 100644 index 0000000..9428de8 --- /dev/null +++ b/v-0.12/documentation/pavucontrol/pavucontrol sink update flow.txt @@ -0,0 +1,41 @@ ++----------------+ +| pavucontrol | +| (initial file)| ++----------------+ + | + | Callback function triggered when there's info/change related to a sink + V ++----------------+ +| sink_cb | +| (pavucontrol.cc)| ++----------------+ + | + | - If error, show error and return + | - If end-of-list (eol) is reached, decrease outstanding tasks count and return + | - Update GUI representation of a sink using w->updateSink() + V ++---------------------------+ +| MainWindow::updateSink | +| (mainwindow.cc & .h) | ++---------------------------+ + | + | - Retrieve or create SinkWidget for the sink + | - Update SinkWidget properties (e.g., volume, mute state, active port, etc.) + | - Prepare context menu for the sink + | - Ensure the sink is displayed correctly via updateDeviceVisibility + V ++-------------------------------------+ +| MainWindow::updateDeviceVisibility | +| (mainwindow.cc & .h) | ++-------------------------------------+ + | + | - If idle source/callback is already queued, return + | - Schedule the idle_cb function to be called when the app is idle + V ++----------------+ +| idle_cb | +| (mainwindow.cc)| ++----------------+ + | + V + ... (Specific steps and logic for updating device visibility) diff --git a/v-0.12/documentation/pulseaudio/introspect.c summary b/v-0.12/documentation/pulseaudio/introspect.c summary new file mode 100644 index 0000000..d9616f2 --- /dev/null +++ b/v-0.12/documentation/pulseaudio/introspect.c summary @@ -0,0 +1,79 @@ +* !pa_tagstruct_eof (context_string_callback): this function seems to be a callback function for processing string responses from the server. It examines the incoming command and checks for errors. If there's an error or if the command isn't a reply, it sets the success flag to 0 and prepares an empty response string. If the command is a reply, it extracts the response string from the tag structure. If there's any issue with extracting the string or if there's unexpected data in the tag structure, it flags a protocol error. + +* pa_context_stat: this function sends a simple command to request statistics. It leverages another function pa_context_send_simple_command and provides the context_stat_callback as the callback function to handle the response. It's used to retrieve statistical information. + +* pa_context_get_server_info: similar to the previous function, this function sends a command to get server information. It again uses pa_context_send_simple_command, but this time with a different callback, context_get_server_info_callback, to process the server information response. + +* context_get_sink_info_callback: this function is a callback that processes information about a sink. It first ensures that the operation and context are valid. If the received command is not a reply, it handles the error. If it is a reply, it starts parsing the sink information from the tag structure, extracting details like the sink's name, description, sample specification, channel map, owner module, volume, mute status, monitor source, latency, and more. The function seems to account for different versions of the context and extracts varying levels of information based on that. + +* pa_tagstruct_getu32: this function seems to be a snippet or part of another function and is possibly not a standalone function. It attempts to retrieve a 32-bit unsigned integer from a tag structure. If unsuccessful, it returns an error indicating a protocol issue. + +* pa_context_get_sink_info_list: this function sends a command to retrieve a list of sink information. It utilizes the pa_context_send_simple_command function and provides the context_get_sink_info_callback as the callback to process the list of sinks. + +* pa_context_get_sink_info_by_index: this function requests information about a specific sink identified by its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SINK_INFO) with the specified sink index and sends it to the server. The response from the server is expected to be handled by the context_get_sink_info_callback. + +* pa_context_get_sink_info_by_name: similar to the previous function, this one requests information about a sink, but it identifies the sink by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SINK_INFO) with the specified sink name to the server. The server's response will be processed by the context_get_sink_info_callback. + +* pa_context_set_sink_port_by_index: this function is designed to set the port for a specific sink identified by its index. After some validity checks, it builds a command (PA_COMMAND_SET_SINK_PORT) with the given sink index and port information, then sends this command to the server. The acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_sink_port_by_name: this function sets the port of a sink based on its name. It first performs some validation checks, then constructs a command with the sink's name and desired port. This command is sent to the PulseAudio server, and the response will be handled by a generic acknowledgment callback. + +* context_get_source_info_callback: this callback function processes information about a source. It starts by performing some initializations and checks. If the received command is a reply, it begins parsing the source information from the tag structure. This includes extracting details like the source's name, description, sample specification, volume, mute status, latency, and more. It appears to accommodate different versions of the context, extracting varying levels of information based on that. + +* pa_context_get_source_info_list: this function sends a command to retrieve a list of source information. It employs the pa_context_send_simple_command function, providing the context_get_source_info_callback as the callback to process the list of sources. + +* pa_context_get_source_info_by_index: this function retrieves information about a specific audio source based on its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source index and sends it to the server. The response from the server is expected to be handled by the context_get_source_info_callback. + +* pa_context_get_source_info_by_name: similar to the previous function, this one retrieves information about a source but identifies the source by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source name to the server. The server's response is again expected to be processed by the context_get_source_info_callback. + +* pa_context_set_source_port_by_index: this function sets the port of a specific source based on its index. After performing some validity checks and ensuring that the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source index. This command is sent to the server, and the acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_source_port_by_name: this function is designed to set the port of a specific audio source based on its name. It constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source name and sends this command to the PulseAudio server. The server's response will be handled by a generic acknowledgment callback. + +* context_get_client_info_callback: This callback function processes client-related information. It first performs checks to ensure the received command is a reply. If it is, the function begins parsing the client information, extracting details like client index, name, owner module, and driver. The function appears to be prepared to handle multiple client records in the same response and will loop through them until the end of the tag structure. + +* pa_context_get_client_info: this function requests information about a specific client based on its index. It constructs and sends a command (PA_COMMAND_GET_CLIENT_INFO) with the specified client index to the server. The server's response is expected to be processed by the context_get_client_info_callback. + +* pa_context_get_client_info_list: this function requests a list of client information from the PulseAudio server. It utilizes the pa_context_send_simple_command function and specifies the PA_COMMAND_GET_CLIENT_INFO_LIST command. The response from the server is expected to be handled by the context_get_client_info_callback. + + +* card_info_free: this is a utility function designed to free the memory associated with a pa_card_info structure. It releases memory for various properties and profiles associated with the card, such as its property list (proplist), profiles (profiles), and extended profile information (profiles2). + +* fill_card_port_info: this function populates the port information for a given card. It starts by extracting the number of ports (n_ports) for the card from a tag structure. If the card has ports, it then proceeds to fill in details about each port. If there's a protocol error while fetching the details, it returns an error. + +* fill_card_profile_info: this function is responsible for populating the profile information of a given card. It begins by allocating memory for the profiles and then proceeds to iterate through each profile, extracting details like name, description, number of sinks, number of sources, and priority. It also accounts for different versions of the context, fetching additional details if the version is >= 29. + + +* context_get_card_info_callback: this callback function processes card-related information. It starts by performing initialization checks and then examines the received command. If the command is a reply, the function starts parsing card details like index, name, owner module, driver, and the number of profiles. It then calls the fill_card_profile_info function to populate the profiles for the card. If there are any protocol errors during this process, the function handles them accordingly. + + +* pa_tagstruct_get_proplist: This function seems to be a snippet or a partial representation of a larger function. Its purpose appears to be to extract a property list (proplist) from a tag structure. If there's any issue during this extraction, it flags an error. + + +* pa_context_get_card_info_by_index: this function requests information about a specific card based on its index. After performing several validity checks, it constructs a command (PA_COMMAND_GET_CARD_INFO) with the specified card index and sends it to the server. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_by_name: similar to the previous function, this one requests information about a card, but it identifies the card by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_CARD_INFO) with the specified card name to the server. Again, the server's response is expected to be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_list: this function requests a list of all card information from the PulseAudio server. It employs the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_CARD_INFO_LIST command. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_set_card_profile_by_index: this function sets the profile of a specific card based on its index. After checking the validity of the context and ensuring the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the specified card index and desired profile. This command is sent to the server, and the response is handled by a generic acknowledgment callback. + +* pa_context_set_card_profile_by_name: this function sets the profile of a card identified by its name. Like the previous function, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the card name and desired profile, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_module_info_callback: this callback function processes module-related information. It checks if the received command is a reply and, if so, starts parsing the module details. This includes extracting details like the module's index, name, argument, and usage count. If there's an error or unexpected end of file in the tag structure, it flags a protocol error. + +* pa_context_get_module_info: this function retrieves information about a specific module based on its index. After conducting various validity checks, it constructs a command (PA_COMMAND_GET_MODULE_INFO) with the specified module index and sends it to the server. The response from the server will be processed by the context_get_module_info_callback. + +* pa_context_get_module_info_list: this function requests a list of all module information from the PulseAudio server. It uses the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_MODULE_INFO_LIST command. The server's response will be processed by the context_get_module_info_callback. + +* context_get_sink_input_info_callback: this callback function processes information related to sink inputs. It checks if the received command is a reply and, if so, starts parsing the sink input details. This includes extracting details like the sink input's index, name, owner module, client, sink, sample specification, channel map, volume, buffer usec, sink usec, resample method, driver, and more. It also accounts for different versions of the context, extracting varying levels of information based on that. + +* pa_context_set_source_output_volume: this function sets the volume of a specific source output based on its index. It starts by performing various checks, including verifying the validity of the provided volume. It then constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_VOLUME) with the specified source output index and volume and sends it to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_set_source_output_mute: this function mutes or unmutes a specific source output based on its index. It constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_MUTE) with the desired mute status and the source output index, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_sample_info_callback: this callback function processes sample-related information. It checks if the received command is a reply and, if so, begins parsing the sample details, extracting attributes like the sample's index, name, volume, mute status, proplist, and more. The function also handles possible protocol errors and is prepared to process multiple sample records in the same response. + +* pa_context_suspend_source_by_index: this function suspends or resumes a specific source based on its index. It verifies the server version, constructs a command (PA_COMMAND_SUSPEND_SOURCE) with the desired suspend status and source index, and then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_send_message_to_object: this function sends a message to a specific object within the PulseAudio server. After checking the server version and other conditions, it constructs a command (PA_COMMAND_SEND_OBJECT_MESSAGE) with the object's path, the message, and any additional parameters. The server's response will be processed by a callback function. diff --git a/v-0.12/documentation/pulseaudio/mainloop code flow.txt b/v-0.12/documentation/pulseaudio/mainloop code flow.txt new file mode 100644 index 0000000..f4c8b96 --- /dev/null +++ b/v-0.12/documentation/pulseaudio/mainloop code flow.txt @@ -0,0 +1,17 @@ ++---------------------------------------------+ +| Mainloop | +| | +| +--------------+ +-------------------+ | +| | I/O Events | | Timers | | +| +--------------+ +-------------------+ | +| | +| +--------------+ +-------------------+ | +| | Signals | | Deferred Callbacks| | +| +--------------+ +-------------------+ | +| | +| +---------------------+ | +| | Other Asynchronous | | +| | Tasks | | +| +---------------------+ | +| | ++---------------------------------------------+ diff --git a/v-0.12/easypulse_core.c b/v-0.12/easypulse_core.c new file mode 100644 index 0000000..1a96252 --- /dev/null +++ b/v-0.12/easypulse_core.c @@ -0,0 +1,1104 @@ +/** + * @file easypulse_core.c + * @brief Implementation of the easypulse core functions. + * + * This file provides the core functionality to interact with PulseAudio, + * allowing operations like setting the default device and adjusting volume. + */ + +#include "easypulse_core.h" +#include "system_query.h" +#include +#include +#include +#include +#include +#include +#include + +#define DAEMON_CONF "/etc/pulse/daemon.conf" +#define MAX_LINE_LENGTH 1024 + + +static bool manager_initialize(pulseaudio_manager *self); +static void iterate(pulseaudio_manager *manager, pa_operation *op); + +static void manager_set_output_channel_mute_state_cb(pa_context *c, const pa_sink_info *info, +int eol, void *userdata); + +static void manager_set_output_channel_mute_state_cb2(pa_context *c, int success, void *userdata); + +//Shared data between manager_switch_default_output and its callbacks +typedef struct _shared_data_1 { + pulseaudio_manager *manager; + uint32_t new_index; //Index of the new default sink. + +} _shared_data_1; + +//Shared data between manager_set_output_channel_mute_state and its callbacks +typedef struct _shared_data_2 { + pulseaudio_manager *manager; + uint32_t channel_index; + bool mute_state; + pa_cvolume new_volume; +} _shared_data_2; + +_shared_data_2 volume_data; + +/** + * @brief Creates a new pulseaudio_manager instance. + * + * This function allocates memory for a new pulseaudio_manager instance and initializes it. + * It allocates memory for the output and input devices based on the current system state, + * and initializes the PulseAudio context and mainloop. It also sets the active output and + * input devices. + * + * If any memory allocation or initialization operation fails, the function cleans up any + * resources that were successfully allocated or initialized, and returns NULL. + * + * @return A pointer to the newly created pulseaudio_manager instance, or NULL if the + * creation failed. + */ +pulseaudio_manager *manager_create(void) { + pulseaudio_manager *self = malloc(sizeof(pulseaudio_manager)); + if (!self) { + fprintf(stderr, "Failed to allocate memory for pulseaudio_manager.\n"); + return NULL; + } + + // Zero-initialize the structure to set sensible defaults + memset(self, 0, sizeof(pulseaudio_manager)); + + // Initialize manager's PulseAudio main loop and context + if (!manager_initialize(self)) { + fprintf(stderr, "Failed to initialize pulseaudio_manager.\n"); + free(self); + return NULL; + } + + // Get the count of output and input devices + self->output_count = get_output_device_count(); + self->input_count = get_input_device_count(); + + // Allocate memory for outputs + if (self->output_count > 0) { + self->outputs = calloc(self->output_count, sizeof(pulseaudio_device)); + if (!self->outputs) { + fprintf(stderr, "Failed to allocate memory for outputs.\n"); + manager_cleanup(self); + return NULL; + } + // Retrieve and populate output devices + pa_sink_info **output_devices = get_available_output_devices(); + + for (uint32_t i = 0; i < self->output_count; ++i) { + self->outputs[i].index = output_devices[i]->index; + self->outputs[i].name = strdup(output_devices[i]->description); + self->outputs[i].code = strdup(output_devices[i]->name); + + + char *alsa_id = get_alsa_output_id(output_devices[i]->name); + + //Do NOT attempt to duplicate the string if alsa_id is null, as the program can crash! + if (alsa_id) { + self->outputs[i].alsa_id = strdup(alsa_id); + } else { + self->outputs[i].alsa_id = NULL; + } + self->outputs[i].sample_rate = get_output_sample_rate(self->outputs[i].alsa_id, output_devices[i]); + self->outputs[i].max_channels = get_max_output_channels(self->outputs[i].alsa_id, output_devices[i]); + self->outputs[i].min_channels = get_min_output_channels(self->outputs[i].alsa_id, output_devices[i]); + + //Initializing the stream like that is important so that we can modify the sample rate later. + pa_sample_spec default_sample_spec = { + .format = PA_SAMPLE_S16LE, + .rate = self->outputs[i].sample_rate, + .channels = (uint8_t) self->outputs[i].max_channels + }; + + self->outputs[i].stream = pa_stream_new(self->context, self->outputs[i].name, &default_sample_spec, NULL); + if (!self->outputs[i].stream) { + fprintf(stderr, "Failed to create stream for output device: %s\n", self->outputs[i].name); + continue; + } + + // Connect the stream with PA_STREAM_VARIABLE_RATE + if (pa_stream_connect_playback(self->outputs[i].stream, NULL, NULL, PA_STREAM_VARIABLE_RATE, NULL, NULL) < 0) { + fprintf(stderr, "Failed to connect playback stream for device: %s\n", self->outputs[i].name); + pa_stream_unref(self->outputs[i].stream); + self->outputs[i].stream = NULL; + continue; + } + + self->outputs[i].channel_names = get_output_channel_names(output_devices[i]->name, self->outputs[i].max_channels); + + free(alsa_id); + } + for (uint32_t i = 0; i < self->output_count; ++i) { + if (output_devices[i]) { + // Free other dynamically allocated fields within output_devices[i] if any + free(output_devices[i]); + } + } + free(output_devices); + } + + // Allocate memory for inputs + if (self->input_count > 0) { + self->inputs = calloc(self->input_count, sizeof(pulseaudio_device)); + if (!self->inputs) { + fprintf(stderr, "Failed to allocate memory for inputs.\n"); + manager_cleanup(self); + return NULL; + } + // Retrieve and populate input devices + pa_source_info **input_devices = get_available_input_devices(); + + for (uint32_t i = 0; i < self->input_count; ++i) { + self->inputs[i].index = input_devices[i]->index; + self->inputs[i].name = strdup(input_devices[i]->description); + self->inputs[i].code = strdup(input_devices[i]->name); + + char *alsa_id = get_alsa_input_id(input_devices[i]->name); + + if (alsa_id) { + self->inputs[i].alsa_id = strdup(alsa_id); + } else { + self->inputs[i].alsa_id = NULL; + } + + self->inputs[i].sample_rate = get_input_sample_rate(self->inputs[i].alsa_id, input_devices[i]); + self->inputs[i].max_channels = get_max_input_channels(self->inputs[i].alsa_id, input_devices[i]); + self->inputs[i].min_channels = get_min_input_channels(self->inputs[i].alsa_id, input_devices[i]); + + pa_sample_spec default_sample_spec = { + .format = PA_SAMPLE_S16LE, + .rate = self->inputs[i].sample_rate, + .channels = (uint8_t) self->inputs[i].max_channels + }; + + self->inputs[i].stream = pa_stream_new(self->context, self->inputs[i].name, &default_sample_spec, NULL); + + if (!self->inputs[i].stream) { + fprintf(stderr, "Failed to create stream for output device: %s\n", self->inputs[i].name); + continue; + } + + // Connect the stream with PA_STREAM_VARIABLE_RATE to the specific device + if (pa_stream_connect_playback(self->inputs[i].stream, self->inputs[i].code, NULL, PA_STREAM_VARIABLE_RATE, NULL, NULL) < 0) { + fprintf(stderr, "Failed to connect playback stream for device: %s\n", self->inputs[i].code); + pa_stream_unref(self->inputs[i].stream); + self->inputs[i].stream = NULL; + continue; + } + + self->inputs[i].channel_names = get_input_channel_names(input_devices[i]->name, self->inputs[i].max_channels); + + free(alsa_id); + } + for (uint32_t i = 0; i < self->input_count; ++i) { + if (input_devices[i]) { + // Free other dynamically allocated fields within output_devices[i] if any + free(input_devices[i]); + } + } + free(input_devices); + } + + // Set the default output and input devices + self->active_output_device = strdup(get_default_output(self->context)); + self->active_input_device = strdup(get_default_input(self->context)); + + // Check that the active devices were set + if (!self->active_output_device || !self->active_input_device) { + fprintf(stderr, "Failed to set the active output or input device.\n"); + manager_cleanup(self); + return NULL; + } + + return self; +} + + +/** + * @brief Callback function for handling PulseAudio context state changes. + * + * This callback is invoked by the PulseAudio mainloop when the context state changes. + * It updates the `pa_ready` flag in the pulseaudio_manager structure based on the + * context's state. The `pa_ready` flag is set to 1 when the context is ready, and + * to 2 when the context has failed or terminated. This callback will signal the + * mainloop to continue its operations whenever the state changes to either READY, + * FAILED, or TERMINATED. + * + * @param c Pointer to the PulseAudio context. + * @param userdata User-provided pointer to the pulseaudio_manager structure. + */ +static void manager_initialize_cb(pa_context *c, void *userdata) { + pa_context_state_t state; + pulseaudio_manager *manager = (pulseaudio_manager *) userdata; + int *pa_ready = &(manager->pa_ready); + pa_threaded_mainloop *m = manager->mainloop; + + state = pa_context_get_state(c); + switch (state) { + // There are other states you can handle, but these are the important ones + case PA_CONTEXT_CONNECTING: + case PA_CONTEXT_AUTHORIZING: + case PA_CONTEXT_SETTING_NAME: + default: + break; + case PA_CONTEXT_READY: + *pa_ready = 1; + pa_threaded_mainloop_signal(m, 0); + break; + case PA_CONTEXT_FAILED: + case PA_CONTEXT_TERMINATED: + *pa_ready = 2; + pa_threaded_mainloop_signal(m, 0); + break; + } +} + + +/** + * @brief Initializes the PulseAudio manager. + * + * This function sets up the PulseAudio threaded mainloop and context for the given manager. + * It creates the mainloop, context, and connects to the PulseAudio server, then starts + * the mainloop and waits for the context to be ready. It also sets up a state callback + * to handle the context state changes. + * + * @param self Pointer to the pulseaudio_manager structure to be initialized. + * @return Returns true if initialization is successful, false otherwise. + * + * @note The function will clean up allocated resources and return false if any step + * of the initialization fails. + */ +static bool manager_initialize(pulseaudio_manager *self) { + // 1. Create the threaded mainloop + self->mainloop = pa_threaded_mainloop_new(); + if (!self->mainloop) { + return false; + } + + // Get the mainloop API + pa_mainloop_api *mlapi = pa_threaded_mainloop_get_api(self->mainloop); + + // Create the context + self->context = pa_context_new(mlapi, "PulseAudio Manager"); + if (!self->context) { + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // Set the state callback + pa_context_set_state_callback(self->context, manager_initialize_cb, self); + + // Lock the mainloop and connect the context + pa_threaded_mainloop_lock(self->mainloop); + + if (pa_context_connect(self->context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) { + pa_threaded_mainloop_unlock(self->mainloop); + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // 2. Start the threaded mainloop + pa_threaded_mainloop_start(self->mainloop); + + // 4. Wait for the context to be ready + while (self->pa_ready == 0) { + pa_threaded_mainloop_wait(self->mainloop); + } + + pa_threaded_mainloop_unlock(self->mainloop); + + if (self->pa_ready == 2) { + return false; + } + + return true; +} + +/** + * Cleans up and frees all resources associated with a pulseaudio_manager object. + * This function ensures that all memory allocated for output and input devices + * within the manager is released. It includes freeing of all associated strings, + * channel names, and profile data. Additionally, it shuts down and frees the + * PulseAudio context and mainloop, if they have been initialized. + * + * @param manager A pointer to the pulseaudio_manager object to be cleaned up. + * If the pointer is NULL, the function does nothing. + */ +void manager_cleanup(pulseaudio_manager *manager) { + if (manager) { + // Free output devices + if (manager->outputs) { + for (uint32_t i = 0; i < manager->output_count; ++i) { + free(manager->outputs[i].code); + free(manager->outputs[i].name); + free(manager->outputs[i].alsa_id); + if (manager->outputs[i].channel_names) { + for (int j = 0; j < manager->outputs[i].max_channels; ++j) { + free(manager->outputs[i].channel_names[j]); + } + free(manager->outputs[i].channel_names); + } + if (manager->outputs[i].profiles) { + for (uint32_t j = 0; j < manager->outputs[i].profile_count; ++j) { + free((char*)manager->outputs[i].profiles[j].name); + free((char*)manager->outputs[i].profiles[j].description); + } + free(manager->outputs[i].profiles); + } + } + free(manager->outputs); // Finally free the array itself + } + + // Free input devices + if (manager->inputs) { + for (uint32_t i = 0; i < manager->input_count; ++i) { + free(manager->inputs[i].code); + free(manager->inputs[i].name); + free(manager->inputs[i].alsa_id); + if (manager->inputs[i].channel_names) { + for (int j = 0; j < manager->inputs[i].max_channels; ++j) { + free(manager->inputs[i].channel_names[j]); + } + free(manager->inputs[i].channel_names); + } + if (manager->inputs[i].profiles) { + for (uint32_t j = 0; j < manager->inputs[i].profile_count; ++j) { + free((char*)manager->inputs[i].profiles[j].name); + free((char*)manager->inputs[i].profiles[j].description); + } + free(manager->inputs[i].profiles); + } + } + free(manager->inputs); // Finally free the array itself + } + + // Free the names of active output and input devices + free(manager->active_output_device); + free(manager->active_input_device); + + // Disconnect and unreference the context if it's there + if (manager->context) { + // Check if the context is in a state that can be disconnected + if (pa_context_get_state(manager->context) == PA_CONTEXT_READY) { + pa_context_disconnect(manager->context); + } + pa_context_unref(manager->context); + } + + // Stop and free the mainloop if it's there + if (manager->mainloop) { + pa_threaded_mainloop_stop(manager->mainloop); + pa_threaded_mainloop_free(manager->mainloop); + } + + // Free the manager itself + free(manager); + } +} + + + + +/** + * @brief Iterates through operations in the pulseaudio_manager. + * + * @param manager Pointer to the pulseaudio_manager instance. + * @param op Pointer to the pa_operation instance. + */ +static void iterate(pulseaudio_manager *manager, pa_operation *op) { + //Leaves if operation is invalid. + if (!op) return; + + bool is_in_mainloop_thread = pa_threaded_mainloop_in_thread(manager->mainloop); + + // If we're not in the mainloop thread, lock it. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_lock(manager->mainloop); + } + + //Wait for the operation to complete. + //The signaling to continue is performed inside the callback operation (op). + pa_threaded_mainloop_wait(manager->mainloop); + + //Cleaning up. + pa_operation_unref(op); + + // If we locked the mainloop earlier, unlock it now. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_unlock(manager->mainloop); + } +} + +/** + * @brief Callback function for setting master volume on a device. + * + * This function is called when the asynchronous operation to set the volume + * for a sink completes. It will signal the mainloop to stop waiting. + * + * @param c The PulseAudio context. + * @param success Non-zero if the operation succeeded, zero if it failed. + * @param userdata The userdata passed to the function, a pointer to the pulseaudio_manager. + */ +void manager_set_master_volume_cb(pa_context *c, int success, void *userdata) { + (void) c; + + pulseaudio_manager *manager = (pulseaudio_manager *)userdata; + + // Check if the operation was successful + if (success) { + printf("Volume set successfully.\n"); + } else { + printf("Failed to set volume.\n"); + } + + // Signal the mainloop to stop waiting + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + +/** + * @brief Sets the master volume of a given device. + * + * This function sets the master volume of a device specified by its PulseAudio ID. + * + * @param manager Pointer to the pulseaudio_manager instance. + * @param device_id The PulseAudio ID of the device. + * @param volume The new volume level to set. This should be a value between 0 (mute) and 100 (maximum volume). + * @return 0 if the operation was successful, or a non-zero error code if the operation failed. + */ +/** + * @brief Sets the master volume of a given device. + * + * This function sets the master volume of a device specified by its PulseAudio ID. + * + * @param manager Pointer to the pulseaudio_manager instance. + * @param device_id The PulseAudio ID of the device. + * @param volume The new volume level to set. This should be a value between 0 (mute) and 100 (maximum volume). + * @return 0 if the operation was successful, or a non-zero error code if the operation failed. + */ +int manager_set_master_volume(pulseaudio_manager *manager, uint32_t device_id, int volume) { + if (!manager) { + fprintf(stderr, "Manager is NULL\n"); + return -1; + } + + if(volume < 0 || volume > 100) { + fprintf(stderr, "[manager_set_master_volume] The volume specified is out of range (0-100).\n"); + return -1; + } + + // Fetch the sink information for the device ID + const pa_sink_info *sink_info = get_output_device_by_index(device_id); + if (!sink_info) { + fprintf(stderr, "Could not retrieve sink info for device ID %u\n", device_id); + return -1; + } + + // Calculate the PA volume from the provided percentage + pa_volume_t pa_volume = (pa_volume_t) ((double) volume / 100.0 * PA_VOLUME_NORM); + + // Initialize a pa_cvolume structure and set the volume for all channels + pa_cvolume cvolume; + pa_cvolume_set(&cvolume, sink_info->channel_map.channels, pa_volume); + + // Start the asynchronous operation to set the sink volume + pa_operation *op = pa_context_set_sink_volume_by_index(manager->context, device_id, &cvolume, manager_set_master_volume_cb, manager); + if (!op) { + fprintf(stderr, "Failed to start volume set operation\n"); + return -1; + } + + // Wait for the operation to complete + iterate(manager, op); + + return 0; +} + +/** + * @brief Callback function for handling the completion of an output mute toggle operation. + * + * This function is invoked by the PulseAudio main loop upon the completion of an operation + * to toggle the mute state of an output device (sink). It is used in conjunction with + * `pa_context_set_sink_mute_by_index` as part of the `manager_toggle_output_mute` function. + * The callback checks if the mute toggle operation was successful and signals the mainloop + * to continue processing. + * + * @param c Pointer to the PulseAudio context, not used in this callback. + * @param success An integer indicating the success of the mute toggle operation. + * A non-zero value indicates success, while zero indicates failure. + * @param userdata User data provided when initiating the operation; expected to be a pointer + * to a `pulseaudio_manager` instance. + * + */ +static void manager_toggle_output_mute_cb(pa_context *c, int success, void *userdata) { + (void) c; + + pulseaudio_manager *manager = (pulseaudio_manager *) userdata; + if (!success) { + fprintf(stderr, "Failed to toggle mute state.\n"); + } + + // Signal the mainloop to continue + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + + +/** + * Toggle the mute state of a given output device. + * + * @param manager A pointer to the initialized pulseaudio_manager instance. + * @param index The index of the output device to toggle mute state. + * @param state The desired mute state (1 for ON/mute, 0 for OFF/unmute). + * @return Returns 0 on success, -1 on failure. + */ +int manager_toggle_output_mute(pulseaudio_manager *manager, uint32_t index, int state) { + + if (!manager || !manager->context) { + fprintf(stderr, "Invalid PulseAudio manager or context.\n"); + return -1; + } + + if (index >= manager->output_count) { + fprintf(stderr, "Output device index out of range.\n"); + return -1; + } + + pa_operation *op = pa_context_set_sink_mute_by_index(manager->context, + index, state, manager_toggle_output_mute_cb, manager); + + iterate(manager, op); + + return 0; +} + +/** + * @brief Callback function for handling the completion of an input mute toggle operation. + * + * This function is called by the PulseAudio main loop when the operation to toggle + * the mute state of an input device (source) is completed. The function is used in + * conjunction with `pa_context_set_source_mute_by_index` within the `manager_toggle_input_mute` + * function. It checks if the operation was successful and signals the mainloop to continue. + * + * @param c Pointer to the PulseAudio context. This parameter is not used in this callback. + * @param success An integer indicating the success of the mute toggle operation. + * Non-zero value indicates success, zero indicates failure. + * @param userdata User data provided when initiating the operation; expected to be a pointer + * to a `pulseaudio_manager` instance. + * + */ +static void manager_toggle_input_mute_cb(pa_context *c, int success, void *userdata) { + (void) c; + + pulseaudio_manager *manager = (pulseaudio_manager *) userdata; + if (!success) { + fprintf(stderr, "Failed to toggle input mute state.\n"); + } + + // Signal the mainloop to continue + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + +/** + * Toggle the mute state of a given input device. + * + * @param manager A pointer to the initialized pulseaudio_manager instance. + * @param index The index of the input device to toggle mute state. + * @param state The desired mute state (1 for ON/mute, 0 for OFF/unmute). + * @return Returns 0 on success, -1 on failure. + */ +int manager_toggle_input_mute(pulseaudio_manager *manager, uint32_t index, int state) { + + if (!manager || !manager->context) { + fprintf(stderr, "Invalid PulseAudio manager or context.\n"); + return -1; + } + + if (index >= manager->input_count) { + fprintf(stderr, "Input device index out of range.\n"); + return -1; + } + + pa_operation *op = pa_context_set_source_mute_by_index(manager->context, + index, state, manager_toggle_input_mute_cb, manager); + + iterate(manager, op); + + return 0; +} + +/** + * @brief Callback for handling the completion of setting the default sink. + * + * This callback is invoked when the operation to set the default sink in PulseAudio + * is completed. It signals the main loop to continue the execution flow. + * + * @param c The PulseAudio context. + * @param success Indicates if the operation was successful. + * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. + */ +static void manager_switch_default_output_cb(pa_context *c, int success, void *userdata) { + (void) c; + + pulseaudio_manager *manager = (pulseaudio_manager *)userdata; + if (!success) { + fprintf(stderr, "Failed to set default sink.\n"); + } + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + +/** + * @brief Callback for handling each sink input during the process of moving them to a new sink. + * + * This callback is invoked for each sink input (audio stream) currently active. It moves + * each sink input to the new default sink specified in the shared_data. + * + * @param c The PulseAudio context. + * @param i The sink input information. + * @param eol End of list flag, indicating no more data. + * @param userdata User-provided data, expected to be a pointer to shared_data_1 structure. + */ +static void manager_switch_default_output_cb_2(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata) { + + _shared_data_1 *shared_data = (_shared_data_1 *) userdata; + pa_threaded_mainloop *mainloop = shared_data->manager->mainloop; + + if (eol < 0) { + // Error occurred, signal the main loop to continue + pa_threaded_mainloop_signal(mainloop, 0); + return; + } + + if (!eol && i) { + // Move sink input to the new sink index stored in shared_data + pa_operation *op_move = pa_context_move_sink_input_by_index(c, i->index, shared_data->new_index, NULL, NULL); + if (op_move) { + pa_operation_unref(op_move); + pa_threaded_mainloop_signal(mainloop, 0); + } + } + + if (eol > 0) { + // End of list, signal the main loop to continue + pa_threaded_mainloop_signal(mainloop, 0); + } +} + +/** + * @brief Switches the default output device to the specified device. + * + * This function sets the specified output device as the default sink in PulseAudio. + * It also moves all current sink inputs (audio streams) to the new default sink. + * + * @param self Pointer to the pulseaudio_manager instance. + * @param device_index Index of the output device to be set as the default. + * @return True if the operation was successful, False otherwise. + */ +bool manager_switch_default_output(pulseaudio_manager *self, uint32_t device_index) { + //To be sent to the second callback. + _shared_data_1 shared_data = {self, self->outputs[device_index].index}; + + if (!self || !self->context || device_index >= self->output_count) { + fprintf(stderr, "Invalid arguments provided.\n"); + return false; + } + + const char *new_sink_name = self->outputs[device_index].code; + if (!new_sink_name) { + fprintf(stderr, "Output device code is NULL.\n"); + return false; + } + + // Set the new default sink + pa_operation *op = pa_context_set_default_sink(self->context, new_sink_name, manager_switch_default_output_cb, self); + iterate(self, op); + + shared_data.new_index = get_output_device_index_by_code(self->context, self->outputs[device_index].code); + //fprintf(stderr, "[DEBUG, manager_switch_default_output()] index is %lu\n", (unsigned long) shared_data.new_index); + + // Move all sink inputs to the new default sink + op = pa_context_get_sink_input_info_list(self->context, manager_switch_default_output_cb_2, &shared_data); + iterate(self, op); + + return true; +} + +/** + * @brief Callback for handling the completion of setting the default source. + * + * This callback is invoked when the operation to set the default source in PulseAudio + * is completed. It signals the main loop to continue the execution flow. + * + * @param c The PulseAudio context. + * @param success Indicates if the operation was successful. + * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. + */ +static void manager_switch_default_input_cb(pa_context *c, int success, void *userdata) { + (void) c; + + pulseaudio_manager *manager = (pulseaudio_manager *)userdata; + if (!success) { + fprintf(stderr, "Failed to set default source.\n"); + } + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + + +/** + * @brief Switches the default input device to the specified device. + * + * This function sets the specified input device as the default source in PulseAudio. + * It requires a valid PulseAudio context and uses the PulseAudio API to set the new default source. + * + * @param self Pointer to the pulseaudio_manager instance. + * @param device_index Index of the input device to be set as the default. + * @return True if the operation was successful, False otherwise. + */ +bool manager_switch_default_input(pulseaudio_manager *self, uint32_t device_index) { + // Validate the arguments + if (!self || !self->context || device_index >= self->input_count) { + fprintf(stderr, "Invalid arguments provided.\n"); + return false; + } + + // Retrieve the code (PulseAudio name) of the new default input device + const char *new_source_name = self->inputs[device_index].code; + if (!new_source_name) { + fprintf(stderr, "Input device code is NULL.\n"); + return false; + } + + // Lock the main loop to ensure thread safety during the operation + pa_threaded_mainloop_lock(self->mainloop); + + // Initiate the operation to set the new default source + pa_operation *op = pa_context_set_default_source(self->context, new_source_name, manager_switch_default_input_cb, self); + if (op) { + pa_operation_unref(op); + } else { + fprintf(stderr, "Failed to set default source.\n"); + pa_threaded_mainloop_unlock(self->mainloop); + return false; + } + + // Wait for the completion of the operation + pa_threaded_mainloop_wait(self->mainloop); + + // Unlock the main loop after the operation is complete + pa_threaded_mainloop_unlock(self->mainloop); + + return true; +} + +/** + * @brief Sets the global sample rate for PulseAudio. + * + * This function attempts to set the global sample rate for PulseAudio by modifying + * the PulseAudio configuration files. It first tries to update the system-wide + * configuration file (/etc/pulse/daemon.conf). If it does not have permission to + * write to the system-wide file or the file does not exist, it then tries to + * update the user's local configuration file (~/.config/pulse/daemon.conf). + * + * The function searches for the 'default-sample-rate' line in the configuration file. + * If found, it updates this line with the new sample rate. If the line is not found, + * it appends the setting to the end of the configuration file. + * + * @param sample_rate The new sample rate to set (in Hz). + * @return Returns 0 on success, -1 on failure (e.g., if both configuration files + * cannot be opened for writing). + */ +int manager_set_pulseaudio_global_rate(int sample_rate) { + + //Delay for waiting to restarting pulseaudio (in seconds). + const int restart_delay = 2; + + const char* system_conf = DAEMON_CONF; + struct passwd *pw = getpwuid(getuid()); + const char* homedir = pw ? pw->pw_dir : NULL; + char local_conf[MAX_LINE_LENGTH]; + if (homedir) { + snprintf(local_conf, sizeof(local_conf), "%s/.config/pulse/daemon.conf", homedir); + } else { + strcpy(local_conf, DAEMON_CONF); // Use system config as fallback + } + + const char* paths[] = { system_conf, local_conf }; + int operation_successful = 0; + + for (int i = 0; i < 2; ++i) { + FILE* file = fopen(paths[i], "r+"); + if (!file && i == 1) { // If local file doesn't exist, create it + file = fopen(local_conf, "w+"); + } + if (!file) { + continue; + } + + char new_config[MAX_LINE_LENGTH * 10] = ""; + char line[MAX_LINE_LENGTH]; + int found = 0; + + while (fgets(line, sizeof(line), file)) { + char *trimmed_line = line; + // Skip leading whitespace + while (*trimmed_line && isspace((unsigned char)*trimmed_line)) { + trimmed_line++; + } + + if (strncmp(trimmed_line, "default-sample-rate", 19) == 0) { + sprintf(line, "default-sample-rate = %d\n", sample_rate); + found = 1; + } + strcat(new_config, line); + } + + if (!found) { + sprintf(new_config + strlen(new_config), "default-sample-rate = %d\n", sample_rate); + } + + rewind(file); // Rewind to the beginning of the file for writing + if (fputs(new_config, file) != EOF) { + operation_successful = 1; + } + fclose(file); + + if (operation_successful) { + break; // Exit loop if operation was successful + } + } + + if (!operation_successful) { + fprintf(stderr, "Failed to update PulseAudio configuration file\n"); + return -1; + } + + // Check if running as root + if (getuid() == 0) { + // Inform the user to manually restart PulseAudio + printf("[WARNING] Pulseaudio cannot be restarted automatically as root.\n"); + printf("Please restart PulseAudio manually to apply changes.\n"); + return 0; + } + + // Check if PulseAudio is running; if so, kill it. + if (system("pulseaudio --check") == 0) { + if(system("pulseaudio --kill") != 0) { + perror("Failed to kill PulseAudio"); + return -1; // Indicate an error in restarting PulseAudio + } + sleep(restart_delay); + } + + // Restart PulseAudio to apply changes + if (system("pulseaudio --start") != 0) { + perror("Failed to restart PulseAudio"); + return -1; // Indicate an error in restarting PulseAudio + } + + return 0; // Configuration updated and PulseAudio restarted successfully +} + + +/** + * @brief Callback function for setting the mute state of a channel in a PulseAudio sink. + * + * This callback function is triggered by `pa_context_get_sink_info_by_index` to process + * information about a specific PulseAudio sink. It modifies the volume of a given channel + * in the sink to either muted or unmuted state, as specified in the user data. + * + * @param c Pointer to the PulseAudio context. + * @param info Pointer to the structure containing the sink information. + * @param eol End-of-list flag. If non-zero, indicates no more data. + * @param userdata Pointer to user data, expected to be of type `struct volume_update_data`. + * + */ +static void manager_set_output_channel_mute_state_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + (void) userdata; + + if (eol > 0) { + pa_threaded_mainloop_signal(volume_data.manager->mainloop, 0); + return; + } + + struct _shared_data_2 *data = (struct _shared_data_2 *)userdata; + + if (info) { + // Modify the volume of the specified channel + data->new_volume = info->volume; + data->new_volume.values[data->channel_index] = data->mute_state ? PA_VOLUME_MUTED : pa_cvolume_max(&info->volume); + } +} + +/** + * @brief Callback function for confirming the volume set operation on a PulseAudio sink. + * + * This callback function is used to verify the success of a volume set operation + * on a PulseAudio sink. It is called after attempting to set the volume of a specific + * channel within a sink, indicating whether the operation was successful. + * + * @param c Pointer to the PulseAudio context. + * @param success Integer indicating the success of the volume set operation. Non-zero if successful. + * @param userdata Pointer to user data. This parameter is not used in this callback. + * + */ +static void manager_set_output_channel_mute_state_cb2(pa_context *c, int success, void *userdata) { + (void) c; + (void) userdata; + + if (!success) { + fprintf(stderr, "Failed to set sink volume.\n"); + } + pa_threaded_mainloop_signal(volume_data.manager->mainloop, 0); +} + +/** + * @brief Sets the mute state for a single channel of an output device. + * + * This function controls the mute state of a specific channel for a given PulseAudio sink (output device). + * It uses the EasyPulse API to interact with the PulseAudio server. + * + * @param sink_index Index of the sink (output device) whose channel mute state is to be set. + * @param channel_index Index of the channel within the sink to be muted or unmuted. + * @param mute_state Boolean value indicating the desired mute state. 'true' to mute, 'false' to unmute. + * + * @return Returns 0 on success, non-zero on failure. + * + */ +int manager_set_output_mute_state(pulseaudio_manager *self, uint32_t sink_index, +uint32_t channel_index, bool mute_state) { + + if (!self->context) { + fprintf(stderr, "Failed to get PulseAudio context.\n"); + return -1; + } + + volume_data.channel_index = channel_index; + volume_data.mute_state = mute_state; + volume_data.manager = self; + + // Requesting information about the specified sink + pa_operation *op = pa_context_get_sink_info_by_index(self->context, sink_index, + manager_set_output_channel_mute_state_cb, &volume_data); + + if (!op) { + fprintf(stderr, "Failed to start sink information operation.\n"); + return -1; + } + + // Wait for the operation to complete + iterate(self, op); + + // Set the updated volume + op = pa_context_set_sink_volume_by_index(self->context, sink_index, + &(volume_data.new_volume), manager_set_output_channel_mute_state_cb2, NULL); + + iterate(self, op); + + return 0; // Success +} + +/** + * @brief Callback function for handling input device information. + * + * This function is called in response to a request for information about a specific PulseAudio input device. + * It is used to modify the volume of a specified channel in the input device based on the mute state. + * + * @param c Pointer to the PulseAudio context. + * @param info Pointer to the structure containing the sink information. + * @param eol End-of-list flag. If non-zero, indicates no more data. + * @param userdata Pointer to user data, expected to be of type pulseaudio_manager. + * + */ +static void manager_set_input_mute_state_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) c; + _shared_data_2 *volume_data = (_shared_data_2 *)userdata; + + if (eol > 0) { + pa_threaded_mainloop_signal(volume_data->manager->mainloop, 0); + return; + } + + if (info) { + // Modify the volume of the specified channel + volume_data->new_volume = info->volume; + pa_volume_t new_channel_volume = volume_data->mute_state ? PA_VOLUME_MUTED : pa_cvolume_max(&info->volume); + volume_data->new_volume.values[volume_data->channel_index] = new_channel_volume; + } +} + +/** + * @brief Callback function for confirming the volume set operation on a PulseAudio input device. + * + * This callback function is used to verify the success of setting the volume of a specified channel in + * a PulseAudio input device. It is called after an attempt to set the volume of a channel within an input device. + * + * @param c Pointer to the PulseAudio context. + * @param success Integer indicating the success of the volume set operation. Non-zero if successful. + * @param userdata Pointer to user data, expected to be of type pulseaudio_manager. + * + */ +static void manager_set_input_mute_state_cb2(pa_context *c, int success, void *userdata) { + (void) c; + _shared_data_2 *volume_data = (_shared_data_2 *)userdata; + + if (!success) { + fprintf(stderr, "Failed to set sink volume.\n"); + } + + pa_threaded_mainloop_signal(volume_data->manager->mainloop, 0); +} + + +/** + * @brief Sets the mute state for an entire PulseAudio input device. + * + * This function controls the mute state of a specified PulseAudio input device (source). + * It mutes or unmutes all channels of the input device based on the provided mute state. + * + * @param self Pointer to the pulseaudio_manager structure, containing the necessary PulseAudio context. + * @param input_index Index of the input device (source) whose mute state is to be set. + * @param mute_state Boolean value indicating the desired mute state. 'true' to mute, 'false' to unmute. + * + * @return Returns 0 on success, -1 on failure. + * + */ +int manager_set_input_mute_state(pulseaudio_manager *self, uint32_t input_index, +uint32_t channel_index, bool mute_state) { + if (!self->context) { + fprintf(stderr, "Failed to get PulseAudio context.\n"); + return -1; + } + + volume_data.channel_index = channel_index; + volume_data.mute_state = mute_state; + volume_data.manager = self; + + // Requesting information about the specified sink + pa_operation *op = pa_context_get_sink_info_by_index(self->context, input_index, manager_set_input_mute_state_cb, self); + + if (!op) { + fprintf(stderr, "Failed to start sink information operation.\n"); + return -1; + } + + // Wait for the operation to complete + iterate(self, op); + + // Set the updated volume for the specified channel (effectively muting or unmuting the channel) + op = pa_context_set_sink_volume_by_index(self->context, input_index, + &(volume_data.new_volume), manager_set_input_mute_state_cb2, self); + + if (!op) { + fprintf(stderr, "Failed to start sink volume set operation.\n"); + return -1; + } + + iterate(self, op); + + return 0; +} diff --git a/v-0.12/easypulse_core.h b/v-0.12/easypulse_core.h new file mode 100644 index 0000000..3d352ae --- /dev/null +++ b/v-0.12/easypulse_core.h @@ -0,0 +1,108 @@ +/** + * @file core.h + * @brief EasyPulse Library Header. + * + * EasyPulse is a library designed to provide pseudo-object oriented programming + * functions to simplify access to PulseAudio. + */ + +#ifndef EASPYPULSE_CORE_H +#define EASPYPULSE_CORE_H +#include +#define DEBUG_MODE 0 // Debug mode flag + +#include +#include "system_query.h" +#include +#include +#include + +// Forward declarations +typedef struct pulseaudio_manager pulseaudio_manager; +typedef struct pulseaudio_device pulseaudio_device; +typedef struct pulseaudio_volume pulseaudio_volume; + + +typedef struct { + char *name; // Name of the profile + char *description; // Description of the profile + uint32_t channels; // Number of channels this profile has +} pulseaudio_profile; + +//Internal volume information. +typedef struct _internal_volume { + uint32_t index; + char *code; //Pulseaudio name of the volume. + pa_cvolume *volume; //Volume representation. + pa_channel_map *cmap; //Channel map representation. + +} internal_volume; + +/** + * @brief Represents a PulseAudio device. + */ +struct pulseaudio_device { + uint32_t index; // Index of the device. + char *code; // Pulseaudio name of the device. + char *name; // Pulseaudio description of the device. + char *alsa_id; // Alsa ID of the device. + int sample_rate; // Current sample rate of the device. + pa_card_profile_info *active_profile; // Active alsa profile of this device. + char **channel_names; // Public channel names. + int master_volume; // Average volume of all channels (in percentage). + int *channel_volume; // Volume of each individual channel (in percentage). + bool mute; // Mute status of the devices (true for muted, false for unmuted). + int min_channels; // The minimum number of channels of the device. + int max_channels; // The maximum number of channels of the device. + pa_card_profile_info *profiles; // Array of available profiles for the device + uint32_t profile_count; // Number of available profiles + pa_stream *stream; // Associated PulseAudio stream (audio flow to be played / recorded). +}; + +/** + * @brief Represents the main manager for PulseAudio operations. + */ +struct pulseaudio_manager { + pa_threaded_mainloop *mainloop; // Mainloop for PulseAudio operations. + pa_context *context; // PulseAudio context. + pulseaudio_device *outputs; // Array of available output devices. + pulseaudio_device *inputs; // Array of available input devices. + int pa_ready; // Indicates if PulseAudio is ready (1 for ready, 2 for error). + int devices_loaded; // Indicates if devices are loaded (0 for not loaded, 1 for loaded successfully, 2 for error). + char *active_output_device; // Pointer to active output device. + char *active_input_device; // Pointer to active input device. + uint32_t output_count; // Number of pulseaudio sinks (outputs). + uint32_t input_count; // Number of pulseaudio sources (inputs). +}; + +pulseaudio_manager *manager_create(void); +void manager_cleanup(pulseaudio_manager *manager); //Cleans up the manager. + +int manager_set_master_volume(pulseaudio_manager *manager, +uint32_t device_id, int volume); //Sets the master volume of a given volume. + +int manager_toggle_output_mute(pulseaudio_manager *manager, +uint32_t index, int state); //Toggles the volume of output device to muted / unmuted. + +int manager_toggle_input_mute(pulseaudio_manager *manager, +uint32_t index, int state); //Toggles the volume of input device to muted / unmuted. + +bool manager_switch_default_output(pulseaudio_manager *self, +uint32_t device_index); //Changes the default output device. + +bool manager_switch_default_input(pulseaudio_manager *self, +uint32_t device_index); //Changes the default input device. + +int manager_set_output_sample_rate(pulseaudio_manager *manager, +uint32_t device_index, int sample_rate); //Changes the output of an output device. + +int manager_set_pulseaudio_global_rate(int sample_rate); //Changes the output of an output device. + +int manager_set_output_mute_state(pulseaudio_manager *self, +uint32_t output_index, uint32_t channel_index, bool mute_state); //Changes a number of output channels to mute / unmuted. + +int manager_set_input_mute_state(pulseaudio_manager *self, +uint32_t input_index, uint32_t channel_index, bool mute_state); //Changes a number of input channels to mute / unmuted. + + +#endif // CORE_H diff --git a/v-0.12/examples/Makefile b/v-0.12/examples/Makefile new file mode 100644 index 0000000..6f11288 --- /dev/null +++ b/v-0.12/examples/Makefile @@ -0,0 +1,19 @@ +CC = gcc +CFLAGS = -Wall -Wextra -g -O0 + +LIB_DIR = ../ +LIB_SRC = $(LIB_DIR)*.c + +EXAMPLES_DIR = . +EXAMPLES_SRC = $(wildcard $(EXAMPLES_DIR)/*.c) +EXAMPLES_OUT = $(patsubst $(EXAMPLES_DIR)/%.c,$(EXAMPLES_DIR)/%,$(EXAMPLES_SRC)) + +all: $(EXAMPLES_OUT) + +$(EXAMPLES_DIR)/%: $(EXAMPLES_DIR)/%.c + $(CC) $(CFLAGS) $< $(LIB_SRC) -o $@ -lpulse -lasound + +clean: + rm -f $(EXAMPLES_DIR)/*~ $(EXAMPLES_OUT) + +.PHONY: all clean diff --git a/v-0.12/examples/alsa-mapper_pulseaudio-api b/v-0.12/examples/alsa-mapper_pulseaudio-api new file mode 100755 index 0000000000000000000000000000000000000000..4b63f1cd9fa64728f6852c77104734a769a89907 GIT binary patch literal 128928 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 B?V$hw literal 0 HcmV?d00001 diff --git a/v-0.12/examples/alsa-mapper_pulseaudio-api.c b/v-0.12/examples/alsa-mapper_pulseaudio-api.c new file mode 100644 index 0000000..47eb39b --- /dev/null +++ b/v-0.12/examples/alsa-mapper_pulseaudio-api.c @@ -0,0 +1,91 @@ +/** + * @file pulseaudio_alsa_mapper.c + * @brief Demonstrates how to map PulseAudio sinks to their corresponding ALSA device names. + */ + +#include +#include +#include +#include + +static const char* get_alsa_friendly_name(int card_num) { + snd_ctl_t *ctl; + char name[128]; + snprintf(name, sizeof(name), "hw:%d", card_num); + + if (snd_ctl_open(&ctl, name, 0) < 0) { + return NULL; + } + + snd_ctl_card_info_t *info; + snd_ctl_card_info_alloca(&info); + if (snd_ctl_card_info(ctl, info) < 0) { + snd_ctl_close(ctl); + return NULL; + } + + const char *friendly_name = strdup(snd_ctl_card_info_get_name(info)); + snd_ctl_close(ctl); + return friendly_name; +} + +static void sink_info_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) userdata; + + if (eol > 0) { + pa_context_disconnect(c); + return; + } + + const char *udev_description = pa_proplist_gets(info->proplist, "device.description"); + const char *card_str = pa_proplist_gets(info->proplist, "alsa.card"); + const char *device_str = pa_proplist_gets(info->proplist, "alsa.device"); + + int card_num = card_str ? atoi(card_str) : -1; + const char *friendly_name = card_num != -1 ? get_alsa_friendly_name(card_num) : NULL; + + if (udev_description && card_str && device_str) { + printf("Sink: %s, UDEV description: %s, ALSA name: hw:%s,%s", info->name, udev_description, card_str, device_str); + if (friendly_name) { + printf(", Friendly ALSA name: %s", friendly_name); + free((void*)friendly_name); + } + printf("\n"); + } else if (udev_description) { + printf("Sink: %s, UDEV description: %s, Incomplete ALSA name information.\n", info->name, udev_description); + } +} + +static void context_state_cb(pa_context *c, void *userdata) { + switch (pa_context_get_state(c)) { + case PA_CONTEXT_READY: + pa_context_get_sink_info_list(c, sink_info_cb, NULL); + break; + case PA_CONTEXT_FAILED: + case PA_CONTEXT_TERMINATED: + pa_mainloop_quit((pa_mainloop*)userdata, 0); + break; + default: + break; + } +} + +int main(void) { + pa_mainloop *mainloop; + pa_mainloop_api *mainloop_api; + pa_context *context; + + mainloop = pa_mainloop_new(); + mainloop_api = pa_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "udev_description_fetcher"); + + pa_context_set_state_callback(context, context_state_cb, mainloop); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + + pa_mainloop_run(mainloop, NULL); + + pa_context_unref(context); + pa_mainloop_free(mainloop); + + return 0; +} diff --git a/v-0.12/examples/change-speaker-mode b/v-0.12/examples/change-speaker-mode new file mode 100755 index 0000000000000000000000000000000000000000..8aef6eb66ea58207c88942ab41c51815aba95572 GIT binary patch literal 118752 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 + +int main(void) { + // Initialize the pulseaudio_manager + pulseaudio_manager *manager = new_manager(); + //pulseaudio_manager *self = manager; + + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudio manager.\n"); + return 1; + } + + + // Detect the current mode of the active device + const char* current_mode = manager->get_device_mode_by_code(manager, manager->active_device->code); + printf("Current mode of the active device (%s): %s\n", manager->active_device->code, current_mode); + + // List available modes based on the number of channels of the active device + printf("\nAvailable modes:\n"); + printf("1. mono\n"); + printf("2. stereo\n"); + + int max_choice = 2; // To keep track of the maximum mode choice number + uint32_t channels = manager->active_device->number_of_channels; + + if (channels >= 4) { + printf("3. 4.0\n"); + max_choice = 3; + } + if (channels >= 5) { + printf("4. 5.0\n"); + max_choice = 4; + } + if (channels >= 6) { + printf("5. 5.1\n"); + max_choice = 5; + } + if (channels >= 8) { + printf("6. 7.1\n"); + max_choice = 6; + } + + // Prompt the user to select a mode + printf("\nEnter the number corresponding to the desired mode: "); + int choice; + scanf("%d", &choice); + + if (choice < 1 || choice > max_choice) { + printf("Invalid choice.\n"); + manager->destroy(self); + return 1; + } + + const char* mode_choices[] = {"mono", "stereo", "4.0", "5.0", "5.1", "7.1"}; + const char* mode_to_set = mode_choices[choice - 1]; + + // Set the mode of the active device + if (manager->set_device_mode_by_code(manager, manager->active_device->code, mode_to_set)) { + printf("Mode set to %s successfully!\n", mode_to_set); + } else { + fprintf(stderr, "Failed to set the mode.\n"); + } + + // Cleanup + manager->destroy(self); + return 0; + +} +#endif + +int main(void) { + return 0; +} diff --git a/v-0.12/examples/change_global_sample_rate b/v-0.12/examples/change_global_sample_rate new file mode 100755 index 0000000000000000000000000000000000000000..18e9e2c487c6e3050a2f7204d18fd0aef1b8fe81 GIT binary patch literal 119272 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 VKhhaewqO1)s^(Eo1J9-Pe*o}j?6d#? literal 0 HcmV?d00001 diff --git a/v-0.12/examples/change_global_sample_rate.c b/v-0.12/examples/change_global_sample_rate.c new file mode 100644 index 0000000..b520fc4 --- /dev/null +++ b/v-0.12/examples/change_global_sample_rate.c @@ -0,0 +1,47 @@ +/** + * @file change_global_sample_rate.c + * @brief Adjusts the global PulseAudio sample rate. + * + * This program retrieves and displays the current global sample rate for PulseAudio. + * It then prompts the user to enter a new sample rate. Upon receiving a valid input, + * it attempts to set this new sample rate as the global sample rate in PulseAudio's + * configuration files. The program first tries to update the system-wide configuration + * and then falls back to the user's local configuration if necessary. + * + * @return Returns 0 on successful execution, 1 on failure or invalid input. + */ + +#include +#include +#include "../easypulse_core.h" + + +int main() { + // Fetch the global playback sample rate from the default PulseAudio configuration file + int sample_rate = get_pulseaudio_global_playback_rate(NULL); + printf("[DEBUG, main] sample rate is: %i\n", sample_rate); + + if (sample_rate > 0) { + printf("Current global playback sample rate: %d Hz\n", sample_rate); + } else { + printf("Failed to retrieve the current global playback sample rate.\n"); + return 1; + } + + // Prompt the user for a new sample rate + printf("Enter the new sample rate to set: "); + int new_sample_rate; + if (scanf("%d", &new_sample_rate) != 1) { + printf("Invalid input.\n"); + return 1; + } + + // Set the new global sample rate + if (manager_set_pulseaudio_global_rate(new_sample_rate) == 0) { + printf("Sample rate successfully set to %d Hz.\n", new_sample_rate); + } else { + printf("Failed to set the new sample rate.\n"); + } + + return 0; +} diff --git a/v-0.12/examples/get-card-profiles-pulseaudio_api b/v-0.12/examples/get-card-profiles-pulseaudio_api new file mode 100755 index 0000000000000000000000000000000000000000..db62124c03c6287131b2cda998831b0c3a58afbd GIT binary patch literal 122336 zcmeFa34B!56+iyoo0((+2?+sYRYnv96$~!OssW4+3K~%;t|5c~(U7FcgvE-Y0n0eX z;sT;oi)+V;IFG;-9vY?jov5^EGKcyEU{w z?bh}uZREd^+Mn&)LiF*kP(BT#J>MeD*Sj95Hmn zvBT=BhaD~bw5tIB7{*ghpJrG~jV9u3e$y}o&H|2qmWJ(q(ssu`x}E%s{j)Od;;U97QXaCXs3-FIL;vZgkjRC}6h<_Jfe#@n!zKqz@ z2$; zSEj-LGmYMx(%>IXlMmz5$p2Xy{F`a;Gtk^=zmO)rC#8u? zej2_0H1bEKp>Iv&hlA6|xiSs?;576FY2r9M4gK;oet0zv{`xfj8IeZ*f719NGmZQg z($KF>BY$NYd`_DD*_y`wSJL>6`)>gM+W*DU(9cL?|I=ygd^n9gm!zS8B#r#D)5wXX z@$<2pKc#lkj-vWH9{qEy5_Pm^CTs3Lz=_mAEjGG6k2#m&f_;)|>U5(yG>xT-q z>sh0uWbXXxs*<`;X>F*a#3-3`_LP#@<+bH=E9ye!wP#P6SXo_Fes<}s%5v40vZtoB zBs8zKymWT??2`GV6;+kh)iouR)nykO=&7zLuPqH#KuLX7ZTTFc$`({t*3T~o?IHo^ zl~z@iSC-UN*Hs8%sJf)4wmcMC47+M8s^*fYqk@VmjZEEL7pksF-7~j5R8m?~A*!pZ zLgkA>B~|4M-C!Lk>Z;*yH0+2zVw%_1}vRTuA@Vs`nQ()vnUnp+30 zC@Za<4asw=ODf@ScdsK|yDF6hlu%b*yP&*QWRSh1m+C6!R+Uz|MJFqE3x>DLYip}( zQ%kBxTvbSGYO8B#a0x`!k(i97^E(C@qhPl~UxAz|4V9;sFFDArGVNg*pNc|CAI+|) z18G%xSx3)>patHotejP&XSH{o>N;c%JiW0FiUDGOBc6yftZ>wBgwTL1-Ek#^U}#_ z2uU5vg{2iqF-hSaXFes?hwtb5_HISSR#h8yRkKTK%I25MTUb(4T3b554l@I@ysWIe zuFmO%swxL?CWFy=rq3=P$m&8s!$W2#h_fduFH zGQAscC71sBHO8D8tiz!>XzRgL8mg`^=7=}vC_l|FpU=4tX;oz)hpN!x8myb#1q>*v zub6GrEyk8IpEQ*WL#TFkeGU6+7D{hrd3lY2Wkd|A)B5VF?28a~CD>U$zpQ4lfh~p0 z6pe?|YReZQn~XUNYq7pSHx`nzi{Z43OXieTR2p0cUo&ed=iGI4qIu;Yy4X_LA7d%^$MORR}c-Y>C?uTev=zTn5<@I7Y)aUbh<3GmUW?epKKLBdFo}J{7n%WX;&v;Ri6sw?7bUlUW<%1=dW-|HhBY~`oI zcT$(~S=_1s%IT~w<#R@>0*KF6m-0EYRRP2!;hevDt?H8aE)EuXxjYPY)RRP2wpf2U}zE%Yg-&0-6=ekw}5Z_B( z%IEr41rXm`UCL)us{)Acqb}uhYpVi?@2f85v!zu5#Jg{bZgb%eR3!4*>cZJ;;Rm|#yQ1<$GGrYUHGvse2WV|&V}FR!k^&6x4Q5ry6{mKzR-o=<-(75;rF=k6I^&h z?+eWTi7vd~g+IxK&vW66T=-rt{K+nSz=c1>g&*v~2VM9A7k-ipKhlLi)rBu~;ZJkn zgD(7J7rxkqKi!3&;liKc!q0T!i(UA6F8rA;e2oh~)rDW=!k^{BFLmM1cHvjJ@aoBv z>Rjo6<~;w{03&Hm>^Vf?rkfsPM+8K1fR3voqw9{Xagar_N@mas{20D&bthyS@Wr;HiXpM2NKt zJb^Gvs#uG_qY1N=iZuy*G+~xdv2_9;PMD=rY^}fp2(x60trWNqVU|jJR_ zO_*DDY^K0h66RJND;D??!rY=`g#y&DffoBn(LO4(0a|v^6ju`?^ zCCn{3w(A>-KVfdgu~va65at#fYY})fVQ#&#CV`J8%q=&zPT<1{bE}Q56?gz)Zn3eI z0{0=ztu?k3FxThdpG^wCeqk{DVX$GxuHv(chBpm=A=o(XJJ9;qX#xIt>zv&Fh@Q<)`<9No4ZKGEG1Gz#<1PZF5e)x5loO1MyAb$z zj~PHk%iy~$z7P=R1v$YE+%F_9It(*bbsT{i7z`IhgAGffM*UC>;mbb}vuOjT-qYN#z;~hM zTY!~rz3gEdv2!&SwNQBMMqEdVT7r$;pC=rQK%ChUjBuB%9|V!Vfyl@-5adh|L9aS? zEyvV}@tva7{30UMCtYV-CTuGZksR?6%1Sk`$ewsS4PRj%x9`4bdqwQKi|7W5{fAs> zM;@!h!iVKp`@%)rB1PMTYNwm3OM2zv{{yj3!0Wrxm>@LAAbUWwClyT|e7q+Zew(qJ zggG8A+8!y|E_N(++i}&u5%z{9dyG&9Ib>jlGq8)?q~|HpT}J3YknU1LKhI4u3KVU* zaL5dWjYcu=_GeuHD{Q!^b$?`KBT2TSVM(iTS?@?us|@7;xAs4M6^}P8*&*FKq`RBD z`&M)-yPKoykn9abEhdzXDS9jSO74H?i_%-a$Bwj~S^C0roH=J<>dcrOjCcofr-Zws z!<(Kd#AWo?oH5~|b#UK0H8I`=A14O)EPG=7ej#zq(F?EyirCnEluS^zZUd!Y%TfJP z=v`n*`wb`>cA3kXLZgBaUxSv)o!OT9D=jq>Qf;okAf=Rs&ft$uj~PsX#?vB+nV9p zn#BmW;%kmBLm{ZFS%Q*LuA;3d4&br%%|&a$ZN%>Ka$2u-Eeq>qSwIaYVVjtjM#8>yD*=Zn0sb@sB-(2V zWu#5WjV2>>lp0Sk)p+`u=xk!tUqbwX;fcN44oy#PZVfgU_M-DrX)o9(V+u z)XvlilPuc7%eBU23$DH#!K{_==eb7?zkHgnMX z!J{zvYQuDNg?&1> z(iLrOF1nB7i#;vN^L?%%ZcSRAdqt+*mv(vX$c7j=%X2DLwYok}Cxp2?r<9o{bYI0 z9ix}$|Ap}G*qvp0{$B{c9rqDBEYB$hYHm$hp3_jcmgkfdDVFCHbdA`1-OKYOpG)f5 z%X112u64=Fa~dL95MO)w`cjItN&!ETa|aU+8ye@-INOGM#do%mw}1MuTow zv%G|Wt3A#U=N7QF9i%#8A!~|6=Mr|BD_1&3LHUws^knhuv}iDFfgFa(ErU*K>pDnH zBEiC}!#OTx=AK|Xma+h5PE1QdU(%3eh zX7^=5L1fy_VA&hNO&{VG9I{&+{s>&#P_&a1IW2Fbuy|C_&P&(siw5q4SDT|{khdSY z8DjZXv3!?UUcEn#$TZwN{Lq&$d#?&}T9aYU3^$WniMD{Np=j5B20L?9(XQMpD{!-L ze`ayOwIVYrGNmq#=3e=Nx`P7ikW-*J-LY0`Q#;3YbMWpQ! z&au5oIhIcHjL5XT$vL*>d#G_UsT`XHu7;w$`xz{9Y;RJIr8SHB(?w+N);We9e0Nfg zNjN|KyX_S0m*9CX0n5aEF#&V64;`nHTN(X(D%j(#&vPS3ItikPMmqkG;(&V>GF(=X z`3|Xo4}GLGV>2-A~b!jiVCX+=>y_wk~*y65L!^)o*d zu{Oi{9Rjv;wAbJ|!IbY3do-A^l_stI(Qy5aV0ap=#|W@T@D{j@+&Q|rqI2bMW zZZFY@BbE2|z*c7m-{uqAeN2rV<+)*6(1D4Z%kw7&Bwmpu#vKiMOo@%_GNtXut>A>p_I+OyG#vWFKkon!@wR{ zE(SG6XB4q}`Ai6dC2WlPVGuPGq9UtEgzeoB6A~qQ9(=20eF#l+a=&Q$GWYQ1H0aCR zydHPXC2sK6FLN(^5wPzTz+dK`v+2uV?vYL5<>ymoL^S3;UU+Ek<69%E1lPEn&)wxD z5d97sKt$hRj{Ad=M!9TUMUsekb5eLKOdBbcM|1QuGK81UBSXVRHb(v77)SY?%A*5a zE-BS6iP^(o)wN1kwMtbMoohejL6x(|T_FaLLHkXg`a_`p<2#i416}IbMwX3< z3|ftpPh@6*H6AiEJdLv>YDme8WQRjgopE?qY59k_}N-Xi5w#sdX;E|LRS>Mk^ z&#hH1I>cqn&$Kb8z!*qQa#0<${ty?HY58s!{kBxO=o83NgVip=N~&BmRC68dvMQ#z z{^)S+*F_`VPw65)@cjWUTKgO2qJA!8F4M*w${@6JQSk?E7Zuvam+-WggW)Mnpl(9g zkVk5z=l0e@Cw39WoduzCUbNdA|QnVEYw}Nr2s=_yS zsE{If7RD#CTa6IUFrbqu6Urta6Jc{L7tB*`@95YGGu2RDf-MrG7=N{7U)n@^7)L|; zNFD)yaa%{ZnObh0Blmtf&9*Kw4OZfa8GapSvrkwq!f&T+m-N|&1qlB*ZaJ@Q+9U2v zJAB-6_B(-m08&5Qb~-N(Yq?*BqTgt?jb+dL&E739c4EeIiXn6U&;+Sw?fQR^*;0p$nCw zZy{7gbFcDxRNc10uAlM*hl72?l3gmA2Wz=~T?4pO%e}{ud$%K3MppT*j0|eHfa0VW zso$l7yY)MIx;c98d*bmuP=x2p!^I6izxfxNQRM7M2J0bK;?Z_IM*PcPcXaJ@7pM_; zhGmcm#Uf`c8DXM+ZX3K}XAPd@hBw~&T8EOPdHJJ2S{zTK?++qw`Bq?}D2Xp|Yd!^`qc3b>&CRE-jy59SkGg7WsouR#y$fxAo?LHHe~6OoYx>%C=Q3j{<65 zejg3MU-R+@^;N7B#upJVxF#4`_Pk>2vHN_QBD3rkiO=%&l-ID4jZr_OVIw7&^#NN& zV~@=Vmbo2Sa+j^)@&SY1iN`k>gE?G!7Jgj3jkc|`E#mDF(!ELFEN=q3%^z%#3)K12 z=00xVsrTX0UrBPIHn*|4k2eKP{J$ml2_yH3rh!JlFi;{iX^IWqM0QR;F;&fXm;;Jo zkyXq9TW@1djzgltvH5M=NDKq^trGjxaI~YkN{X%$M=AU5h(@Q=A*kV(AA*{pVWW%{ z4`OWg=BN*5P^dK7R%AJ?2|pWb^esD&UfP1kuF8-xFa*O9EpXo6KNED6l3#`GE_k(J zPdwB~g%Q zVtnf{w0P_u^hW2xMmTjK%Pj0ASO!tPMmLSTcy@&*^=@`efI76Us2*u4rXHiUySft?2|e|iYC-PweL zHNY+cwx7ZtD%cfEMbMfRXd>4i30!#PN)c8R#VI8lvrgYQQ+@hHlZCJ9~kbUvRRkUZ*hQ82a=hd_45QqCi z@GhL*OcIyV7a~@Ptq~rwj|btcD~h(mvZ!n~NI@oUg;p@YrC^Cx@R^+zu@(*)FAVu+ zfgC61?JIoei&_W^`-<#KY-2b8pf)*1q_RrcD%C@C^z}DjEYAVl$mCe^#f@rcN4hj0 zp*7dpn%mBS$M%TPYUY0W1qZFh09~rIgq|m4!=%P$k&AkgS>N&GaX$pe=bWE*E!)=vWUXh05nnk|rek|3yAedmYQKyxgJd{Al=%VB@LY$g~~dvsWZ% zwVi({tG=Drs}yi&_YS;m%IvO@wOfvL?(Du9bLsnMcSI|2XZLTkf?Oz&l`>`_e3ISE zK(4a;GBPsoVc%T)QWt5=a4AbR>eT*LX79LGC_QA6O8y?V}soX4+VT}*D7)STye_K;;Lyx z#J5HZSqbMU=|Ls^m+WZlv0EMjOEG@I%VPEdrKj4Zr$Os+=fi9I>2apgQ=s(>cJ#Eu zs9>Z=PbDtErZMLPnTS#yf5%}(eE$~N&CwIV2r#O_l`jbx1IVJi-FsnIA_{n>iRs{b zLNh!AhG-QiWt45@=z36hodiufW}%U;)FAsJO|z8jM>*_#Bm4s0^*k(VTZakcJ56KG z01A-iDj4I4gT=7?YRBaf;rI=#NyVlWV^9=6eK)*4JB;aa3F-+bk@Hk#P5{AV1bvmhp@cKlL(G-aV3pdZ2mQ*6unV@VW#2g3guyho6tHH7sO1h|gm6p4Uo(MUe(9C;4@VldK&s?U=Z2j-Jh z-UJ9?|JOhyCp#_U0AZX+E8xq+Ro1zDnAE)Vo=Ml7p**>l(TMn_iL;xd zue<=T**8H;7HP59zz3S)q|s-Hfm)>d`NmreHawp6Ed)khAi-+=H%v|a&dJhdUb3E4x0|2) zw~Vy{)XwY=I8{XMvJW7%xrm2FBlcT-M2hy}CQ!$3->7UEu#av;s$nZ=qHlzMnIXg>H`S)cUMe^p} zd>V1h(F*8S$E7>5Untg|!W!b@*@7D{0o>S(En{z_ep|4yDEcI>jSc*ugoV$^X_Zgw z7mvj|c0g?g3JNjki>R6pP8yF}s5Gi&X)4C!7C#WuqK%t@Y%KP#&y!K$?H#k_NnWev z=HLGaUfh%y9D+wpt$6bdNJxe9_fk{f(KFCe=TA;D` zBxP(*F&3P@jSVoiG3UEeIk3c&_IoK>PwUa@+ICA@4He44O5Hx`gmKyOi&k zTywM-BT}#ihx?Ue`p&B?WsZ{Ave7 z2m5f?Bx&MnxdL`K=5&?eCW8H>N_+!QS{xLcR|6i?l+5T|@aQ*as??s?49^ zQm~WOqzd+%=tvRlBZ2XJZPc z>Ft=f;mDpo4jn0?vKmAG(NURnxr&PW;B~~w%BQa&-2Yuv{^A;6$EX|#!+&g4K41jG z$x#^!ZSA7+09@7~D*uw`rH{(57iOO%$ks>Mv&`D822%YmU%Zo*sSkzh# zzF_UU;WAg1!Fa}SqQa?6A8$kM?uF>ax-aiyR3J65By*zUup>Ln4CqB|aE9txD$8SI zk86q;QXzQfDSA%dsSh0nx;>nNH4H}BHw3C+kmc6sLzgp@fKx-u-k!BY<G*8fB8>(n0kDVv;mIzCV{~jOZ&=@4(H1vJ`bp#rlpjW0gvjlCQg2=mH1Xb zh;KT=_e|?u+O^x^S{C9<$tk_I|Fch`Eb;%(Y{TS{|2d!&|LzYY!F7i zKX&gg$eVmNo*?q@K0j;&$yp$G?41rt9ZUaa->D$tU-VA6BIyptM-GDCAEEV)0j(WU zOY7SJ+3F~EEGT!9lHPC3c|hDQ_sza~GTHN^Io@hTcSb`vJjR*BuOWoYV6Nn4anHZVaJQe^X#?wQn`yX+ATS-+N; zyX+nY;$_k?gXEn>JlOB>2;a{~_@Q6m-A54?Sw&$%^_C=G#FLbNVgg*UR6MFHx^B!d zMMb~dC@JTgb_qS>JDm-3>u6k`x|n0zv|$*y?N~2>IC8xTF5E|J_Voq>|BzH*`2;LZ z06vAs1)Y5F-h+WTvn;?BBRUjc0Z2-^DhI)&+q6g-G7@@hLk`r26u}Ucbc-=tWGj3Y zdV}^fA%P{1da1PuIB znL8Aa6MzCpPLa8j;DC0STZfmflQQ>F2f@tE)P{_L9y@c}v>_2FX_vWv8Ij&ZBy+da ztC1AC1bnImoazW*=3YuwDKmHKWAqbt61|%|zk~7dm4U$-4R^c!p3b_d!h$bJwnPg1 z#rk-ll83Jl%N4xZ*a;RPS1saG9=kqyBvEpWR7cQbAEk9XkG~g^5%4^Ih8m&@`?IuP ztNg8nrO_m!UB&*i>n#4&KF;FLi@N06uq&)muHynCQ{q~L+O7@9D?=ls3WL)(oQ5{$ z)M68KpT+wqJ7o=e2x^ow{w3SSlwBA>bORitS)$wj*g?Y(N5gA%q9JsGO|Cq#p2q7{ zZnC4{2Db+I$JWs4;SL&_fl_0buQUv6r(wEF!>2GujbXTGu#4gryzec;(RWur1YJ8{ zl{k8QO3#jQwpnT`Hr3x^Q{LgwuS5YcD*Bfq!K==o$!NQ!XE>_nhz=G+gC2z^?W-<#B&39w+hZt z^X)tAn9jbxiC)xBn&!xN4%ricN-^Jl4Y^744GXh#$Yy>AQ6tJR`d~o2wiITYuwfvE z=+ps&VQuU_t`;D`D?oSx7c2u`i+Yz<9)dD|u&&^ot#*#hVl0w7Y^e^vX70d=F9WMx zxmCEEqgnK$$it~G4{YdAUkCkyLhT-TcYn{8!aUn7^$2lSxY)nH@ybK>%Xo?%2VXnm zEQI)2Sd9}pm#*M?kF&+%=AzwPPug(iqA{vNehLQFL;;>jb{v#)g&g)`zn9w$IH$7s z@TVl-igB22c@0JKUBx|cGQO*LY2xjGKs4`tyTm#{&HFPQ1mCy1yONo*X#;Z7DY5n( zFWD0vjByE1>}B*m!xABSD2#&N)j=H<3vfp4_xOO7yVMu!h+?Vu^#ja1-+=k-L_`~N z9+Ja=4DM1T$Em8S|H5Ck*-75EGbu|(jIU3(%NKqHyZ};Prrne(r;H+fXX1e0iFJ1q6}3WR>Ij4x1((PKEuHHPE$ z7@mPnkVHY^jG+w@VlS%72}_T!GlgRsg?%}4<@*NIksf>TsfX0qFHgN0v6P9&HzRy+ z3(d9!jq|gQH0izy<<=uyCcTAcgmmkX%A{#vbxfK;la3dYe3y#k%aSE?(LuhZe=~xM zdW+mt>_LA-a>h}>3&Bkv;1>d3)Ne+N7vItRo}#38vJ!Z~xqtQXJT-zNT_c#FM{p6v zh&uI@yw(9CJ)XwMBRNg@Y_EK?_--Ob;=7qdJ$_9hCuev+RK&^cv$gMCJt}bX#S7orxJZ6QBf4OlJ;U_M^n`=p%G5~H~cRS-0bI1N*TEUAvdrA&bzz@8cy_SGiw!G8`oL3qN|Brr!x3_0EX%=7R4k z;BSw@m`&ao~&eI3Aw~AFFxU zhIQYUp#{0`A)TrPT}=ZbzJG$mS{NG85+Y;pZx?FL&r|a)E z*Aj<|o5LT-)!})3)^8=+yAWn<8@Q$U77L#a?}puZk6rlKYw}inOES9k&-RdXwq`j) zVz!>IjXS|Lq(W_6D-^42{W%v8es9v=IcKT`4y8kKB%D9H2?RY(B```{|NUmWfR02ysH9~;BV}~=rVTi`Iyw4>;VJ~VaL4xu=(!B;{sU^>N$0{J z^0szTK(At~IXt-I5?ud)fc^>O=>z&cee+)g^fTC;GN5m9Fs^`XwqcB5J+6OfK$p4r z7pZGkK$4<}AiyZ`m`E;oYrh9e{C{V$iV5eEEknxhYA@t-s3J5V+UcN(& z^mlM{cOL2WyREu*jlF<$;iBSx-))cn869q(cwa^xbUI@&yt{lO7*yHv!X1(askJ!9S--gv;EL@z|Hi%_&Iv(2H6VtGbPc77* zxeI$Yt`n6tx1w#)>s#8zKm^`<2cldl8!*^Zfx>r1E_qammIa{C_qs zb?{|!T!sS!9X}#2@7(@h$K_Z_iXR`B3+SNsalz8t{wOac!lE1==r7k#&jSQ2OKgrO0NUw6HpLtaw{hl`6jvAlHcKJaHt)l5{}F8qV*wfJ&X#$Ggeo zrwm`a(53s0-$>#)HBTVCWM}m7SKH;;#STK|{{>V}IpF)Tv;BNfc?TEbwLgou{#CtE_>S&uE;|Ex{lmjw0WRk*Ok&q=AN~n$G6{dn`7YgWVqjQzlEZ%lyr8yjz5G`?2!{We z^JsVSGBXinBpo#o>XO1=3vG7zr>koT|0P<8JN*1zQ40Ca_I4~0{%?NWKKvuK1TZ

    DO-Ys|8r8N3V(UK@Q-{kb@-=1`98xRbp0BWDmeM&uhr*rJexMS6ZC3rVIMl4 z@3e5D@`uX!{S*zr1(92mqwDK~F*q4>AbJxqlf9wciwM!V7)sKa;XVh!>i<9IDANvh zIj_Gq?Q%$0qn(BQI4Wt{sK0C1m}6q6(i`RKn_V#pb%FhI68Lf}hQ{;OYOTb5aQhGe zXN>!BfGk_veV3#bGM#MX$YgqT^zSIhAED*DGk{;rp!^NYmx%8pkT`Dp7~yUkquo4` zKF5zoiO)xprKhA=VnOxY>t?{RqTEk-FTi0e3-6m#ZPRQE%H?npDb6tLh*w<*c>PcDfBn1!#B^KhOc4EbHHi!FOtir~Cv2ZXb6dScy_lL9-m7omqZNLW2f%FrRB%3; zMjLXDm67nSj*KJv@@mn&$}M#brS^xsmY^!-@q>79JtDrcfWV^1af-#n-4({?M`T97&E zl{R3bp~eZ=IJmogz}~&i6|kKERKSito95*lBST39tnVr@eg}FTsh)kDi8VguQ}hXxkr1=$j}tuY1j!>Msyndmb5*sb`YE(G5PxCrVV(1(wQJjv|aO| zM@6neW|aMk4f+14`MSCIuGW0VIef$Q6l#G#^fY=&$9LVzV|`xpxyO3D=9}d3r5J1Zw;W@0^z3$H zZGI-@Sm%Q*X{_ycZ}~29COq#XVJFOzwiE4aLyLVwR%0Gz)IE|^(lEkBl)*qWr!*!e3CUH-FJ(Kh~y zpX`APfECT{bL}%|Nb*HW|Nrs~m;bMZbNA!_xne}J|L>B7`0xF{2!l`Z|C0`a{?9&L zCA|B&^a|Ae^#4kj(9ZukVpTf-=VBZ|`wou$O5rZb`Oj17{a*=(cJ%*OjcNQpA068N zSL`hI)6R|S|J~tj>tOTpt-vDx@cr!wwnsd_1t;Df-3ByXR#r`60GL+6tdgd2`7T1T znQsg*h+c7ps&$q!z3>xilpG2`3a?O?tplY_r=dy&-GHAmmQh9=2?9GSh*e~#{tVSuXO>5J;BdHH7O;$Q4d19o9Z{}KKcpyij?c!76F zmb0~giOokH@-nQ(c6f~&%CJN_rzZZy ze;Jype){{#13!7-ClCDOf&Z_1z%=m69{$d*4wY60>ZH=le^K0ru<+Y;+R@QgY10BDhw4$0M0I76c|_^fQhG1 zn>-neY>ZAr182F$5vVGiUp_i8uukN*@0?v;S5{k5L&b_F5EvRby?*|z^4dW4oIp)& z^_+^z@;dZk=p2G%)ET7?O}Ne)3u4U8+TFHC$O+TV7XF zT{XL+YHq-x3Cy9v!=Qk4Q!1(|=GV^;l+7!xsw%If(AiWjeWi<1^clv<2uJzsK&U!U zT3K0L2I~Uz@uSSOiy^u;fFEkED=%e?O6HeVmCh}%RbF=UL20O>w6fxo@_mr+M^ANq z2$@m`;R$=nYRhR&T?p-bu|`qpG*cdP(^q5AWuZV#W$EHsrDYepIaOwA7Rj%Ko>b$m zsM6-RUbLFV)1VsJd9@ia1-jjM>Qyc3T=MtqnQ)Fr@05a%43of;)Pl>bY}~ z?(;GK5eNiQE1p!f0J$>TJ^S^@0&pdM|2tH^C~cGFwv|c#b4#zT zuPvi%CNbe`^V&(Ue=^zMIlHW_On9JW&Z`WCSgt71lLl0tTovb}Wx%Q;O z1;)uj(QaPU*UaYpbEPwXoxNgiy$W`K>su$|yq}Gqditc(Pq{!5%32X9!}^0Idlr_v zas=#rdFEB3jFwZ(4w2 zQ7CyOlTGhliCLs_CLz~FZ%=afq)Vh2^qf;D%8Xrw1M3)7wRaIG@Yt&As-aj=xrbmH z)?*c`mCdyVqefPrfOwu%G+`Q|d4@fy?NoLTRWHr+ODn1>tE+1|xWVoSj4z&q&Z5$~ z#S*f>&+E&vvjFSzn--Rs`iY^_rFtjD(okQ;g+c$JtHj=9OQdh`kkNrT&Tf`+SL$G> z#F90HBRHWv)xOY?o_3VlHBE`y6iRd<^!+SS1KPh{?v92*eMRLq$UwO&+Y*U4Q7r|oaLg;M zoxQNM7S)2SggbS8S*X4?QEsXFk0yqgtn*>6UDddDrxZG+{!8$cF8ZE)=g}MUOBdN8 zw6zT$azS9?bUDq+E>qG=c+k6k6QAxWQG77A3X{8H#SaqU1p+P$DSE|k4i zr~3EITc==j=o9wooTc$J(6xl6)98%YkSmpr#=M22kpTniln3^m&ti|RFeGxJJ(SGK2mOSsYDi$0`)3t-?%HJvw zB{kKxAxxJ!)eL>YV@?{n4;Z$mIBm7*x*q<1tFE%Qx~!}o2dmkEh4WC&ILn4k4EM%x zhN`9Y*=XTBtbI6_s3Q|sD8*72D6Oq6T@2$=(08Dg{a+6x1^w*$no5*QvH*5S)$d2| zI;CnoDnFeKOHCGMze?lw#F}8cz2pAPqmgqG;CT{}(O%itIO+Bdj!C#t<%io!d)rH6 zs?-@$g(_3i?0X$0y8TlvhYu&OI5X?MXHJTLm2^8Te+YYu@y=T8Y#!fZPKbVOzpfL0 zkbu#$m2Uf~E)YM<&@Y}%EflSfn3%?3LKs;gwZV4Wo^LHlhkwSUCC z?-!sn`eZjwr7_`h=Ck`$=&s(K;kf37YuWno^QXLa0d6R{7NRuvsA__ANq58aex}VX zspcs&t)G&tOz4?||6eYRb2;g}Pu zuPZ5=b;0OByTy5Sy_{GoP>-tGXK3PNBl(&_(DyUR&eoL2dTwhe>{XNdN1ChmNoU_d zUF+mJ#-7Ndb}k@YB1c`6uJuMwcbN<&nDo4j@FU%ju!C_*UQT|5d^=yXATEeM%s`#T z%Jpvc@3SWD`$mb8=Jtw2-+kXkop%y9tvlWgNp){Ui*Zg?iAk1zSv324#_YoFb$kWF z*gP*DKh$FwCsoDc*=WaA$K#XHF075mE78ul951?~{S56ov}3M_$6L@oc2zvS3+?fE zvYm&QH-3e-0PO-i!7fJoI@%hvH(w2Yw7b!+L;Dn-2DhN?iRb6L(7uK?&u18y;GK^G zw0}lhjP@wJ08@i@B3@uyiS`z}nD;2!U1;Az+wG=!d^g&fHSu__48wR8?MSqT;HByF z(Y}NBQnX>b*L^G6*U>)3e!TU*9c{1M4| zA@HLe`Umi%?Y0j5S%&djv;nj?JPdxcrH_Cg?UcvBkGAjQ;71$58v{*f`HoL3+P010 z$GPTFyk!(X`_?nyM>`X5ea%FBI$nichW4(_@%Y_nJL5&)&1iR{-GTObyi4ux4EtV) z$B#ri>?OnEb(cbhH_|X>q8T@F!K>ISoGev@fH*e>?cm9{4`^yP*HC;77Zl75r$wL|ch=?FZmT+wVj0qwTIIih0RY z!(5bS_RY@puf%IS#Pe0zf{WwvL8Lh;Gmp)o_;)P+ttm$wkY`4hypy~1IyJZRLjO|Z z#6DvVKju)pJ*RljM;inGXv_y=e3!hdtcf`pp5r`FVFZA>6#qP!S07;9PJdB@$Ma4$ zNksozbT$1V9$$slp|Msv{Y^k0cWFF+I&60OJ(Ell(Ee8ZD_ateUqV|Q8|r;_zX86D zSH|O4qTA`WmN@bQ=Nc#4$(^fMQ^Z#;vSaUaFCGgj*lj-A(_|17NQ{Gv*t z|MyP+gXsS|`h!XR6P^B-(Vv5T0Pk_T_@_AiJJEk4`uSUXj(pE9v61#=BL>~Ee_WQt zzu4hF68*L44=436bNVNv|1ap5?~6FO^r-X)z*C9-5cZ=t-TLY07ZQHvp2)qb)=lG? z@7Tz_vi{fc_HE329&uYdJ}-&C%;C?&I#GxISW^EEr@sLGW3e~( zMouMs*xe!leOQeCop1{u=aujsA4}E7AY_@6z+HLqC7Is0O*5@c+fKr_lc`=zk8iM7sW6 z=$f#F76L`n#f@OUJ(*{m-I59sgeRx1bKZDoOtpj{bhACr3OVkH44H|7WLv zEc$n$|K_Cr8=e01(ODF^^0%YE?+fvGW|Dl%k-r!H){E)+`=K7b2K^h8rsz~lK86~{_W_00sYxYicy3W6}RF^iOfmWlzxA3(iOX0M!4NCfT>pvF}p!Uxxm4`Ee`yvvF=n$Nv=i z=b=9pKUMzp_mc;H^1x3X_{jr5dEh4x{J-OYm4lStLfx_y;a?lhA^fx9uiL?X)ad-n zR*hi<)CF$w$=~2xRNGs_>)uxveKm~IR{r|vcD?Rr-OfL||6kw5@l(#Y$Hwy%{%|~$ zzZR`nn`K0GKT0O~o2%_Z2_k>JblXF>cB9#h=-(8Er4s)JYXiC~(9q(Ho*G_yfV!~p z_i4el-P<%BN?7@`_5UZX#sj2~ey8C*T2WlXwq3h4JW}_6-L7AY|G(Ze>3FqQJR+bl zC+l{)Zs+KBfo`wT?P}fLtJ}wQyG6He>-J;aex=)tgAMsRK(~W*J3_Z7>vp2`!}PuA^p-OkbN0^MGv+ts?gSGSMr zc8hM`*6qi-{YtkPhiLt}9i-b4x;-H<% zW*n;Z>voWCN9gus-A>o-9NjL^?Nz#6t=oHb`?zkm==N>heyrQCbel0y>(}id-Hy=h z$-14c+c~;jpxdi-yIQwO8rGQ))zv8zCyovbKIQajLjuE(8Fuur;en$Ijy|SfWWjLb zNKjZpr6&8$dg+wM2(}zotLS;yQ}k~RQJoJS<|1-kD*BpZZTid4RGq&Kx`Tn;guc9hsc(3-L=kNo@izweqkl}qFW_X77rF8F~dA+9ha$e8i_04^G z?V~^lKO2&|@j7QYI=6X;`-5<+RfLt)drT(HG^}Cx@Q%n@hsJMB%LH(|0C^S{Sno&y zdRb?80WeB{fK}xMFj|1YRz5^~#|ThheN3LQ0*tf@q0Bo@fI@4c4?v*+L2D{DG4FT* zimeiO!aG5L8P*&u=iZYJCl8{mx%(Ud^Q@0J_@G!_W8F@-O%fnv<-keaQ#-E# z^&)FBl}^cLM3-7`k>~W>833-den)9%_%8-QgVhyZ4fmdz`wIXotgaMrPR`vRSZUQ$ zzw;i6S}3^0&qNyZNA`%V5~x zyBb$QcsDMDu$$p~3e??+@G;2UAHqk!JD@#pbr)WHpFn>`uWlu1ynN1((Wm=jUjGet zWc2NR4X%-`7Ce^e_iaJb^)ye!Cy`9Y~L7#25;yS1EWw7jW!`qu$pYVJIC}%7f zvNQMQ-9;5gKt|@by{O;t-;d{ynTFY=g~Rdxa|j@hnZsv4ej|%)nLg7~3DPVt49oPJ z`P1V)av|Oh`6lt zqxf86WId0@f2GIM3mjQvz?^k}*>5g@E(Cn%;;QSx&_cPLCcgs}okyX_y4)Or*c;|F zT$|=|kZzf)V1&oK96C(%9Kj3*xyKv{6<*T=AwKgjn9~{Nleo?_$AdD{{0lVr&6OBp zmias|oy=R%+Zn&z&cJK{KF53$pIyu*U~;5L6It9$h z@ZG`YQdly;tj6^rW*DD`ns?!Ipm{cE2AQwm`Y`hod=55EjCY8+0&)&F@5JX3<~5)> z(wqyQ3^h-OtA?3Z;qxdHLo^D^_2?aL{vDJ@n-?M9jxoIXaA>Dho}Z)Vpx$6x*2!5w4jD*#lnzXnq6n zhFJjVrnw5&mU%S1;W5iF6t8(L;_fr=kchu75pTk^-@Fc=S)H$j$1vF*hq>9OdVT?M zIR`^fUiPd!69m@BP?cTQjd~1gJax{==My`>;U!)6JkPu284I<8b7FZHk>@S=Gw0K; zTzAx#ozo_O-YUHAIFRlZ?^@=3E@Zv@{E3hppPJMGOk)Vo$w2Bt zc;I(XzShj?Z05bgIU~BVO{L6l9u3MI#pp*jpf0K}&wnD-<(l2OhV=6H!)H#O*_|;v z)PEfOlG9c3-RB?K6;QsJNB2MIIqpE_wU}98dfH%1cSU%t=?TH=9!kMT(-Xkx4lr}q zL3E+%`3y39s=lDU8#FJ3tCzF+EEKkHg+Xx|{aS9HVm^}WaQ`bo@5 z>jrhrde>Uh`wHS&?^-wamFv;HaJ{yVT;GV9KWiaR zuWo!@#LrsD)2DkquUQLu`gUJ|>u%$5<0Q}P_ZOPL?SK*9F4>#WVR+)WQ{c_*+CmPa zYcKTs>1^NIJ%ecA2o_No7K^B(ye0VT%Tmh6k!M`h0@#vT%92{jl3L1=TFR1I%92{j zl3L1=TFR1I%92{jl3L1=TFR1I%92{Dx2mQ5tfexZ@RXzJCbd+?-n?!Iu7|Z$#<#tw z-|(@P%0Mk;0P^~{H)Wuf+Kn#1kxjM?)Kc5g*_FK6ET}S2Q1KMgw;G<2f+}<1d?w(N zxnQ$?g?VpUf28-V%~(}E)?!?Ht=n-Q$7j8XdOO4LcgGT!In;AB*!unl3`$JhtrYW5 z5pz01Z(0*zo@Mwi3xMQO&tj4v4GD_;_op#??nlfG>v7!fGOc>X-|B`>uT>2deyaw; z@~jVV9k3<>Uuab!YD>G!g+vVdIyP39+b|Nu^-~b-0 zLoFRpfdl}fG2le@!nOe?$^9v>F<^*bkU80Y$jK}>J@>)hgBD|W-7}Y)55idA)o?}T zRm$CluNp>YUS~W1YC`uZ$nQG@uFL$Bg0g+zknec~5RCBz>D0DYq%zi%i!n)#iAAc=gLUXSN#N+Rp)=h}aQX~6Ny7~o==N`(u1u|q#{>3v4>D~JtB*^7fkx0H1`b;Z~ zwcYC78~Dq5560&bBm15JBz)!Zd<_Zy-bfh#!3UlK?jF4Mj=`0GCG=*E2wZ^cZoIC^ z`kDV=?C_p#h+ft?owvhu!}BC$XPw{uZtPor&pqt9F#AaWd7hyJW@f(tpqJ-*gfweb z_Fn-6JR>o#tnveRBVw>;5`nqd2LLGWyh@&m>_GrVdj5&QW?h^;20)=FhV0C$>Uj=; zpl2;jtI4hcQ0&=?F=o|fUj|@?=Tn*!%Dw@>OwSmMHEUt^eE{YeeJ{w@zRwy}jA2-( zBSQ_V5HzOsJ|=->l|!u8>IqGL!#@!-CF?{FN9=zC&d-|AZyv6D@Y=rzUdlQtZ!r+w z%kYtN8$L|=xRX~*5|dg?@sgM6=RF^=|7?mnIqwl%d)MP5N6O&@r_lS4CDo*ZSf}>j zwf_tH@3g#6$@T@=vfxRjP_B3~(Yh$mTZpOS_hW=vQ}X(w&wD67az-UHDP2Ptfa3l| z=>@dYk zbdce_pGanjAPw)+gqbLc=(j@jD&WIpqzI5osu#HpL^Asl zE-}1o0B4VZj7~T%ZvfDPfd6oKvhyu{TY%{L46#J`haxXK-A=PP`e@}Z(Y zQvZ?2+sT!I5%R%h%{vJ$yc{G=0BYW~q*e83-+1!$|xg}?F zOU~w&oXsscn_F@=x8!VY$=TeJv$-W_b4$+VmYmHkIh$K7`m!uJn_F@=x8!VY$=TeJ zv$-W_b4$+VmYmHkIh$K@Hn+whzTGW3n_F@=x8!VY$=TeJv$-W_b4$+VmYmHkIh$K@ zHn-$#Ze?Sg3s`bCx8!VY$=TeJv$-W_b4$+VmYmHkIh$K@Hn-$#Zpqo)x(0HNwB&4V zoeqZ%v#!GDQ5K3?qrj50xg}?FOP$UAJey~)@)W@D>TI6vH(!CjrB=zt(R?>JjRGFc zvvD+Mm)GdWh`f(~{e$T2Z)Edmo{gjVUBGo^ho9&3oceqNO*c88=UkU}2#RSBYoMI# zl~@nY=Q%fYWe22w0mfr+sipeKmvf`%KNL!QUmnsWC%O#039u!nbgKYSG%Y!$TSsFY z9!pN?mYmY9JCN!bmYmWpIi*{2O7E>s>3*KlyPWDd3F5lRDZR_Ayq5rYcuMb5){S}$ z54XfFbMjf*Vd*7ZmwBGM$Rnrp+*sbRAouX(ocpQV&@&(xK$`%54^Qd2JEaWF^YE0O z`&m{62)cWCO3(dV$a?wSBo9vMbXx!gBAQ&B(%%8iV0B9GZ2pE5Lp0%x&iP{act+2~ z8J%o?Xaa;YI{Wf`Jfr90jL!P9myc)kT%6GvqeFc>qvzs`PQLqmJfr90j80cSn4!<; zG_t_V&}VcK9&2XkGddNFG&A%WeIOJRni=|x&c2|Tq0i{7bc)T46Cey{bh>ednW4|< z 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 Mqu}vb$q7XM2WbTQ!T +#include "../easypulse_core.h" + +int main(void) { + // Query the total number of PulseAudio devices + uint32_t total_devices = get_output_device_count(); + + printf("Total sound devices in this computer:%lu\n", (unsigned long) total_devices); + printf("Available PulseAudio sound devices:\n"); + + pa_sink_info **sink_info = get_available_output_devices(); + if (!sink_info) { + fprintf(stderr, "Error: Could not retrieve sound device information.\n"); + return 1; + } + + for (uint32_t i = 0; i < total_devices; i++) { + if (!sink_info[i]) { + fprintf(stderr, "Error: sound device information at index %u is NULL.\n", i); + continue; + } + + // Display sink name + printf("\n- Sound device name: %s\n", sink_info[i]->name ? sink_info[i]->name : "NULL"); + printf("\n- Sound device description: %s\n", sink_info[i]->description ? sink_info[i]->description : "NULL"); + + // Query and display the number of profiles + uint32_t profile_count = get_profile_count(i); + printf(" - Number of profiles: %u\n", profile_count); + + // Get and display the ALSA name + const char *alsa_name = get_alsa_output_name(sink_info[i]->name); + const char *alsa_id = get_alsa_output_id(sink_info[i]->name); + int sample_rate = get_output_sample_rate(alsa_id, sink_info[i]); + + printf(" - Sample rate: %i\n", sample_rate); + printf("\n- Alsa ID is: %s\n", alsa_id ? alsa_id : "NULL"); + + if (alsa_name) { + printf(" - ALSA name: %s\n", alsa_name); + } else { + printf(" - No corresponding ALSA name found.\n"); + } + // Get and display the minimum and maximum channels + int min_channels = get_min_output_channels(alsa_id, sink_info[i]); + int max_channels = get_max_output_channels(alsa_id, sink_info[i]); + + if(min_channels > 0) printf(" - Minimum channels: %d\n", min_channels); + if(max_channels > 0) printf(" - Maximum channels: %d\n", max_channels); + free((char *)alsa_name); // Free the memory allocated for alsa_name + } + + delete_output_devices(sink_info); + return 0; +} diff --git a/v-0.12/examples/mute_input_demo b/v-0.12/examples/mute_input_demo new file mode 100755 index 0000000000000000000000000000000000000000..aed313f8326ef2a038a66786b41ed3fa51120b1f GIT binary patch literal 121024 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 I0F!lp0As&r +#include +#include "../easypulse_core.h" +#include "../system_query.h" + + +int main() { + // Initialize the PulseAudio manager + pulseaudio_manager *manager = manager_create(); + if (!manager) { + fprintf(stderr, "Failed to create the PulseAudio manager.\n"); + return 1; + } + + // Display available input devices + printf("\n***TOGGLING MUTE / UNMUTE FOR INPUT DEVICES DEMO***\n\nAvailable input devices:\n"); + for (uint32_t i = 0; i < manager->input_count; i++) { + const char *device_name = manager->inputs[i].name; + int is_muted = get_muted_input_status(manager->inputs[i].code); + printf("%d: %s (muted: %s)\n", (i+1), device_name, is_muted == true ? "yes" : "no"); + } + + // Ask the user for the device index to toggle mute state + printf("\nEnter the index of the device you want to toggle the mute state for: "); + uint32_t index; + if (scanf("%u", &index) != 1) { + fprintf(stderr, "Invalid input.\n"); + manager_cleanup(manager); + return 1; + } + + // Check if the index is within range + if ((index - 1) > manager->input_count) { + fprintf(stderr, "Index out of range.\n"); + manager_cleanup(manager); + return 1; + } + + // Get the current mute state + int current_mute_state = get_muted_input_status(manager->inputs[index-1].code); + if (current_mute_state == -1) { + fprintf(stderr, "Error getting the current mute state.\n"); + manager_cleanup(manager); + return 1; + } + + // Toggle the mute state of the selected source + int new_mute_state = !current_mute_state; + if (manager_toggle_input_mute(manager, (index-1), new_mute_state) != 0) { + fprintf(stderr, "Failed to toggle the mute state.\n"); + manager_cleanup(manager); + return 1; + } + + printf("The mute state of '%s' has been %s.\n", manager->inputs[index-1].name, new_mute_state ? "muted" : "unmuted"); + + // Clean up + manager_cleanup(manager); + return 0; +} diff --git a/v-0.12/examples/mute_output_demo b/v-0.12/examples/mute_output_demo new file mode 100755 index 0000000000000000000000000000000000000000..de70d9c129051b030ee8abc1f919a8c25770e36a GIT binary patch literal 121024 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 +#include +#include "../easypulse_core.h" +#include "../system_query.h" + +// Forward declaration of the toggle_output_mute function +int toggle_output_mute(pulseaudio_manager *manager, uint32_t index, int state); + +int main() { + // Initialize the PulseAudio manager + pulseaudio_manager *manager = manager_create(); + if (!manager) { + fprintf(stderr, "Failed to create the PulseAudio manager.\n"); + return 1; + } + + // Display available output devices + printf("\n***TOGGLING MUTE / UNMUTE DEMO***\n\nAvailable output devices:\n"); + for (uint32_t i = 0; i < manager->output_count; i++) { + const char *device_name = manager->outputs[i].name; + int is_muted = get_muted_output_status(manager->outputs[i].code); + printf("%d: %s (muted: %s)\n", (i+1), device_name, is_muted == true ? "yes" : "no"); + } + + // Ask the user for the device index to toggle mute state + printf("\nEnter the index of the device you want to toggle the mute state for: "); + uint32_t index; + if (scanf("%u", &index) != 1) { + fprintf(stderr, "Invalid input.\n"); + manager_cleanup(manager); + return 1; + } + + // Check if the index is within range + if ((index - 1) >= manager->output_count) { + fprintf(stderr, "Index out of range.\n"); + manager_cleanup(manager); + return 1; + } + + // Get the current mute state + int current_mute_state = get_muted_output_status(manager->outputs[index-1].code); + if (current_mute_state == -1) { + fprintf(stderr, "Error getting the current mute state.\n"); + manager_cleanup(manager); + return 1; + } + + // Toggle the mute state of the selected sink + int new_mute_state = !current_mute_state; + if (manager_toggle_output_mute(manager, (index - 1), new_mute_state) != 0) { + fprintf(stderr, "Failed to toggle the mute state.\n"); + manager_cleanup(manager); + return 1; + } + + printf("The mute state of '%s' has been %s.\n", manager->outputs[index-1].name, new_mute_state ? "muted" : "unmuted"); + + // Clean up + manager_cleanup(manager); + return 0; +} diff --git a/v-0.12/examples/print-input-sources b/v-0.12/examples/print-input-sources new file mode 100755 index 0000000000000000000000000000000000000000..dbaed0143058597ee758efd68824efe9b848e622 GIT binary patch literal 122136 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

    wiW^g)Wc(@X9$gL4oh>F~Jp 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 +#include +#include "../easypulse_core.h" +#include "../system_query.h" + + +int main() { + // Initialize the PulseAudio manager + pulseaudio_manager *manager = manager_create(); + if (!manager) { + fprintf(stderr, "Failed to create the PulseAudio manager.\n"); + return 1; + } + + // Display available input devices + printf("\n***TOGGLING MUTE / UNMUTE FOR INPUT DEVICES DEMO***\n\nAvailable input devices:\n"); + for (uint32_t i = 0; i < manager->input_count; i++) { + const char *device_name = manager->inputs[i].name; + int is_muted = get_muted_input_status(manager->inputs[i].code); + printf("%d: %s (muted: %s)\n", (i+1), device_name, is_muted == true ? "yes" : "no"); + } + + // Ask the user for the device index to toggle mute state + printf("\nEnter the index of the device you want to toggle the mute state for: "); + uint32_t index; + if (scanf("%u", &index) != 1) { + fprintf(stderr, "Invalid input.\n"); + manager_cleanup(manager); + return 1; + } + + // Check if the index is within range + if ((index - 1) > manager->input_count) { + fprintf(stderr, "Index out of range.\n"); + manager_cleanup(manager); + return 1; + } + + // Get the current mute state + int current_mute_state = get_muted_input_status(manager->inputs[index-1].code); + if (current_mute_state == -1) { + fprintf(stderr, "Error getting the current mute state.\n"); + manager_cleanup(manager); + return 1; + } + + // Toggle the mute state of the selected source + int new_mute_state = !current_mute_state; + if (manager_toggle_input_mute(manager, (index-1), new_mute_state) != 0) { + fprintf(stderr, "Failed to toggle the mute state.\n"); + manager_cleanup(manager); + return 1; + } + + printf("The mute state of '%s' has been %s.\n", manager->inputs[index-1].name, new_mute_state ? "muted" : "unmuted"); + + // Clean up + manager_cleanup(manager); + return 0; +} diff --git a/v-0.11/examples/mute_output_demo b/v-0.11/examples/mute_output_demo new file mode 100755 index 0000000000000000000000000000000000000000..b2a02f07e5fed938af59f48e53589761210b7800 GIT binary patch literal 118000 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 X5kIzpQ?_6Kbybt{!ri}wOY8pvvVytx literal 0 HcmV?d00001 diff --git a/v-0.11/examples/mute_output_demo.c b/v-0.11/examples/mute_output_demo.c new file mode 100644 index 0000000..e6b2066 --- /dev/null +++ b/v-0.11/examples/mute_output_demo.c @@ -0,0 +1,89 @@ +/** + * @file main.c + * @brief Demonstration program using PulseAudio to list output devices and toggle mute state. + * + * This program lists all available output devices (sinks) managed by PulseAudio, checks + * if they are currently muted, and allows the user to select a device to toggle its mute state. + * The program uses the `easypulse_core` library to interact with the PulseAudio server. + * + * Usage: + * Run the program, and it will display a list of available output devices along with their + * mute status. The user can then input the index of the device they wish to toggle. The program + * will then change the mute state of the selected device. + * + * @note This program is a simple demonstration and does not handle all edge cases and errors + * that could arise in a full-featured application. + * + * Example Output: + * ``` + * Available output devices: + * 0: Device 1 (Muted: No) + * 1: Device 2 (Muted: Yes) + * Enter the index of the device you want to toggle the mute state for: + * ``` + * + * @author Mbyte2 + * @date November 11, 2023 + */ +#include +#include +#include "../easypulse_core.h" +#include "../system_query.h" + +// Forward declaration of the toggle_output_mute function +int toggle_output_mute(pulseaudio_manager *manager, uint32_t index, int state); + +int main() { + // Initialize the PulseAudio manager + pulseaudio_manager *manager = manager_create(); + if (!manager) { + fprintf(stderr, "Failed to create the PulseAudio manager.\n"); + return 1; + } + + // Display available output devices + printf("\n***TOGGLING MUTE / UNMUTE DEMO***\n\nAvailable output devices:\n"); + for (uint32_t i = 0; i < manager->output_count; i++) { + const char *device_name = manager->outputs[i].name; + int is_muted = get_muted_output_status(manager->outputs[i].code); + printf("%d: %s (muted: %s)\n", (i+1), device_name, is_muted == true ? "yes" : "no"); + } + + // Ask the user for the device index to toggle mute state + printf("\nEnter the index of the device you want to toggle the mute state for: "); + uint32_t index; + if (scanf("%u", &index) != 1) { + fprintf(stderr, "Invalid input.\n"); + manager_cleanup(manager); + return 1; + } + + // Check if the index is within range + if ((index - 1) >= manager->output_count) { + fprintf(stderr, "Index out of range.\n"); + manager_cleanup(manager); + return 1; + } + + // Get the current mute state + int current_mute_state = get_muted_output_status(manager->outputs[index-1].code); + if (current_mute_state == -1) { + fprintf(stderr, "Error getting the current mute state.\n"); + manager_cleanup(manager); + return 1; + } + + // Toggle the mute state of the selected sink + int new_mute_state = !current_mute_state; + if (manager_toggle_output_mute(manager, (index - 1), new_mute_state) != 0) { + fprintf(stderr, "Failed to toggle the mute state.\n"); + manager_cleanup(manager); + return 1; + } + + printf("The mute state of '%s' has been %s.\n", manager->outputs[index-1].name, new_mute_state ? "muted" : "unmuted"); + + // Clean up + manager_cleanup(manager); + return 0; +} diff --git a/v-0.11/examples/print-input-sources b/v-0.11/examples/print-input-sources new file mode 100755 index 0000000000000000000000000000000000000000..e3a2f8509ed26b8f5c6bc63efbb9f7cd7d44e26b GIT binary patch literal 119112 zcmeFa34B!5`8R&=otaER60#8pi!dUa3lI-~q5&n1 zQBYB|)>5?-c(1u;wt+QmkM4!sRiei^Wrh-||$J+oe_ypwY zl%p?FuwAW9&)Dj!xf3Uhtu7l~T~*V#X!N2<6Gu;+ zFs7k)%y^+wuYCN`eJ7qa)3BBrZN%C2O~Vv81vq{z4cm0`_Q4;`&iZdw{p_*Ot24iU zBHVEGhwpE_t@&KDf;{X8>yU>Z;`nEOsQ&r*BahgJH(p~XaTnlk{uQ@fHu{ygQ10XCO{?P>ZX$j=q3uWWUX-*(#5A=`6|3w1%=`dhC{$v;?9)4p2eP$%! z{|XL{C+Erp_`d=_G>$zPyz%4|B*34UpkK2R@RudfXKDg__Df)g$qD3Nlz{&?3G{q3 zft|?k0)sNsRVZ8Ivc=W_s_ct_)kip{~r?Qc~=5`<|p94JAwSd1ajU@V23Lb z=nr(<{vMV9{}}M`=GC_o=<{TPew8H9Ctdh^8_gq>2bM!FKeqv&W%M`NK2)%sw;IL8 z^A^O;lFM)65APAx7guP>ih)etJLpKe`y}86|V8%M~pyrLLqnR9RnM zQdVA8yr872rnd+a)yyMPPl;7E8X2G55UQ<#Wm#@yTJxLYmHuz?C@71h)P1`@#Ra)3O~UJ>6VUUoMU5PU&tI*HxD+?rs86HL6C8X?qIpW*)|+6Vnh9-<21aRK@rt zj&+>z6rB)$oawup6%kugYc$l971xz6D6YJ?xUQtWWI+Q)21a>lX?a6~Lqtv3!Bve~vRERYzl${ooFW^{*w3oLEeZA>Jk^I^34#T6x0)dr^lXn~&9HC8v2^RywKPzh%Enlg3xz;5$yqA_Lq zSyPJh$4nlRUtc=Gfs7NUpLG1x;_+i9ICqCTcjH{h=n{B@GCRvC z(scV=(9Ua?jv$v|Y|!U^Ha_3Rcguq|Xt?ctRS!)W8R}N9TU_`dF8nqZe!2_4-G!g! z!gsjvXS?urUWQJ|d6PrxP*D0PLGF^D(NyV4v!eguGd;%^!+qOTW zI@BHI(-!t8zeC*-&p-P!sYBfnXWN>Xf(~94uYHC`IM~6f!uL|QaxLmm0Oh2rTe;5e zPyq31>Q=6EIut-W0?zqVcBot8dplUfjSJ5>wm*wH)E)V=Y$VF19SR`cowu)W;d2y= zTvxjAJeRaTYdX{&<>cB(lxsT_Kzv_yE7x@$3Lw6px|Qqt4h0aOr*7rCp+f=0_gA-a zZR=0~@dMPYT(@*6fcSyxR<7GR6hOTDuyeZ$e}H0Q7(MG3xBW+KgoqZ z#Dy<#;SY7;gDyPxiuR|-g&%DrQO*1u0vG-i7e461pX$OFx$vjC z@Uva`(_Q#EE_{&-U+Kc1;lkIs@MpU4i(L4#T==Cf{0tX(fYYmbZnhu5H1l=aQclg}aV; z0qCybFX5UoqyTq>D@luVbm24n8Nw#vZ31s3Y!Pk~_#whf=_2a|zK<|dxyV|9?TX>J>2rK9g_;;hjGKG5lo0Ou-@@0v}J9saIs1z()~g$`xr7 zcsyaIT9NevA3~TZR%ETfLkTmrimViP0AZ$7k);A>6YfX2PT*dInLJ%vw z_`9b7Gi8bt2>cacrb>}~fj=Y66e$uA_(Q@>jUt%>ze{*9VME~82oE8=^WW_M3xorN zI|P1)@PUN43A~Z;P{M5jKSY=*P-MNp_Yr356Imdr2s8DFtQB}D zVWu3Bl>!eS%v2+?RN!pFOfe#L0{0@!)FLuRV2dzQib#>b-#rPKsYIke;I9ZXg^1(} z{25`U4v~Ps9}+&6aHhcT68;%sL*Um4A4hoS_u_xT1%x{Ueugkpg2*<3HxfRcaGSsn z5oQVySugN?gt_!b)(U(lVJ`WRl>*;Jm`i-2z(V`F6ogX zfiEG&xkN|W1RhVAOLJtsz=sg#k{nqp@KC~BiX$rlb3PvT`AN;MUKnit zFxd3*&Y~HGw zfw%1X)Nkprt*C1>9zHYJbnGSIG=j~452XiNj;#Q`E4LD;a4BrH*;fXHdBL+$eV?s} z-e(LcFeooF54u)VMY5{>r4ZK`;K1+Zb38+ZvH2X_UV3wH*amh3bdM?>F# z{fU@O8wY{RM|?EM!HbD&4>w~P+aL?nKrBn)r{UY?!tE`E+nYCoE1Q`fEqk0FLYHBk@rTZ3%;!34o?C$Dv*s1WZ-P9!xwIDMnmDjk*7YaE> zgKZev&4ur^6uu|ySGw89lD%n3hY>m(Mc4=xq2&%Gx7N*=q?$!vsZoWS)cK9*i(2jB zFA>nnB<CWviX@`jM#5b|<2 zxe?^ph-oT($&By53Cwv-LmQ-$xq z(X`WC))tx^Z1IiKQn{$vQg>XeYCS=#K^AMRM6{|FQc*uV>o7JmbA9vilfv&}!c+Ih zkh`T|5_-LCCDJSnHn%-hrxm%E9&3I^NiE8hvIXI^yseSi+=eFDM=rs(HrHuw#<;Xu zh8#+1vn16XsQ*MISZqUk;ab!-B6oQ?rq;T~)CL(-NI%h~mb%QAnQMd1+k%@qJi&um zc)^;~G9|g$idPMt32J@gRvnZSYf**1^w)mcOYr{^X(a|WN0AK3cyQk-#>f6(E{EE@(IS##b zkW9}*u`!hC`F}(BNUY8>J^ybAe{fiw={ZhE%`Gw0a{><6^c~>N6G$mSE56MSh@wNfDf%?+p=RU+wbjf$a$kJiXYRPtWajP}daju}PBlF)9+8<# zW^Ng)%fH|(yH3xt$4o98dXXs%r8D22wCgu~x|PF-h)gUuG$p%}f?*h_jB z8LS48V4>Fg?3cY8Z_WL1J}o1=@8=`7l;e|?82AZt`r9&5``4e@+oyJ=8^nT(ZMUYs z&JCiB;qYS7NU4Hqhlpr`1<8_5#pY0{=+^SK#lu|<&30-)z4q|IcDtQtx|m9V?aXi? z>O0wm!Z4;sgvKW>O0t#*O4Dwu(XTx3lQRy-n##pZOST&s%jT%WVmnmkwk~7YS@4EF zQHhMiJ%oeEWDj9aS!Om^=(bYvg$^2qnvzWF!~GM24^ciIbg;A(Vo zH@i0t@>^!^2$sGU-1H$%vk={4@Jh7QRJel!Ibq$Ff}+WVJ1$$hHy)S|R&5XG?OXHN zqWKole5Yt$yAR2;TV~=Q?n7Tx?FW^c6RHe#Vk)Vb=u*^bD%`n`&d!-!xHIFbDxACR zOD%SIq{s}5Ov#JG8CPw^;kc@cm;#T-(N=O(JH~dg^X?eKoW3hzj6D^$g>n&$%O{Q9 zyl*~5kL>eH*cK3)eFIs9U+-;jZZe5A7-A;_f<*{Szkx%z&33rU` ziHWg9l4rNf+!GsPr~Zg$+?7;}^+T=%uenrux3@9Vjr`o{zv|iNjs!^#xOQRu$t*I| zi6sF`Ki0ZH4?k*kTgR}tc3`uCqtr^sz+xelYETJN+Um9ygOL&pJq|};!l6z`&%c{h zHf_vARXc;ZOgFd_!Z)CPS7ZU!^`<8&%UG16Zptp_x&8sVI-lp*)z8q?A9SjZLG_m9 zqELHyKAu$to0rdlFlfTUXdDAkuiXWv)nvl*eu2n{rs&VZF-nyW(Naammu+8V9I~7W zeU*`!TRe}rQCq&sxbOwQzOw;;m2u9duYwtewKXq4pE6sd#f(P_hGjgurDe6?T9?;> zq_T*I#k$LBJB;z~?2}Zz6*B89t2%q4}0ORr3e9 znlIPQ4~Y{&r@*q&$P6&YLu5A3H2$WjrYO@x_Lndr5(%0vgc zw3?=CRXDZwX`=7{8rMX8Rw|M8<4jbjm2p3>`%8&3(K~7ijG2dgz(q||U~gZVXTB6{ zKD7-7ZG+noM{1_!WLvniX~|2*;vC?1I+lLw1I&4KBsAhN508STvrY>)#f95i@^Rg6 zpN_&z42jgg>Han?*=>Xl0LN~kA9-K=7!_R#(G+}n7FeR_=|DRsq261X8=vbwVYU=* zfx;cAxJ6~*&-KWVTJX>gJG3QRj1c!Q;FBQ}N+Tcx;kkNFm^Zt zQG`GEvA5Plx_w+G4_I%CBezV;9p%WqmqxR-YncfxvBhkDHQ1W_Dbq#RZO?mRPAp5Z zG@;+JU)!`>%$czJIB`yP1gk0s;~fFzb7hQHOewAD?@BwI*u!UZ#BFL8nv$(j_c`!Y zM7HB9;>=auXcPi&@(MwjwU&P|O(GbSUI57hpv4TF2%DFWbJPKmPADu^{ z$A@Xn+@=j^&DuB=qjF4Ego^sPZScw+b@>R1CvShHXG+rQ>nlQ*ZvioUB5Fdfe2K;7 z+knCf%R<&8g}~;z(8Y{hq0+JVT2JulhVrpxCFKihgUtxCMajX(Yiq{fTW}Sq8bm56Dx%E}%C?(W9tPCD z{C+BcPy6!q`YzJTV(vpQxF*=L?0Ho!_dMvM$JROGmE{}A()1(?qw(OTCt1a84A@Py z<{lcYGNNadjAd&$X+WX3ySg?ScsBkNHQ_*;^bU1m*>ZEVJ)Z9xc%lGtLb;U-PZJw!=l`ABh*$(q8pI0TJ%%h(T3W_Ubn0kLn-}jkA`zeLgv2w zpe{`FPfB0$blk4q9)1quDO8Fyt7SR0X?`Zy>gzm@x^Bk9R;5TUva~37z<4jd71Jn* zYJQswt2XWK3iVQM7p0Pok}BLJm8ogrXf)Yvh~8Hc-20|gc8 z3)BmmYd54zW1W+p#>tcszL>pk^*yKQVQF2e*r?~7Dtb(I%U^TRO3d87z55!gUn}Z7 zS4~~q6v@hS3fs2dB?=t~>dqkN7F6&L0bYPTNPwsS?e)f>w1XkrZKm< zT8;@HG#Bn^TC&F*O2gF`O2Rd%k?)f=LPB)D0AqAH#OU|UVgt~DE5Moh{!rYXrtgQ~ z{&?P_FSkK;-3*RCIV|)%?P!)6epH<5>spN}Exz3>5Y8L~FYz9OV4%yeADyEl&w*az z>d0>)7R*lzb9?w=j?re{1|{x6Ee_{Iz9m}RAeXrHT3i;yf#nh{WIT+gqz9GsDiT_A z?+|v0m<*XReX~hu@twf}YO|eO5wdBcJ02G6cJ38l`m%+kJ^TWMsCGJ_RInxY+nYq3 zMS5%c&t$EZsdKGNJ-&BHhhaZp>n*+)Gon;TgqR%~lU$*}>gQ^n@vP3dNtEv#0n%}rG>_rC9s|fXT4Q`*7T-sm z4(bq65k^yRpQAbFN1JYBEPsEa>g_){I*~7HP{wb&?;U{rfbt9}5H9(E+#FebJI<<#XpWAS82m?082Z9D+N?UeELvz01grOFv#amGj= z;5rX(TJoN8d0$jN!cE&vbEKn*j+UYTirvkbjv4Zsm%P_)>eFZEc!g3zjD2hv|b z^&|-yA||Nsal}!$19NN4p~DW86Sdqylz<5f`>8g0%?wWo+98ct-z#|3;MBc= zbq|xFn)?X|F|}F;Sx>J8Eqn|kqS*t<&vfTe&mZ&voBS@s{h+E8`V8DG#`bZHlGu)EhtRIcM5NsJh z&-~j~pRDq5D1=#311;%atfT_*Dn2I_r)Gi~wrnjzW>*+)2IzXqn2C_v4egBZpFG^F z?P@99#dlnl;n8~6HX6^j04Gc)QRrU zmwBsSJw{)j{RVK0?-X!5qd(we5gE%qfYA2BJ(L}}2bY$@J=h^c-)0W$Crv6^hVF%o z#)d=Lgd8ev4%!?Cn0Bu%fqg72 zhkk93Q@yZMI|wc;XP_kx+#?W-_Q3u83^g|Xj)v93QUT7h$%(PaS_5@0_t^YW*ZPA~ zD<7N(k`v1jhRsLOBo+~S8rT6ipxtwqTjGNl)Iplfb> zocC(F`Q{(N`E8lOgK_$Z)A_cH;HI!w-ob|X!vB;e`DRP>aPzpWY{cF$NecVKOHpM{ zP|7||u4dHqola$2)7KTTW6_5%L8Yq<>-X49)GVEKY*02Z4+ zX2%$pNgMho=2In98o0Du1B`Yd%msnpcIcL*{0Y*X`IRG0a+Dt#7#C8ZZh zU!f-w@{xsfy~I?!z?e;H+`urlL~RihOXBR~X_lYp>?GS|E@z+F-ox3iz+|>Fw6k9# zmpFUw3h3RM{-@K}-KewAqiAjNFVTU$IlFjsRK9k0waBNlEy`Ds-!5%vXMd-JichcW z)_~*eMiAmS`(;S~$p5^_WV|^Gz|D9Ksxcb-AD^JskKhY~qtjmGq^2#gE z(r__enGOf^@X9UXJ!fs{?CzC$u2^zhIk#IS$15j+5XUQbqU$kU!H9GAzf3O{`7x<= z7<}i>*SO4;fzY23EY{eS>Fw<-H@QE^nD^!JTow9{DVYNun;ltUzC*jn4Ng~-r7}IX z=1vrs3d3SriHWj2g%}CG-E?*~#0Hyvsb~rceca?y=pOXY=}N%Kq2<8n7hvS59u0l% zQT;w%N1({D5UKVCSlI9#Mc;j3<|iD$JA*NM>=FmTq-L5H>Yge#YN78!8MPUh1kUN? zR1aHVUv9F0t~c3dKBK#-`}c4sgTr?yDmZ=Vo*B~Me17Qr`&F*)uY*PPUK2Y%=PZ;j zzrgkk>z&&6m&3G7#FwIvifY^c(UWKrvH!Q5-1a{Qd}99_&`Pk`*MgRzz%mwaBVQ?) z#Cw?7y*J(=^4h~Mu@=rh-1_c@7Vi8vARcS?9R?-pNWnSf>~Ss${pJvTfZt3Z2lu(BxzoK z47V@Mt@$XrP7yK zj4{PUyG)d^;5!mLuwXt5#MXG+zjp=uwrS%S)V6&ckdCy6>re~lXzjl5!Nd=O3RSiO zavX3i8WMEu+5K;x?mlCLM@PB^U5$fa(4D0fnS^$1McPlKa_!+y(TEDV#TYG;xs_E%h=I#FW1c(}Zx0WCN~G>aD>5dp_!Mx9uj}&v zE0MbrVjRPrC9ZcO_hYpDlOi`2mQEPCK` z6v8A+;W4;bJRJU>E{I0%W$0e8*|%f~UFKWJLPzdU-gk@K3W#ICJc?Qpxl_QzkBZz3 zK#l`mLql;QxATb}k=yV|x5$0OK`?S}y-X?MUaVGYMMguBZjpN*I~WtWv$cQ%C~AlP zO>@!S`miwG<4B4Dg^yZoWcH zSFoY)r7}W`__*7y=8e&mYm(Z6z6BI~1%;|Fl^$?E{_P34wcTC@v)fJHV_|B%iyi8g z8$RXQi+{bBz4$yaMr>~Q@Z)SCCO6DS4BNTk6s72BQIvb}XD@+vt?7d>ow&DWPf)a; zgNkskjPWm7Hcs713V%^wR|#JSa<>*ONfSv@lLuu#@6#!4}mWeY&~~eBF9tI_=z|+PSV< zJ1br740GDqO66l6F%pt&;XhN3xEuXaW;#j)w_ouq#TP;rv}-$U;IgYm}B=^o#=C}^mwZPN{zQY7dzc+mQdE++eHKDAui+Xa3X%6}0iyd!MA7ukE}9&>dhfIGb$7cMvPBY@-hZv~zPonh72J(80+A zUO>ZMg(!>QZnhKwFZ@a69yRg(F!fBT zLu%uPFj!UOA;Zi>H4xM{gjTsJ@;c}4%>|jZTIvzv&gP=zef1Y#Wx%lkcdxC>aL6MHTyqX_cr0LUit@l3L3r<5t=C5aYzR_#-fGPfkh zW#58+n4OvW>npoqWPE+)vgq3ZfpF$u?G)>0YTTdUAoy0w#0CcArj18IPdh`pQ)UXh z&%t0}2O=-w@-$O~@aBhUWOz*8=+s}1#CJu-nCiP003fnG{EG*{+T!!F1x{D3=@0yy zm8EloC2ZL-wI8Vc3xDij2kUm80VM2z9^)Hz-QtDc3e1Pp2kNy{*<}>|K*8hIq%0Qo(;yC~dobS5_NyPF$#g(Kv2znXB!dp3fZXa<{uncS}?{OK6g&%4kS zHKzDrX19TNgE*D)J(9xR>T4No@JhW#bD`VKub4GGGpgl;mHGvWc<&)NFCVPBNVR?l ztYbT=QMW#vhQ#|WU~vZC8E{hMI^;6;%Ll$cfZUS%Ag;~MR}|Z6Y`DgErn_z~>z;|a zExA{*l5Z)llb^}BiUHo@s|VE7mW(Iq>b3EX=yP4)$)M?B{Huq=5&FF{zCiKkI@O1< z5M%e@1Du1Fi{IlK^%_qko%5?jAh8FB zxq7ezLzzZRlOC`+^_09`wGE&pcP#~{-$}vU8n2MXr-I3MDVcJYkjaS|wl3o2`0U#n z)%@YE=6|W1Z-pSdM}^va@xnI|H?gm1gcokNN0^?O9&-?!nQqs@ky|+dvq%fihj2AB z$zzLl--}@8r`@;JxqDXMLDo{-ZX_L(&~W%BQ>YXQnvmffU9a}1wTG{Iz>e07IC=1^H1^L5%uy2@QW?C5;w3v01$lO% zm)7IJ&{FtZaLrRVuM}ya`=lFsYULu+VdpvD{*EC57}7q+y&58WP!YdXg{u*Hj6%TC zf|mvHW%Z_KlCcCOgMAEot&y#1Z;}^lHcp=hWl>m>n9hTr?u+{(4;*ws=a58H)Sm-o zKyEGS!dr^q=FbpfQg08RXlu+_1@MtJjQd0F9&{etRQMiV&w20Y!sjxsJr--L(`gJj zOjS_}d_&`C3v{Y`d|SkRGc3lT-@M+dqkC{|64e0PKk!dIjy={L>wJ{k;hsx)21nLn>?-W;+-6 z(u4oNp(9-N2dI0OL+v+a!iT(O`%aI}`3{24EUHw_bdS!Lj!@40*s*JY8l8BsZ!3^hSb4)#^WMZ*=&khPG{1o3ZAi%+3)^n-kTc-u;;3 z@~MSdGk0R`#(gxi=2Emhe8aYGetF$N&@US*lwYu2bp}~zg7V9BJ6a-p@k<&e;s3jS z$%QRr{qp*6rH!B9m&L#Nul@2C)cJ4xasdt0-7lDWyKm(sMOc*14ek~C>3M)a#&vjY z8FA|yUGB;pcETi`mm!+Df9r^s@ph;zRlYJR_lU7xPG4d+=$OO#-4<}EHQ*z$H$xF@ z^6OR)mbuyvv2E8+4g{K)>67|Jh_FU^F`A21l@!Y?R{eePb zppcU|{sTSx&)uJj(Gcf+rn~z;7PGnC|Il1l+l_3yyZaA?6=K|9?I7s>Ga!KOcTY2) z=M#rtCxpBh_s<}+cK;-GFYZs%Lfq~TY9VVKAyN0=erI?0zfhvoaBt&(t0i1$OAz;O zBWFDK`@6Y+(hKq3|0Vd;Qk%g2LDvs-sDzVW{u-qF`hs7}7q!hy=)uHpAn zGypq}2HEXh-<~-xuRRT8tc(f5?q8D&&qG&Y_6+MB1hfBEh@%e=bd8;@V~J}IALs=8 zT&%}oa4`Kxo`CP#wWga)7}bVv(pr~KLcKXMSpTan=o?6v^joHL~K5ZdOt4F zpoa?bVBZRNnxUY}qq%BCNHa1~$^` zC%5Hp@+guY0vXS9fp4ZMJMjH$bDMls#3upm8w!%n+S-4`-uN*aDrAr+?mv zYT###>VJ*zMNx=LHQ%j3IJOFK&yOEA36FqfW4t-fLC~AiQHcWx>y49Z)s0r(>_E4a zH)nx!yl}RM@B1Y>+wL0zke_zn0s0QVUV=`CA14;?c$}zDUq4f>cGjj};C(WP`{;a^ zwoD7Vdse<@_GfTCB?1v$DwG@>2``QHv>PZ)91 zk8lljZ}DC1mUyA?cvMNx*TlC3y5I;3z;#bv1a?;*Y`}lu>YXHZr8E~!6^3G z&(&I1zAdYBs%ry+d5(R)krjFR!FLGcczo#(v=)B05j^Y~k1&3xlCan1Y}uq8CJ9i=h` zxHPw(qx1~8!Xbingnm7cb{a!geC1hw`YT<+T0QFGvoK!`sylWaw>Jm(XgNo>Jk-_l zExP4`#soxbYH7B zb?fVW4uU#ge|FEl{sNgOy?>CSbI-n>t?Rk_8r1bV5q}B$S}u?3+QVPp9NX9Sr{nfD zqkCWD&he31u28st4MOKQJK9iU-H_RsTN!mm(hR9MEwuAYERXHs=TR-1XYSL!G2Yk5 zI#0v#;oay+OmIzx7ZrjA9}HEy&*b$;i>bmxP(fB1{uTlk6TFWtT4AAzrk(05$&v$o zaFaG7ADYS!C+%dVOP>Oos~ct~{=5@YOGuN~VXuSTfkvWG81Cc`JINZD2duQ*Jqf*j zb+=fHYyYa5F8dz_g;|Aze+q4P2Jf80UP{&&n!_CLxsNXL&<_8$)w zy4n8^DohjD|3O$MXg{=$+W-3}65GEws`Rw~8aOhp{WCz&v3TWJAzL1iYY{w@KAOS zzpq2dp#Y@t4td$R;MC#t%8jfpje}EkP(Q$wCB$0v0uG*JBhqeTK9o-M2OW%u5+klpz>ER9DAz9AS{+XV8AVa+jtFb*^ z;|@4K)1x_#IXV=IN;&4B5S}B6O#3H%Rt{%pWnivZDHBYg=6LE@Y6hni0S|M9p$W{z zf`)Ap1XUCQ_$pz7X6abx@Rh-q)ikW`neC$R44R22iYe$k>Ix6)KCucjsnqR0n4bY< z>$A?kkLdi1h){0-XTJsZTVTHh_FG`T1@>EDzXkSNV7~?STVTHh_FG`T1^$0#0n@NV z<7p*T)#YV@P;Fpdc_>g-Q`Z;@l$9^6DlKp5Wt`TyU~YMRptd5Ga8zJ;V=p5xI&hM( zpCIhO9VN)3#_ERhlE$*C+Q3OCfE9AU>cZBPEGT#IXO%3dt1b_mSrQ@+ry`dK`;_X2 zl0XcjV5-VgMZ*XL0_PogL11Q0$y`*2`W00*Wr32KK#5%wKp8aP%e(k!{uz~34FUXL zS6@39H5Ug;0{Crat?%gC8ekSy)rT5OsAQa`dk_c)K!-(o?B8n-(6EhitUqq z_gmtN>bUf2K-`5Y%L65)p{j-D0j&&-KW*mp>00shL+E7?nSITz>w+w*RKqHddDfYHCA)`tneHRXKXpP*pP@ovA>KqF2gf z2uvA7ZcRfa^&zJ{bg8zkyuKtD1#?K)e_?s4QuuWhU^rD@a*rET6#g8j?v_V2Rm zUt=HMFjjt+y=oqRw!Is%{!ruMLk-=`=mwd*M#D?x@o<4-1H;RDjO)g_GLAo2IP*u~ ztL8N-XJaC(F7IWWclMMsPdn+f6EASjoTZq45Lt7}5nK%n7sO*pW2klk!lV@Q45qV& zKz(g(XpB)*U0%}Q@VQ$_axAat=VI0xyZJd^sLweCs@z#Hyn$B3nxQ`eA5&9XGa3_CRn5Er!n_f)M7@l$ zI!Hy-{0#Owq44;bu-57Jps_>6J$Urgx1gk|rnxb+bN_Vsu*IhE`Yjr(%_o?p#`;p41<`UH3$EfP&gSdA24;6{}UE5XF--ja1Z0G>ToqHQ+BZoJPj2UTqj4>@J zk?buHT3n~cl8dHRSq>kpb83vbs5;=)JR2RsE{>i9mkGRHVq(XgZi)+f%y8|Yy7HSE z48?V|^&t$GidwopYB47a-3h#HDUKVhy3RL$+^nngtt~BWtgpxFe{m((7<;qQ=;2GwUXRBamA5|#r#LLDE3v-?Xdh$s>kW?+{Mn~ z@gv5Bw6FEodBT4rAbx$>ko>6r+iPV5W($lfr06B~u8GN}of$fDbgJ6S+aXX}Bl89G zESU+qFLUwjBkKJ)2PJ4vR)TmfMoo^%A!gSlqnA@@bZ}t-iSoOqt)D)A%Ig>6;K(%* zMdionqgFEVb<;@vsrOmMwLE7^Xr~x0qwQ4SAKt3uK@Zb#m4u?7BG*PH6xn?=qF&*d zXP$oMVUm1u6I^B|T-fJ?8j;G+z2K-ox5>GzQFbg<$VXM~Gul~plpb*e{Wz8EXpOsV zmdv83zG`s)M0Isu>#RG-Yn@m}-<@F*k1radE>7`7%xorup%{an+w`AkhNvD~Ut_0} zpCI3k7cGbr;(w-~jyKg$cl94LC++Mb7XSLtqNrpNW>Ur7_@9ctN%z>Vx z*W#G?EZpy@>gsv}_tmvsT~DAauj}gCgYvWbuC75I!+7zEuC4-%|ZFVm0ev+ zQI5K%t7|RF`%t!_v{rO=b)bwi(^^m;#J8^-=yDv!-)9(i;$5)-%6su5-w7x$z}t9bC^PU%;xd$Hqr97Rl+U5O1FwpH zjB*fOzx5^=#&1v#LwO-y<2?c8IK0eViSjOdgJA{AJMQS}T8Hx1Uv+hDL22SUD`AwM zp-lE0h6i7M8ijHvzCjj5c{RRBSc!5FzD~RX<)$50>TMR=z#jPj_*Q9s2n&fSRmC_h0N zMES;(U0u~E4}Q9<>spknP~MO761-pg63SEX68BD&gP!Z^>Vy5uBlt?i1eE+e=@}>w zz?YIjC{Nki)pZlfLHHWjBPdUP5&lQH4dpJB_u(skeNwSM|1;{N{0GVzC=YlA^-;cv z@+Opx+fX0nWv`+>$`P-jKFW_!_DO@kUPpbDZ=;-n^4T{~ALSq3M17P8y@mQH$G(mF zDDOhKi}dZNpKcg^biA9FoN1VgGR=W${^XT-;gNWLsbF1oSJw#goZ!!7F${nBin9@z z*VR>rI52u=PV1d_az^UK$xDsn1{{6J;lqXkD|PYh6{BPU-cdxH8&i5`UTsZHPx36a z(1Z~H>N5OouI=jj0Qxxe!X}UB?KHB8jI|&&UDm~aku1t%t#s&ZK<@_qH0bQe@SJ3l zf%(iL_ zKXlrk1N;ZeySngo6PNs1PW`2z54sw$8AE^8p|1t~InWc;Zv(w+FZDY>zXx+iqWXM{ z^&#l;F0O4K>tUz;0O*%s&iNhWIQH@U*6CjX=swIriR8}#y#RFnnnbkzOsO9LYANNn zbanYLCq?O&R}=t>KD-+|7hI1x#=XO1{lU@kIne(BI=>1RrT^Zce++sP=DA=DeX2wE zVm|#H=x4^zPj%?SK>sV~{B=P`zGtUngA+i12(S8H9#em@Q@;%KOuR?i97A8`(3gR} z7HI==Su zd5r#HNB?!8uf>{ja}0fzL*D{=U#u~S=wZ;W#hUYCjDDLP{gN?19Eq=Bz7#`mcj%)) z{|NL?V(1?@^dRW>-ibLkhJL+6uLS)7taUqL^#9b+e+B3ftbs4b)ZgmVUkCavze!ww z3+ScyB(5I@Jqv4T9pWHr|M?y^K>H_SO)mLeV)`i1AH**K?Tpc{)6p*o`jvmco8K|? z=Nx(^=!dLFt`XD!fzkexj^D+)Hm3eHQa=FPI?!(h{R?;ea14AbAtZfx2|RPK-p`C_ zqsVDv2k5K+m^g;hkXQT_^ms8$9S#Hiw~uypz3P@v9onS{gFHpxISV;PA|Bd01RewV z#u~RA&y9|rH-WzBPl@S|fW8yo{@^!*9bZ~6IktWS^j{;7851M_U`PHg(Eot%t0b!5 z2W#&fP>t_?!-v#Z0_oMGDiLeM}7$OcF-@0p*K48n?OIXJu&?e&@TmjM@;=so%(Npej@VF zMD$&t=O8}~#ni8L>i0o@IuG=;nEv~t{RjOl>SmyZvDJ{z09|g-bnXNBvFZQ%p$oq;Z5TY`=Lg$$ z`E1Y)Yc&j>2j7XD|ER~msjiZW?lYPmyhalvo7D#2j7XD|ER~msjiZW?lYP zmyhalvo7D#GpLwLYEVDIZcC>bU90x6}nug%d2&%q~HgEKU8-oPMvyGVAP4H%{(|T?(i|=$BYY%&mVty{-peI z#$n*Fgi8(b<`JrjJjPMCF;~TZCuStY-}_)iep-i63^M@5{~msrQStxzWW{mTwCH!=;Jm;l&nt7W+u-@v&pI-4N`wLAJUjNA`@{;{#@>7_o{FXlp)2iQ0 zY6Il`2%Me~{iucC@+F~x{$5{IO~~**g;~{eNZ%A#%! z?~(P^fxP$qk^E*-JA`NRK79ljw|mDW2Vqugh!^aK`|Ck4EPlJjJ27QFiezgF$lfCb z$h5p{ZIS?amcKWE$pQqd0tz@vfKk@RegH=ckZ)zP&M^W^vc6;AjuoK58sGy^AVAQ{ z!{X(gB0v$Iv;a6>fZ5jjP}F-u-x4S?$2yU^P3uzupwc>+x&=k+I%^@Nog_fW+C|FA zscXQ!$hwNaso7@$SZYmxDZQs<%m#3k^$ew*o;)86P1a*rCcI~4Tnb=?wVQR$NxvHm zE3H)o&g;imTVuUKMbGblJ%F{=4FoO_b=Fxaw84cbLDX4qJ>>yV+>5r{V1?L)Iig#e zRmaZFO}+^No-@3MfaLS{-vqt^1Ic!1@7~X&uJ3%%eMD!_UDPU*4hC`t?tAm!BJuG- zRqvOegYW0K6GlFl62=_E_XN4=-+_zKX6DVk@5R0M@4zPI<=~en4R0GFBxyjO#k`-7 z){_SIxfb_`(E_;5pX~b-Mb>SgFf{yE&w^&=O57Ue9IXDPIThx#%yF>2$K*dlw-l**jv3Udk7H2G-GH2XrDm3j!Sm#3Zx{1PLj zjuO81c>Ji5ax_>|`kI4g0q9L2i;u!7ve)!Yuxsk`Fx(a9yJ*}nKft|do+(DZ9>P54 zFff~D2Nbu=E{O1$m!Lyl^DS}1^H4v@JW<^62~_i&FM%i7ybT(pm}|h(%Nzx2s(AsL zN;CP?GTpo!_r1+qaLq8+d0Y&tc}dkT%*ZhpEPxzr=N{ zi7p!X=DnbfGj9Xuc=Il}<#5Bh7TxZ(+H)Q#eGF7v)+^ck23?bQ>XoA6$r!Ytq|WG- zW)39DYh=(PeyAx!Y>1J?E+O0FBT zNI*Y-hvG~8>3(`yFYPAJV?g8v+PapooQm%P$z6lcIlVGHTCrpJdC4)`a`wAM@y znVEc=q8enG|d`WFh82+Gwfi`8Q}kHwU}}Xoczd49;m$ zvAxoidG=bf@AqgA&;5Ml@zIwlv~+r_=?MYI{u|MqxcD=@RnWWM4* z4%TF@n*8+o8a^7>pBA)MRrV?YdX$WDYt?kpCyszGkf9y|0f$M38Uzb7)b6=(5%8HR z3(ZtnXx0&6%TyU^rpi|{&7?Lo<^Kp2Yec^>WKfCeXqA}ynV4ECG0jYt#MIBk)EYgI z{`Y@_(*^5>{!@7W6iyzj8`V7%R%=cF%ZO*fYTY_e?*B&qwFBh-eBR$Vg!f~TB{v@N z4(_27^VuxwBHh``+qD1>oi^;C-)?zMPC9+Hquxv32D*WV9H|MH0DN0 z$c_BK^dE@+OK#*JUJ0U=$Nh|T?qCc8>+D?ITFbN0o>fIVSzp0)K5H$knPm7c#4(e9 zv}ZJ`^6C8psPikZ)NvyMbn(|R4kEW;l{n(e>L6C(R}4*Tz?VboY-cw%L374}sa zfR?om7_U`@mXfW!Ot`?>*3U2k7LRNStdkHIOM4fvmf3r`wAK45$k9p>m z*}DS*j6m;0$x_hUk7kXfLr*5sFpZ(dkr%oRy$+M=x#_tJ`VM{` zKp+2d^ByScyMz74j7)PIzK>ADzsffLu z8>Z(h$jqYP!4WXz`Tu48gRPtfWB9+e(#{hXe@jWZu7moPbtmq<*8Sj1wkDwWnU)7`3RusAv%q>9-B{Xt zfY{ea8%t?3JRT239rPUxE73pCb0gq>&2Y{Y)?!=@>qXE^>m0CK{Z2>sF7MX{5lf7; zTOiwimB+(m?I2e={wbB4g9tS&NyjZo$1O?6ElI~MNyjZo$1O?6EtQU^F&+0K9bZeC zl8$ps{>5`JCf(2ON*uIlT8y z#GOACL66u(@SjRmj`Og`{u98Ia{QoD z+~@G#e>kj^azbVZ2=8KC(%0Z(%H@~5qdQEtVv3c#(_uvK*?|26X`*SF58&SWFfQp^ z$Q7+A{Qgs+L&`~m-vBL#_x^t)&Qngw{5z}hXgu8uD0^t zpm~Sjl0G4}l4|QbwpBEw0JI$5`@dmt&&)i7)n>8Ue5ab+sb(n4pGOPN5Z00GIKx0` z6}3Pm@LILYD2>r!ij`;}!+ST8j1oZ_-p2_uP!!Xh!n76eNcNOLqgs$IzY`VyH&D_U zMy6vCY&ig@Gn@ozc>5A&L@B1;sAG6}EHsi`V{|Fug=|K3^k`OLsF~7xb_~ZPL^9+A zX?SZ0GwKvmoyfhMNJd}OB!>4!z-dQAMlWoD{|F$5fd31GTk35CUj!m+Be6vIKf@f7 z`peAsfbf2ROZq=>G3BC^BdfmyUPxV=$?c=pk4rkYkcx}i>VABN+YzLA*P&8>?zm+# zOPhWJaYR5<+fzYZON9~k}bC-TW(9X+?H&) zE!lEgvgNj9%Wb7XlR?&STo160!*#GFTW(9X+?H&)E!lEgvgNj9%WcV)+mbD}C0lMw zw%nF%xh>gpTe9W0WXo;ImfI?aLC09X#C5C%V;cFEY`HDja$9Q4?dO&|ZMEl6SZ=Uv zxzm!(EwH!bDrwkqe~Fq#KDXRy*m9HPH3rZl+wnIf2;vYUjWyG-<>nD=772cCaMK&J zzXv^AHn{1lG6ypSWDb;mgA(gmO0FBTNPyJOP;m@ywNyXrrQhWFnnH>1&&|BVMDO7@ z0JdZ|Z_R@nV)l@1dBLC3PwnRY+|Bns*>fDkWy@~9 z_uS0Q06g5y_b$z0JBEkTa_@@l5wH@bUh?&>^xVNZS7AaQl@ZAt3w95;+Zmr_(Ot9% zfKCCDJ=|<(?2x=9)5E=X#^)(jVCduFRy*ShVaxM%v5rsWAps+e!ZVUg&uicr^&pn0 zwPvb$8$9NdmeNesl#l!DjC4D-k%oIKTBeWt?2HVv5A(}BANScAnPwmQXqb=t?2If` zZ=H|(?2K$Plcv5uiTmsvQa?B1!#qt#C`Tq70@fq zB%Ws;WcIxqH0-mz! zi_75ti2OjtK#N~%Qsy6IY4by%k#T^6l6^NJH^~@miAI^ee=~N5D5#H$gn)wbj5Ny3 zIMDJu%vLCP6q{OPUTqzOBv1|KYZSL`bA{cC4B2M8mB+Bd$@sb5N)CI_qFYe||5{4| zV2~R4t(FA9C^gitv$V^fz;M3a5{JO$+tL4(3WAfb1hh&uUZ4i|4GMyjIYr!PNvLQi z-(=ZNJ{y_AYDI&S4@0+ZR#2IlR6h{kQBY8&nZ*6_8Y`E>uFf>lXo-wlEl+=#C5z@r zy93Q++-_wa55RjOF6kw>sQf|h7^^yo$Y+IR5RrMHIiLYR4gqfk?);0PQr7O_&BXFP zQyraok3scJb$;f*18&RCJ?Qt~$>x1Q_LSsf(Y|LnDr6r&@L;6JhUXv9EqiJf^PFVQ zMWmdNHwKhU&rRrBcA)@yo^}eGCiV$Nc&Feiq>@=J`>G3Nq~@N z7bz#F-UIGM9zGMzIW_wT082f5CYp0v#_0gA@;pOnrzigv(waPcCYp0b#^(T5c=${- z=bZG1!LZW9XQJ35eFMrG51)zVoZsKXVZvGupNZyNAnL61@R?}Ng(*zX*L(O(G^e;% z0eZi|6Ji(Uh;D5jJ`>HEo16pz&l!F`6Yb;ge>i+Uj?YAM4(*-8XQJMh(VCa&0Utpi zwUYD=$j!LVxehvczv3OAiF)_oP8j<_tT5&nUb=P!5##wxH1Fo#yw9#d2;}FEOI{7Y zb2=`$hl`~R&wNmFCkT-2`5NxcotSz(8qf5UVJPJunfeO=eLSy_Vn@NPq}WlwX(d-j zfpNIsI|cj$#+tj(Nbfpq*Ku<7D~tuh>irc$5GPmvgSj0iR~8h-$<=QN1$t*;;N#@# z7M@EjwXVnbHm$X2#)FgEXr1afp=2AQE>P_Alxv!$xybC?)XA>oPK(fJ2c5E= zoR0~18L>30k-8OT$=hlPn(CSdBG}D=q~)$eU-HsD=?_QQKLmUKTg(hb$P13_)bkOA zd02Tk`Z|gJ8*bFOf{04_0p01pTIflzmq|vg?vt!L-xLiFilGIJluS$u{eLC2sid)o z>Ou{SVKYDGDMC-qQN%ed1L zE(2;Qt|OqOVn~?)DFdhV`W_MoI&|@2$~}m?)DEdy5JNIu4O{|kGuEjF<~v*zXUfIJ z`YZxC<4#iq-W$jA8xMJNA%PL@00q;?m(NoqzboxE%T&6f& zOx{Qwn@sqOlk>IjG?iXv;?y5kWs0!|z3eroP$iAaa*sY-J6>Uc#xAItJaz@+t8TJLudU@OD-o zGikGfO4$HKQeP82I&G0EM0vn&5@&dSz~q>F7iDIdNgn8^)E&;{J9Xn=A|!^kIpLE# z0BUDh*zP#oDZQxp{c@}_ome@DQ-gjp;H)FeY@$k?8pFC^wygit-kZnARb2Vv_xA0Q zx?57KwM&*4$@0Ev@hXFCEZedzTb6_+VF?r3vea6zwn!~6gux)2C1kS_GK9fn14$;E zSu&7`$E=fOLIO!3JhpiWA%G!dl8_Kc@+QgfzUNfc?R&4(37MJq`|GFAM}6--Rdu#H zb?Q{rx!r#%Al>8@QSS%B53kQTQv^m_?tFLmCc07VLK5R``l85a^V@KL;+Rpf`ZWYOKIZv>y9qDn5B<0+!! z$l{G$bb(z&cZQz=^58G1={jbkO_v*s>7Z~{b`JpbUxJ(`T!I&2s1z?@=C0RurTBSY zhm4UHGv!u-Q~Y71J%?V2oR*#cZ4H)O^CKOFm~7!(-+w=z)2@f$g?!&uuu#07iv~PJ%SZtiva%+0krDh9rm3O_*e!p`hAzGh+|P`B0RZ}k3TZH=y$+TN zKJ5!X2PVElmDzF9hcS;%YKv#EC!6~-{;XGa{&&S-=X@{&SPan-3Ib@Vtx#ZaWlaHc85Ms^M6&?fNIjFYG3K2U0M1 zWpy*)NdSC^jh9*+&H5)#o<5rUPZZnXkD@yI%j`FnTVct>?Wd2fhBX?YQnV_!GHJ&3 zPktU~ehkWMtZ-Zsy60%94R>p;u%i6AqoG+alxizOBKiyn?b*)wjenLGBeV-mF0^u9 zz_Wky-qS}3&cPIMyM$`LYZ)`haEJ^?SEj6Ron2v}QCtjl{LGg^k^4X$;lQ_>P@m$@ zJoyT02KGYI;c^^kg zgtzzz7`t0?-LqL@?W^WEYx3+-X8Ug6He%bFy#HwEI&{XpzMN8) zsyXx~2z*tGv5~}hSc|b8Un>Lqy~%g?CQ0e6yns?|35#))uSSZoy|5qkI%pk=M1#WE z@Bkk7kxY~!z(U>RJ3vBNllMvfoxr}=g{xehzHz6W@pk@L-h4U%ihW1v6t zlCnlh}(C$A0(l>bz2 ztXY#!Tpc1yhpH%%V5*5vb78%ul9`(HM{x1M=0+T{hzye%dDvRUDj z^vmWNr=(vt>ztC_Z`uQQ=6@{2?vmM{@J`rxH{&T-}8-)vw#vkq0(^R4qGlV?GV%7YjM{ zWU@7%hW?LLueRsY*49hB69m6iI%xbv`LI6Yf(@`cvm%c=BD`2q<1cQ)t$8w^xUFO~ z*5vI+XZ>2$I6)CU{ysM!YpyR88^*3eibSl*&mW!DvqY9X;+NMOP^YxtXeywNuqIC& z%^g)WPOBREwAIzd6D4`w{M9h+{WEDNoD;Ef=T}Hf&GJInu2k4=K8k)lp~}CcxXPy- zu@BFn@DfAu=qynw8~&T3SGa&V`l!P3siV1Bs>V4dN1tGhFikK+ryUIac-0h!&MIUl z!4UX{B~s=XeYKj*9D5N~02LeFw<5+c{&QsJSdPpb%cZW*k(pyTGIK1)OrgxN;46e$ zW{%~!GRK0B%&}nUBGg(|bR(gWS!6*+7Fp1dMHX~qkp(*gX!a>?7F1begd(W2$oO7m zk^zZ?S!B5c2$n5^+KY3pqI)Xz%Z#!hWt914Mp=+D%KXK-A473IXOxLR zpamKdlu;(a>5rqp5R_3SGPB6Q14iyrlm|bE`xKc`2HjBP2@z#R8GS`kft^v7di^VS z{(q5ZUnn!mf-2GeFv#TJgWjP;`vtIBp%U$hej?GH^5GJR_LMLdFv8S~67Ao_V^}BJ zQ{qm6olF*(Pwy?5oJ?kNGMUNAWF{w*nf*|a-{fR6QznxIDVZ#=+}em{1(%^OI7ub& zzAqA*@ulF&q-;#nEQO=@8NtICJb@nT2C8o7o(0BUpz54^W^(SCDRa+)lzSGq%K9f1 z7ju?X;2qyA3xZOXRRCF5V_@G%p)9KavaIMSkV08j0c2UxQ^W{Uy8yDR&I3sDN3aDme>FAQ;cg^pseGzSP?pE{Dxa#Cnhj91Ywc!yC&>`5pvtGBs`E&2G6Ts~LIadG zqgeYmiZjVNe5@r>5O(_sNLIo?!~cDHCPR^x&T=JsJErdM1mKmFOEt4Sx-u=aFb+T@v|TJSnCruPl>H&BxM{V1|E~fMjwE zH2lZunXFD$x}NdgOhB@}gh~wm7x2vQ5K%tWlX%E|7$12Q_!ZbWPH7D_@Z5#}|7%76 zFJ3DOQjSyFC#`3o_hQ3BAe|QAx0U#{qBP_<(d;R6oYIivL|IjSV>b231pav+WsVW1 zmTAawqHljKurra;=f8~S|IT|wg)$Q|@MU5&fo4Nz6)cy3i5lQ-h>1pbvKgVZkbX6t5v@;QGh@LX^F%ATU9xS6K1r|9XhnWnO*NJrP0X@5d< zWKVq>PdA!rDtn5C$_X<~Wlwz`Wt2Tdb^O$Y{=4X|7;JO6~&%wOR{8XMpBLqg?+A3;emXIe!rHuqov%T7b4mFzU`CS+RClYEygf=nxt zL%z!v(V15KE?WedR#a122r{jxCM<*~M38Cq4#;t)Ror|O!K5UHJS$0zEd+U1)JRzf z@~o&#SqSp192SB+D~E+3&x+b93qhV$!b0pkt2C8oMHOKoD$j}tC<{TJmBT`iXGLYo zLXc-gVWhGUc^SR^7Pfeh1+2K`bgFC(H|Ju1s8Q$kq7ME*rSRi_*QxyaX~4mR?uijl9&F5Y5PXOe+Jt z{39!Wk$~8!T%6GGJk*%Y36(<9qT^;Sj^dFkz(Ic_+n{v$S#vc#}^Hz`lGi`+U*j&dU-7ie;n z8yUG!qRdTsn0l>7J{6{vmf>l=tT{7<@`)lFd^3qa2`7|BF7mO(FG_i73CcG5GH73@ zGUX%W)@yyUdQr1ldVx)n`bK`EHPR+=ZpWMdsN$zC@DI=(=_*W;L@x1JpChqu1Ll2^ zy}ni0NRso#WwNmn@_kw?O3#a2uEip69*N2_CCENmRw4!I^c55BMJbel71=MJDy3Lm zQmksuaE)}!b{jdvH4^g`5i8rJkUdh!=9Hh7152-OCP~qbFM>c7|NC(tCjKLRKI>{c zkV{RwaxgH-?L6t-I2|VP{eU2lCF8=`ftuQ-1 z@&ZbEF3-+LJ5OeezD6V;=7)gjpNogg5Y>ucr-xr$4N}|ei1ir&^M6GBpPd~k#VTLW zoRpoDL-&UG4L#)YVO&7GuLKWyj3?djzl4@SYMGsH{T%oFoeKFndyLkw!kIlLAU|b~ z5q|-pvd8ElB2@MmJroL+Jw^{DVk6uovd8FQkx3za=a4;zKb9;1it zLS>K9L$grXWAxB2RQA|&;B%kY1`x8xeu#%Y;mjTr&g?Ovvd8X2?Zd*EJtmylW8!Os ztts#mU^^yM_SmoSaHCM!V~?Q138Avb{(zEC36(u2uz7sDP}yU|&gX^79wQ%iuTa@z z?Qlb9g)@6hsO+&25PZW3s_e0~=)@H&do1sp2rv9U08T%FXTJ%A#1#jL0DcGed7M4= zTe{=yF}wsUE6%_TS48$0b!`~|R#Ns@!QY1IJ~$7fKW}4ME$(wG@sW3V1qydAR@+y3 zv3>x}FJagjW@sTk%=wrBOe1&`+)dsAYb%Niw!z$Zw<~Yxi&VWHmTQ<7%%kd6z~?hR z0tA-1zXS}MXHe=lg0JF|ccnE>2p#|ze4du~H{0OA3wO__SJK}H1cpib@1}VJX#32E zK-4k^FiQRA*D-?$vk;b?VtyWwRC6XU2F$mBD`+l&w+)$xaGz#=4br5W-vZ7IGaaq) z{SaUz)BFO>fo2s-v&%~5D@f%$tVW}*2I zRJX`%1C_<*pTP4H^9SG=Tdt6LnfVW(wcPwJ?#s;!QK!QE7w}nW-UmpPc?W8)Fl*6j zrCErYtIRB5US+Ppz0Z6T_5J22aGzp63-t%gM{yrASAvIh^Br&%HZNxl+=S0;a{#49 z=GRfP*a*)9D6h!0{t3MkZl#C6GmARWHF>oV(BF!?RWcuNW`+43Jk5~#fHP!1;0&1$ zI78+G&XDKS(&}`?^XCs725+UeP$_2Y*F4_M)TB z1-W!@h)2MMxsXE|tZd%_%ulO^;1^(X<|6C602F-@_e%=?1GhmdVq;q#+yD^;g$8Ch zPpF1?ogOOWOko7i(o>~XjB2a@neJCas7cUz(iUrV-~=JLg1o?*e7aXGt(7c^L1MO= zA28i~5*7Ruy%t@L7VE5icn(@6il=N!y)2Nam*2##k9?AmPDzsmNSZv4ht~-FGu+6{ z!#PwTy9PF2*q`2y`#(}SM}pb!$A~KWEw?JbaRx)V6=uv#6v=GKwRRD;@{vzAW>T_f z0g^>`=t8_)LQEiEl33~?@G+`RA4WE1L*@?^Tm>-w`)&geV!~z?Q#NEVvLOkS{Tq0I z8KoIS=rdH07&fx^mSa%;3;Vls1f>sru@fq#H`A2<9W!%19$um{-eLF>xR>j_^qVN$ z`de8c1f#O@=4?$VgDkn6{WvylITHk=J$XeMSf)w<6li$;$=F>HP3{Ub58?YRN>CwFRv2+tpqb7{-vWOeSt14gTdKev#+H@P zbUNkN7O4E%vs8;LTk4If&Nr4&y6()TvTvZ!e;QqoUH}&#`GiFLrWWC~AYEk7}oemhxy+{Xi`6o*N&Kbpy?i7O-hG;l>K zrCvAL6%u_llQQ!Pk(oz{XKJ9RWI*b)0|b={rhL3YM1F|W5HY~Ge-_%gqzjQ?CBN)Dd&4NhIjNCNzx{s$Y zegP(Yjy5)>653%FN+3#?4WG#%Tdk#Xn&zZbGj(!ptBojKXV6lu12%Yx%Ah4;Gj#^- z$8@oBb(BFH{#Gs>rGA!**wxL{xx#04ZDTHFF=s6KHUY@@8QITaU}dbzr_<9P6O=yi z0tL!u>ZIh~+0AEu8ca|Eai|1US^RWo8gyv_{7c{sT`8T~dIIyuCfphR$5Zh^-I-2b zyituQGk~~*g!u(aBj`^kn#7x{HGAR^`}3IcKG98WWd!t*#xUd z{Y4qoSWVTDu`z5>_Tzts(rAW3zQk|{X_)VZa%o1fCLbHNC=1g_WQFI40p``lKG0jU9Z$%b%(xA6!uLa|ROeeCkq!B0DR66^e3*p18C-rp zw1oZO@uLt&K$O^rM5dQQIn?9Gk1=Nb5em5{)S?i_C4L|- zn~N~43q{K$+V(&{9_o10YqB{&*@X9m8rb7ZHl)%@=bq3W>PRG!Fv+im(pR8MDbpuo z3wq(W6k*$ky&_x-N-V; z5n`b&yq~K?h=q1KMTmtiaf&eL5P{y0*cb|tQ+fR+N$KbE0%ehWsT8tq46V^3RHGL* zhIVQZXrp#>h+{P0=cM&o(598~%@V`-dXPu{ zjvJ*w57}~k1GG|qhgs|E!9`L-+ezV%2esK-%b?OHf;?`~8%EaCc)lfg`wbGs7i~;C z=Cg)w39eLJV-(yHY;fx5mSBsM=Ual8Yo3Y77lR=Rq@bV33krL)!XAo^jvAj1a$2=- zvKziPP-PhXQm9+6m$hiin*Pj_w}O?_6Ij~x2Nyep`hZ)gs~kc-kFHo9eDgYqAtBTp zI23gI>fow`P^*JGogJ|{xZ5ez>frmFLhVQhwMg;l5^A$ksDC7C!2;S$tW~VsEjfZv zLn!329|%@zyV#165(w7v^o^WubX<{^vCo+G90vP~fxP1q#WGtxuSlU@49rak^8PfNO)V|dlM4Vt%|65@onu zPd2lYy)DoznU*w81rkn{-h??KnSA?NiSyrV)HJsshPCyuf5vKb0r2D^ZdQkm6~VDcYZN7hZ-oJ&!?*1 z2hYdmAu>xH`5Q0Kp9Cf-_Oq#L6N>$8YNK;lem1qu$@6DZ_i3Jq@H`(ecc0|> z`431+pR)DrhvQ~f(wEAS5ngJrE{56{J+k45MEd=NxbLJWaT_2my}@-t(m!?3OMeV=dFmTb=ZTc%F8U`@E_BhqBSo2r zr2qK@{lP<1=zrNspI&k5N#S7RE90{28;Vu)F$t z+33Tnt$8vB%iUBOZvP-w$+6j&`Vcp0s6{23$rn6|$n&tsA4S#6hh@tWTXKS0_v7Q3 zm_hf-MSMtT7ZJ%;M0*rbjJA)7#Ax#`fZfj;hK27DpB$2PzOAa7C;tGH=)yfh1=HmE z_J}P`*SANwqTW5ij(Ul$4$W3ygfMSSxl&JaRH#E81*V1|BZZJnXale#6)#_>_&J%nW+3@I`!yD2T1T zLQ)*D1=XgI)u@RuccF>YW7fexPFF*ZLPKKbK0=*R}qQa{7|QC)~u3 zxrrZl6Ti+uoL-yU@%{K z!UxRor*%sd^wR+JXP)ea>w*Ez@bd)EFZlH1X)7s^UgzQQHp9P*dcc}Ib2X2*8UA+a zKfF0{wRIb;f1zJ3q9423x&;U;^z)NfTb+2W)X&df9jR5qXe+aNFy5>EVPb^d2U3gT zI3D?A?WmFQ3()$7#j04}g?s!ZRPl9Gh9r(rhtSr>Oo zObJyCSFtMYvp67As<_YEMuu#w;y$avH|&=z zxK#0^+zzun43cidvjZe%^Y#4yIJ=c2OF zYj)dtD_Gbut11zHj9J^A@yD3eM55wV74Gyg>r#@GR{YfGACQ8;pILMSbB%t)pnW2U z-`kW-rzyfu*o0#s%>C73sc|Ej-sfQYahUg7Yvbjz(c^a8A4;azT6+0Fp2n(oc^XT- z_oqCKwO276Ij7JyDRkCR*g>6@CyfTPVg|kX{71P9`bES!^v6HXjH`LFV~!jSPCZ`f*7-cQ4a+5Pwz^ zf80&{aX0ZN+{C||AYNu+%(#hvUnaINaq6CrOX3SVB=KL^E}~_XlKkU7+s%@v`?!yX zhL-#jZsIq)iGR{fTzv@>6K@2;s3acVBZ>2`ZsXQG`J^TubrX-eiSKh0?@SOUweNQm z?{Y{^?~JeZad0*N5=s0Gc>!_yu4@ji*2t_EgufhIt@R~>t3Sbg<@z3KlZ_I=)j_m{ zW6kwB*4??joz5j{uFtjZ&h^>rZVIjneRgm)D;Gli#{62VB=QHF!LNZxDjgO6##}~` z7q`R_n8yTvdPnS)32Z@ zl-FmjOT>VEX0w{rc~0sx_ee*qV!%FgzjVa+9<}HQcfeHYYd13P0NE`jck;K@@c(B? z5^RdKkejw4wwUwfny!JrAgWIDDf@h@mI9OMV+dO2nj00W589}%04lIO*K{oD=bClS zKA&s4wo&Jr_BJYgDb;+2e`qq+>xB1+NyMWWd{`Zg=`OBvMc1FD(oSg5M38l*p` zz;Jf_$0+Vipjdj-T>Om6N>yvSs%4(+N8^QE#;rO^ynwcm&0AMW|J=-IZY$IRETz|V z_guSEHvdN(%N>LTMzyC*Zfds|(c8KEIQxoT&b@Fo#4@*}=+_bNw_7e8F}5sPUqbrX z&cy2YRU)hjY7WGX80J=tw+TH&-b$sz&5Ilxf^SCMI& z^*IEIl!8_T=x6y+cSEU2EA`jsaEsC~Rmfhz%;a!!nk+31KtfrZYm)#ZLJji384ga& zEPR1H7KK^n{BTa1HK%wE0U`x(ZBPOT7Ab)P2u%}O!rnN`skC}g5pg>c$_judTUoQ1 zs*oTeI$LRgn=M2m0?x64XsCfDZlG3GX}Q5FR0s%+QEu1eE|yr!+(43QW8qb(Jr9f% zmt2?n$1r6_Vnae2jI<9`gAB%R+k^1hgEWxR%!DnaCbUH60V|RAz*-@CK__PkE3gg6 zu86b)B`hmO>mc22a2a{#Le^uL`G+-UvV<@}8x!6p*H(+{C}ImQWw>oFN84PkwuwA9 zd8yX?Ddt_E&ASki2FUVlvPDj7Bz;O_oT06{SW%E|NEN!9$S!71*?O)guaJ0)ENvW2kc6}xgjkLUQrGQQs*jLcH8CsYPpJ~)i_1#m3A`MQr$!c%TSfn?1S4d+I zP#Td|4)JWaZYxIiZ-%p5U4oIG!|p+xsRwaHkG`zr)}QUwm?W5!805Kfkmu{CW(B7rk#-#@w2CCCfNp5C2#rInEZ0!LOV>QRb3@E2f zVzAW7pkpF)`ufB$ER(}TNV*msJq^lP>$Tv+pP<@clFrS6OLm% zEU^a(8cPq(!&p!JUU&818^j2|jTO$3ymIPDUNvK3t<+4u)%D8g=WXT8{N~ z&H?SNae;RPU+Bb^a9@T|0~Xve-Zz8;ooP@@nvS=M*W?`)%-d>e2?S9`T>2sK#xDghyNk^_%(g}kv@W;;HT7k ze=&V5!iQLkkCct{A<~VYkG`6K{_;fHaS=Q=F4D%ug6l-!IT0Ke5noxZD7#aLVTrbiC$3+o6#zn?> z;B?^h123ExX|Idf1nUuLfn)kMKXBc+SOu`pdS6^Dr1BkNDP00Pgs>K#5b4&;bHeQK z`Jk{l=~AEH0N2U&N&3_JB;AruZGFz%3HeR_U{$gLF9XaX_4-Mbf>bH!D<{Me`XHr> z8|jWT%kMJ?Qm-J*ijULBZS-*$KFmbdJdDSbZ_r0V@86}zXX%4F#1u==4dKPWia)E| zJRwTXC-k2q#GN7(*eimhk8>hGml_e==_|_-kq5+#J4GRZ+C|a0D3Esm$IDK#e$X9PkpctwuCYh!y}Odb{p~ z7+f!wqegv=*gYZI>>A5~jV@q}o_ z!$L?mK~gLP^7+JSAY0_`6murTTogxki1rTAIRU-Y_~zz_%FDz$eh?9=>sy#D_8t@6 z5;UJ`l*{|P2S{9^orUr$F*qU0@z7R-3rMo!=x&)*XhwrrgFBzK=bTtTpdF%wF6c9B z=?UtaITa#;`tvRYD7d%yimy3*tskh6HiNd(ZCj?V_dx`Gt6|%RBCd6tWE~^pM z6=EJSw?hC%cXJ8Dgs9#r;WZw3O@r+1*QmE=O^BsvvY481Zv#N$_g)8hiKwd)yCy_4 z>4VYRbtgpsdTkF)6Jobr!(k79xyH;5)Z6nX#3Hnpy}fcmtf7Z>V%sL6FfZWVhI9+S z>O9sDdb@$TsuXo)Z|}2vd;4YDL@RfQYG=RC<$mvS^!swV-yt}0fqw6-68#e}W!P~I zF5K@R?yzI@`)aV^v)ZTj`x5T=*|OiuWWRIeY5INf!?Ls9Vzcp`5sQwAQj+g2F^BM< z5n=dokS18WH1r7(WDfwxk$y;+JH;j|5;!4>-WH)_qWA%kakmiXMMhvi6jX|g(}5gO zP{mj4P&vLfC#^(WV8M{{9~8L~Yj~WDFVZ1q--)@PO5_kY&@RHqh;*<+M9#y31s)f{ z*QDzTJPY4-p23G{HV8u2S444Kh(?itI*g2X>kuog^l}k+K;+&{uB&)bWW>d+4n4kM zQ?rgGdzg7l8%FL9F?&+v#l`#z8mCq0n2TVIkBOb&)cO*>sR|755bNkNA!?X?xCpw| zh|;}ciR{e09b)Ej2hK9axvWC0##jN)+8tucDN$4-mL2nec8H6C%({j<9h5dmO0|j- zI|ER<*+FSN%6!)QRo5x2jf)~H`-I4t5V_a8^r1$8)JKvB=wlxFyBgut2kf^Jpbe~# z9mJ)rk7~)~g^J6BJ{FUQuMtuo37ob*l*8S)Lu}UiaD#S;W};;4gM@|VH!4aAeIzJR zulyN(zedb=5qGa=nIhG>V#cw6NDR-_{k={PTfKNaSKVvChlBLZ)W zxd%mvNWUtA7%g!arx0(zEFV%2VQUDpgK6cKh$gbfA{aSBpRutvAe{Py2>7aV zY#ib+M^G3Cd#r4XC?*UUdxh|ouZd-tv?g$TUn6qh7BSc5E`ESXtEYX-az&P}G7mBNT_SwD5T`_bhe-D=&XERrO5{#L zve!iT-{9qsi_F_aPRH|NR)xsDR?IymCkYh<_!fX}qZ~yr@2s7ozz5UKxLri7@xTOg z6F4Q(Q>^d_F&EyMAQ(ozC3zy_JQf$E&j~RX3xwNAv<$2BjF<_i&$_Zit1ZJ?@Tv&R zv&Tsg3H5N!JRAWdg4dcyYk%2VOPMDom~wc$vVF ze`1*s0p=81EATh$rP5j49Ea zYrT!t+O4VsdW3lu9RH9AJPb1<)0$gld%WwFlS}&<&BN)h$a(J^)?5WUM3Cc3sMdT# zthX}CMakPD@VZx8$Y17kZLxDE~+Ybdf7ST4sK z9b)SdCVrR5=@S)H)FU!_&x>5x=RuKe9ePz{R6+7!iAcxb>ky?@s9fYDjsf47s-_ve z6v)guFYtmWO%@%rRx|GwomQkqWCr@>)BrBw>jNujmRK(eR*2lVFndLn6)s0mcAi$x zAxt5}1I8^~YDBm}4j>FD2_Pe9aj%3wng_rApfJ~q0V@;kC^LXjaSzZdN|%ZJUNI{! zW@2RquEs$%`!ZVn6;6n<2^kf_6RcNtFlsprM77+@$RlGdH18BvnY&1+)g2-qffi$1 zeoC*tLK`Tct3la>DqD3*tRPk=M9MCa0Xv%%6&9{J$SAu`EWb_^PssKEIf#45dk}XH ziHjJo^q9!KOB8%sX_#lP(4BuZf)FWgZk{ND;>N`a6-{-`O!7kFG2SnuYX-b}>67jf5e}Kk8 zD~*F>Tzy(@iAb(~Yjd@zUx?pM&r04j1SKm^Oj9CRc|s}Z;`gMW1ug|G=zA|(=@Sdw z$^hWOgbo~pk0kGz|0%)_<;Sc%bXoxJj)D*PQT8~2OQpYq-&65u9+j%F^i{Ebr&xLh zQ&fjoI4%Q?bC|3!ePEYn4XyLERl&Q5?)D6K-lkD2p;OYK(I%KQ!&wyC&PTw@BfXnO z2rqWI!b{Hmz9Ud%d!niz@W66HBjJT8|B2xH1}twRu#SG_CYy2Y%A z{z|?w!B^lnimfiNMIlw-ry}_A!20td>oO5|LGTLe6tCFLQ*s)_)=9+;V%D=*tR53{ zo&|>=l+oL>tTx}X(uU>gKPB)MLM2h^Ta_n~yqb_-A|#zq;@#ihsnY2$4su}`$R%M*8C}H5vQd8oGRaq ze?h)o$>cjM2N+E z7g}&H2PvxJEpKdF9Q=&!X|z96{_hdlVfb|Uzv-P$zGhkHq&5F%}o^)HXDz?C90 zE-GPnXK250-eF;$7lT;d!oMAXMpP)fSIq1c)i}MtmXHc%XYLj2dIUnDieut}9)U<3 z(Qef_ic%4&XV9Vs>YRV6Sa_ExyhE&ti;@YkL2c&2^{f}`u>FStk_dZe>=kR`V(x^v zh{E0m3VoV8#LT#&y#18eN>WXT()D6}Twp5-yL*ThGde`bSB8N*A@-m?_WqdDrc+{< zs=w1we+Shsq}`g?9GT%q6njJnaoc;-Sm~$5oV!HXX%Z?xTM}5OT=p-bt4EY!MTN*7 zp)z5@s(PG*H|t86AqCMhuXL#J;{t(o9=WhS>M@LIqzVlus4t$zyq!i})4&BUz+=wbLq=FO2$Tx*)bth(G5khjK6F61|37XM;*dwM> zN31~h@~Xv$4K9Ksfagf$j0}>nhl-;t>~#YtPQqww(`Ox0CuKWCt`){98+slCb3%yY zA|393r`Ta-qVN7nNpN)PkOZrWzgm(@|7uANJ0!`NPLj>ENDDpmp8Eu@c3doxE@NEe z-9g6+=!N;%R)wzRHcyEtJuV{8iJH6U)C@;0{Wu8fq0Q#T4jjq!@aZl#hcd2{KFo@j zYcIxUg{YBXrJoUE0SDDP#YSsBoXcOyr1ERyB1bb>=4NssGr3VRIS))OluYjK5H+~F zfUJs{tYV`8lYC&bLoA{ao5}f#$t%e1=FoI;Tt~vZzXh!v!l?-y=mrs40S9v(4Nvfb zr8b|4pAjKUq&OPwARojlJ;;u2Z0r3nW?tuAKoRGZFgR&sR)GGA3t}6tm=W^s1bc%y z+;=*+sQyxR8 z3;shZsMqo_l1~Y5m7!ABTC65HK3Z;b>b|UpK$T@`YPK4CTk$n7m%#S&? zKHnQ-s}aAP69w2CiObEfzlPkX+RNhs$35sc5_0>V3v?Q$9LKZl9V^(cTL>?44o@WQvF45xj zCxYX@D_C-*fc({5Zh<-cf6ZmRl@(~mk~$4XM0b&#I19>3c@A!(3{m5fToE}9sbBY8 z=%f-yD0hmq+eIc$fWkP2zm`TDM^@PQBuuoN&u9|qa^3Ee@xSjB!>Am4>vOOLgEPAs zr^TFOnEK%`DN`WbI>d8O3PNs?V&x-&>ox3v^Vv*yY^-aveNJY+Q2MmKM-ZEUP- zh&DI1)VJ0*HAY*TnxnhxYIjE)>bABT(fX$7Xsok4Iuai>MmnP-qr)Qu{bO+>+SS+D zKV%TGDjSQ~ek>cjq_9@dJoleWf&`o^7gTL{$@u4pt# z8F)A)`eAolVyqLa~NP9~$jPPm)U@f#m1~^(3ZCI!JV! z(%P1e#@b!=o9$7SKvds&No_-Ya&@wEk}hOAjVHA2Fc^q8J{Iee<~c<-+ONRZjdemj z>crrYRxt%T)K&>))9_f4RIkYjRwgT0m8@WOvVt|q z3f3konBE^lo^{DutY8V1MbtLb?nzd$sxoOwRnn5A>Z?ksrmCcRs!FP;s-&8#N~)@= zq`Im~t}Je2JIh_ob=y`%Yil&mejyzwazuWp=7#owxSB8*ey;Uf{+JGYASeHDH&Qe747HrygMxe zY#_?TH8yQ+sNL3*6ze*p^I&KHK|DOJ+-^*jOeCee7zz$W*Jb7jl{YP zJLbUrH0lj+hB^n6Xqf{p>Qjny$R;?1;=skJWQXh3(ymwqBZwZ16PJ1lMH5xrmTZVS z=51qJV_V7QsHytia|Q>7!Ul3@wrhH)9sOi{ms`6*?INr8GpX<9XiwzMMBOV&#(lRB!ERl5KB z2QW`Wdq;=IN963l9lG z3Jj{Q;h~=X-to~`cXR-O)lk!&2em6cu{n z7YzDcZLM{3$a9#jZP^<}jt^n#?OtJw#k=Xd4u=n+yU8JpOTBc-FnC)1x72Sz98T*H zC{Ra1+=DXaP$8RiQ&TujtYXkw$9yBhWBt7L@pJ*}WPfMZf$*FA0kQQ#-l*2gBvZtl3rMa$gi;QROky794V4<q?TXgZ@~*jw7GBZT`dt(rLmTmati56f zV?*&M)~@l<;Um$m{ZL5{R-6dS4@G-pUBhEoPGTHUkOxB>#lnT99_c(Z6zv@8r)tE6 z8y%xT?V+y05i07A^}sZzAw~8*JRYYdu5v^DL*22%(fweBX0~Xwi`JFV{WN_VW3d6b zG<7YCd5n)4?;r2yH3-PYItSUmxiJGLBWM0eCW(c6Zlp8b$14$x{dnwfJc)ZZer7^t#BxTV$Oo?SLq{xJ^P>MQMKK$%9 z*jnmZTWR%<vL2I}d-PHaJpIyh>P9fk>PcPrT2O{>u4dV?L%*y!qvdn-v3 zW8IDo#9|}x4lN_&LtRvn)o9z8BNR!fR_c>i_oR06qBeyod=nRF8t)bjH~v$lhiDkhv&_7HwfAko=Y`vt#6NR zZQ8x7w$*?`Q+|N%xH*SdL&{n3@<8>@7TS`mZ`@wLslGMJU8SZ#C&MJRgJ1H-Q8`^7 zN(67pKLE$}rrq_Is_h*%InNqt4ADDmUrVCB8M{#KL2{J#Nstm4irG zJh^W;yUqb=2<(8dg{8-g-jq!Y5lIKnny{Jx5Kh!xf=yPaqq$Aa_)@jl4{qqdtZ;E# zT}x{VDMq^~?fGOsNDY)RuF4=cylJ*xrY{@}I-uWQUD`2M91E!V{|Eph1$z zVKx{W#4sb)Z3Say-PYDj1CUe?vxL(_3^SzM0-BDEbawG-&Tdn;dw0`rHf=TI=~aU= zWI1nR5ZLoJu{Xufj>Fx;K{Map(cd|Wo&M2b+WE!!!FZb%1J*FuKkOMEL6k*3Nyb{= zh!C*{n&J3F8Kw>ifJIxH1~GYrf{aSX;)xJuD%;HTn9>gr!i*?d>x^R;Qg@t+6%x}K zjT7oE*Sri~XbssnJQ!03$5?GqFe58J!fSV1yY^~cLCD|Os_sG*5aR$-ORBfKC2dyA z6sc^Q`mh08&xl=n<9%Er2VY}TYn0;n)~3e#&2|fW+j#`5s^L+ir)yvshZ*GWzyVf< zPKzBHj`#PdxH(Ce;=8k^FTojyoR*Z>&9yBpt=o4uwQbvOE8a8ewCCZO-qwe9q3%F! zG2y`j{3a=!~5ZI^(oJko~3|60u3bvZOG~1o2Qb* zwlN#*n4E6yWwgs?T~R+YN)e823Vf!cJe?gNN!yW;iHu92Go~xIAQ0l(b5OJj5h{%) zaz>;@Jn@=B@?aBkE&3BaoCd;fifW?Kv2kd8c&M9BfFzp=f%;48^xD?eyW64LrWNJgU>jRgTPsajQR$E4hK!8JtU3pV#s^V=m?W9u zsOe7!_-!~*!=dPA3cR$^wBK?_4O@!hz*I*I+7l)g(5|))QJd>(cSg6=wSodMxPPE? z=m16L-H1W;N`cmww%+xETlqZFv8p(R6(@z!4(ylI?yj%hg!5GH61Qu$V-@z(A<87$z*i^fDrwy0EZnO;td%CI(T4i8nC9=*~fu5zGpwK~YU(h5u zm1WX;C+{CjLB4W@7u2$%GP)ASf8E2d1ISXd)jSbjVR-#4IdJU z5jmr|Dc#mqRUKUkxtLo703NB^kY#|2=28XAQ@BJf$GX+km|r$+-Hpwm zX+{ImMYP>b9Svj!UE^c%VYxrh-wS7ixYDDFZEIJojN<6a;crPgrD1J`)Aa^-_@5uy zE!7;4$~`2?s*uYZhx*iXr!Ad$rc!OSGE(=jtVi5b(_~>*P4$M=tZULUhss*=QwEuz0mNu200oqFU<0@}A zw!uMxPecZ44noYMwMgqq?}S9&U8b{mG4UYNBB_~&VPqlF;~;-T9->6!!ypoi>@ovZmw-^ZNs^%i?7YKjhpKlXw9HHp1a07ScsQthl=ty-jO`ja%m(3 z%C?`_0#l0&y^|?d8=7r}n@2-6jo(CELuh1_4=~0Or|dk=CQ!#^*sq z#^tpl9+?g&Dp$XR$Hf*q5baf5C5+!00y%iFCl+ey(KkmXIAg_V)0$8_&)j=TRmxhX z5b+?R8I~qsUYGGK+%=4dKyp2GLaya_#fwA6Cd9s+1QZK0CSs=|_r}@xB?g2Zo{1n< zu5Y~p*YB#0)^4FxJ`Z8#ZKGA2yd^CZS2#ihWvUb=LD2;+x&4${HT6qL}E za>U*^ibRx(ri?Uo7Ory@JUoL1Z2XMH-SLGpEO5@uD&fzW-8o&y+WvLQ6t0ZL?Njst zn1?lwlkh4)+Z`0>X{e%4HNFy7n4#IJV$+>Z zglyYaYXlnLi6C00K`33RsiA9l_&|Tmrk|L6X)bd4BNZ3&fV5pJ@3wnIQt>O*Oc=Iv zn6snjxsa1MsiIph+d+6y%h;DJb6R$E#KK1Ftl>}s8rz;^I=QitKis2Nj#xd8QBJmp zVq!JG3c!XXc7CWHiQ)>A^hkHOQJql0?u8vIJ6?pfypsi2sSgyoy+*~;iVP~en!ynA zf?!&(O9$%+w2(SHwHhL6Y`*abX35y5rc|2}-l!;bI#+|mD0jaz%bQf8Q(fh5_6nDC zK{*x$b|@h=#;g!39p$JKa?PD{owK=#GS=G(sXe`-DKd@q@UqRDk6imWc|I{g^V|p) zh@8`06X(}c@I*U@FfphAOiqp-x#h^;54kv-+hym|M`6mLYDGv+pu4HWF@wvKyz-V-mb0+WU@uqtXe+OwH(`HMqaTvoD`WeSTIOTEj6LQGo%PA>yh#r|`+-L*F ztuim<#p6LL88>nq;07&6hbav)jt6!0{QmLS=n;C1cSCM@(?5)Bd3i!n@S&qIXi+hw zj=E9F9uc_LM{&!sg^x$&c5#PRNR`2j+?_<8pv)Km#O?}70m2;W26%i3uc*)snqpOg z8_v(c6A9xLpxqL;)-waHt3tp=+FPv_2+8+Pu4zF>jr-` z^@pkc7gK+X-?&Krhi?-z{Kl`}_13_5-cJi(1h~%#8^`erIP}*@2=I3y{t5mje({I? zJ}EE8#kdl@fxdhhe-rXzbl^(xjExeYep1Rfq~MjcZurd#-m=LJ|B8a&t>9;6vGKfu zXVtmu{~nLi$xAN0$iAMY>vl_|LQcQrRDxc65;FH>;uFVtSC;ND-`y+y&jKNWnJf_s1G z_-hL8{b6eQSuWD&?Keod=t~0W?{^CB{Y~*1maKoR`n4tXo3Y$xI(w@@ef*@2G4G$a ziv7_9xM}1WkN(I8@l89!3yh!s*bN^7JR5v^e|P*khP&(1)1w(wf9l_t6&~+TjDADG zy}#}Cf`Yg0mbgY?2lV&bBy@v*$*1?{IZGKX+d4ltCxKt4@GK+;g1=uVx?@S|-;e}; zo5J(2TP2=UJk#I93hwSuvd<93N3;_%odkY)68Hqe(eKKU=pV4YO~JiCwR?XOJl{$Je+}>~ z{4mB@k3IZ`;Ft%WRB%1tnTR#W&v<|9HCMsCzeK-);Zldr&+SRzdljBrua~uHKBm91 zB=tY2>VK$K)_Y7|j87}L_lH=&k_6BHP6GD@A+ImfD4A4<)g?f1H;A8>GCXW7*dPmE zSNzu{slPu7Je~x8TH)XJVTnIo;s0uq`rl0ge(iix?g@^bb?~1i!jLe`}M} zuTKKMOyTkV{`)}%|5l5{tA9K4!%6U*P69ut@q9$$(fWBx!M(qH{aO+{GkAUs8z<&V zJPYK-$V{7FKP!^J>lhw39@-}nQ2a`Nmn!(vAC=F$l%Kge37)@A0{=3>edvr5iAR5a zHA(#+B!RyQIQaqZJoT$2^|L{e{DAj2V3#mlbCI|mY* za7|Z#2H?|;yP72MJxSnKB!Qn`IP7GH$0=*5=Q~k zfcS(>ogVAlx2f-CQ7uoY+)<`&R%c<-Y+>CxSq0>LCaIFxx|VOm$ZbjNI6CqXs$5UV z5^|KSbUo>#QGN6yx9cI^v?nL-opIWfSKHdyltiLANzOa6op*Q*M zy?@ng3S4SL9@%>^=PPUs({mM z&}$O1NY+jqbraKW)}|c6Pmya%jc63FtVip%8_7=)XCGdU(3UNY4@5-)-k+W zOUd*bw>8vn+8kYh*X>s`Yl^Ua7)d(B(bd#!UwX;H=E!@TXBQ9)l+C5ON~Iwh>g5a< zb>N`wdrCd9o7+PeXn5?%_r07M^+drnh@7fKwziGS!6UUv9CS|6Z#1Ugwwfxod?m(4 zI`#M~kqo=BwxOjqT3NpC&z#+XDSfD-lWuI>tUJ6L;L#nwkx%Ci^b#Guo&hIYeWNZ- zQbSiGK93(uI7F1YUJ#{Do+=5UQD%nZ#?HgGJmr<6U8`6qmrW&3B=M5-;ZA%h6y65G z!L^Gwu!~nNTp*&O5V31Qe^Ba_9=%eM>60ns3)wDgbmZeSfn@IwI@OGPe;1Cax=19! z*;;TCpGokWKzF`)udMY0izxsBfwb1@A<_8A#xk@Hk!(}+g9 z$A+UAfRs$`oX=!W@}a8g1@-Qx7Kl4wdM7|>^EL(f9<_@n5^NgBY#SS8mLwFaNBfj_ zvse$zp)>|C=uj&WNsMMnWUyI6t*JxUe%;2dMy84v|EH@AC5|TWX%49;T_XrDjo?hP zi&E+E1y5vywjS_%xcsKH4Io$RW#5sBq59rtF3Ip<9oi1lb~Qjuz|KK>LC41N=gIM` z=B#VGB+wqS3$*a+g?^cmZcBx)Pm-^f*$_RYOmPxy+S8{V$P-r=iYbFJVKAf`X%SAx zG3}_CqH#N0$g6L!t`b=~wkG5YbS^H573UbThws#B%bla?`a%dBC6ai_mhc5jU3~|l zJ^1b)yJ(dGndSTMiSf?w+9dd+@4K)YP(MVYt-ChkD>$}9qtn|ty;5(tCt+yTRz0UD z0ejfm87mlfl$hl15$!i*Yw8Vt%iF~dzY*$&kSlRUBMD1(3#aXY(>N29<<}3mFzA{N zb|ILSCeak9_y{{(P2nx^Jt=ZH8~im$U}vf;;a(rYdUd{@ zPgeJrQl@P(ghRzVWBU66TtuVM{rEBuc1BLaC%46(a{9Q^Vfk*AC%OX59M?A{*ep5P z5_c+$P z8~twe6w+=_=2{FOp5_cDR~sm0s?9k4GBF|@n9~-tjy!8yIS*5lL>`rFtd?RtU zw`IT=eYu6Lk7>E0?j3#FKbpO z=GpI# zIsth7go2!NB}u|vo2+A}+Am%c8kvrHbtKg*35Id`D*jw12#RpnExDNeQamRKGml z*=ulhe4P(6z`BnNfrPvwUz|&H@~!hBin7tzKqoa&cO!U{p`7RGa(Z*kDCZEfd~}$X zmgTWNycJ6?R`zwHt$va%qMf6oonVw&=zAdU9PIA`3&X&Lk8&m;k-^s+EC9D&>It5th_-KZ<7t3D6XU`mT~wm+=e>+3vS zQC)Sug$CDq+MiVI^|eG-R9A2NJ%IoA-FJtz{Ew>k`npK9L;3>$dHL@I6h}I?{6AIg z_4P^BfMg`y>GnEbt{*UJqUoQ-xf=cHYdbY`{CV~New4lI;6IWpE9>ins;%Z<)6v(f zQU0Hf_D`zz`g*TwPizpMntug0Xq%mMs_|WuCrkA8c~w!<*X_0Zx2X1;RK50md84lp z)qvU;;NRQ+4!}q!8oyD32l^}FPlN2+`RDEblPGkyFDa3=^>sv@BWfHtHsL>g{T!a0 z?e#gheLbKWsEcl=p?7)O>--6Q#WAAm&&&UPs=d~~al5LnuBA$!3To?5KR +#include "../system_query.h" + +int main() { + + char *alsa_name = NULL; + int min_channels = 0; + int max_channels = 0; + char *alsa_id = NULL; + + // Get all available input devices + pa_source_info **input_devices = get_available_input_devices(); + if (input_devices == NULL) { + fprintf(stderr, "Failed to get input devices\n"); + // Normally we would clean up here, but no cleanup function is available + return 1; + } + + // Output the number of input devices + uint32_t input_device_count = get_input_device_count(); + printf("Number of input devices: %u\n", input_device_count); + + // Iterate over each input device, print its name and sample rate + for (uint32_t i = 0; input_devices[i] != NULL; ++i) { + + + pa_source_info *source_info = input_devices[i]; + alsa_id = get_alsa_input_id(source_info->name); + + //printf("[DEBUG, main()] alsa_id is, %s\n", alsa_id); + + min_channels = get_min_input_channels(alsa_id, source_info); + max_channels = get_max_input_channels(alsa_id, source_info); + alsa_name = get_alsa_input_name(source_info->name); + + printf(" - Input Device %u:\n", (i +1)); + printf(" - Pulseaudio ID: %s\n", source_info->name); + printf(" - Pulseaudio name: %s\n", source_info->description); + + uint32_t sample_rate = get_input_sample_rate(alsa_id, source_info); + printf(" - Sample Rate: %u Hz\n", sample_rate); + + if ((alsa_name) && (alsa_id)) { + printf(" - Alsa name: %s\n", alsa_name); + printf(" - Alsa id: %s\n", alsa_id); + free(alsa_name); + free(alsa_id); + } + else { + printf(" [!] Unable to find an alsa name and ID.\n"); + printf(" [!] This is probably a pulseaudio-only virtual device.\n"); + } + + if(min_channels > 0) printf(" - Minimum channels: %i\n", min_channels); + if(max_channels > 0) printf(" - Maximum channels: %i\n\n", max_channels); + + //Reset channels for now. + min_channels = 0; + max_channels = 0; + } + + // Clean up all input devices + delete_input_devices(input_devices); + + + #if 0 + // Using the get_source_port_info function to get port information + pa_source_info_list* source_ports_info = get_source_port_info(); + + if (source_ports_info == NULL) { + fprintf(stderr, "Failed to get source port information\n"); + // Cleanup would go here + return 1; + } + + // Iterate over the source ports and print information about active and available ports + printf("Available source ports:\n"); + for (int i = 0; i < source_ports_info->num_ports; ++i) { + pa_port_info *port_info = &source_ports_info->ports[i]; + printf(" Port name: %s\n", port_info->name); + printf(" Port description: %s\n", port_info->description); + printf(" Port status: %s\n", port_info->is_active ? "active" : "inactive"); + } + + // Remember to free the source_ports_info structure after use + // Note: This assumes that the 'ports' array and its contents are dynamically allocated + free(source_ports_info->ports); + free(source_ports_info); + #endif + + return 0; +} diff --git a/v-0.11/examples/print_volume_output_devices b/v-0.11/examples/print_volume_output_devices new file mode 100755 index 0000000000000000000000000000000000000000..db24a00fffba8496089b97e5f9a2ba94e95675a1 GIT binary patch literal 118624 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 DnNOBV literal 0 HcmV?d00001 diff --git a/v-0.11/examples/print_volume_output_devices.c b/v-0.11/examples/print_volume_output_devices.c new file mode 100644 index 0000000..bfa1b9b --- /dev/null +++ b/v-0.11/examples/print_volume_output_devices.c @@ -0,0 +1,72 @@ +/** + * @file print_volume_output_devices.c + * @brief This file contains the main function to demonstrate the retrieval + * of volume % of each individual audio channel of an output device with the PulseAudio API. + * + * volume-demo.c lists the available audio sinks, their ALSA IDs, sample rates, and + * channel volumes. This file assumes the presence of a system_query.h header + * file and related implementations for interacting with the PulseAudio system. + */ + +#include "../system_query.h" +#include + +/** + * @brief Main function which queries and displays audio device information. + * + * The function initializes necessary structures for PulseAudio (done in system_query.c), + * retrieves the count of available devices, and iterates through each device + * to display its details, including the ALSA ID, sample rate, and channel volumes. + * + * @return int Returns 0 on successful execution, 1 on failure (e.g., no sinks available). + */ +int main() { + // Initialize any necessary PulseAudio structures + + // Get the count of available devices + uint32_t device_count = get_output_device_count(); + printf("Total devices: %u\n", device_count); + + // Get all available sinks + pa_sink_info **sinks = get_available_output_devices(); + if (sinks == NULL) { + printf("No sinks available.\n"); + return 1; + } + + + // Iterate through each sink + for (uint32_t i = 0; i < device_count; ++i) { + if (sinks[i] == NULL) { + continue; + } + + char **channel_names = NULL; + + printf(" Device %u: %s\n", i, sinks[i]->description); + + // Get the ALSA ID for the sink + const char *alsa_id = get_alsa_output_id(sinks[i]->name); + printf("\tALSA ID: %s\n", alsa_id); + + // Get the sample rate for the sink + int sample_rate = get_output_sample_rate(alsa_id, sinks[i]); + printf("\tSample Rate: %d Hz\n", sample_rate); + + channel_names = get_output_channel_names(sinks[i]->name, sinks[i]->channel_map.channels); + + // Iterate through each channel + for (uint8_t ch = 0; ch < sinks[i]->channel_map.channels; ++ch) { + pa_volume_t volume = get_channel_volume(sinks[i], ch); + float volume_percent = (float)volume / PA_VOLUME_NORM * 100; + printf("\tChannel %u name: %s, volume: %.2f%%\n", (ch + 1), channel_names[ch], volume_percent); + free(channel_names[ch]); + } + free(channel_names); + } + + // Cleanup + delete_output_devices(sinks); + + return 0; +} diff --git a/v-0.11/examples/switch-input-devices b/v-0.11/examples/switch-input-devices new file mode 100755 index 0000000000000000000000000000000000000000..d8715fd0137d6247f67e4e3769980b626a2b966b GIT binary patch literal 117888 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 V{;@rrw*A+?sA?YdH1J$n{}-NjeR}`^ literal 0 HcmV?d00001 diff --git a/v-0.11/examples/switch-input-devices.c b/v-0.11/examples/switch-input-devices.c new file mode 100644 index 0000000..a6697f7 --- /dev/null +++ b/v-0.11/examples/switch-input-devices.c @@ -0,0 +1,84 @@ +/** + * @file switch-input.c + * @brief Program to list and switch PulseAudio input devices. + * + * This program demonstrates how to use the EasyPulse library to interact with + * PulseAudio input devices. It lists all available input devices (sources) and + * allows the user to switch the default input device to any of the listed devices. + * + * The program performs the following steps: + * 1. Initializes the PulseAudio manager using the EasyPulse library. + * 2. Lists all available input devices with their names and internal codes. + * 3. Prompts the user to select an input device by entering its associated number. + * 4. Validates the user's choice to ensure it corresponds to an available device. + * 5. Switches the default input device to the user-selected device. + * 6. Cleans up the PulseAudio manager instance before program termination. + * + * Usage: + * Run the program, and it will display a list of available input devices. Enter + * the number corresponding to the desired input device to switch to it. + * + * + * @author Mbyte2 + * @date November 10, 2023 + */ + +#include "../easypulse_core.h" +#include "../system_query.h" +#include +#include +#include + +int main() { + // Initialize the PulseAudio Manager + pulseaudio_manager *manager = manager_create(); + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudioManager.\n"); + return 1; + } + + // Display available input devices to the user + printf("\n\n***INPUT SWITCHING DEMO***\n\n"); + + //We will display human-friendly device name in the program + char *device_name = get_input_name_by_code(manager->context, manager->active_input_device); + + if(!device_name) { + fprintf(stderr, "[main()] Failed when trying to allocate memory for device name.\n"); + return 1; + } + + printf("[Default device: %s]\n\n", device_name); + printf("Available input devices:\n"); + + for (uint32_t i = 0; i < manager->input_count; i++) { + printf("%d. %s - %s\n", i + 1, manager->inputs[i].name, manager->inputs[i].code); + } + + // Prompt the user to select a device + printf("Enter the number of the input device you want to switch to: "); + uint32_t choice; + scanf("%u", &choice); + + // Validate the user's choice + if ((choice - 1) >= manager->input_count) { + fprintf(stderr, "Invalid choice.\n"); + manager_cleanup(manager); + return 1; + } + + // Switch to the selected device + if (manager_switch_default_input(manager, manager->inputs[choice - 1].index) == true) { + printf("Successfully switched to the selected input device.\n"); + } else { + fprintf(stderr, "Failed to switch to the selected input device.\n"); + manager_cleanup(manager); + return 1; + } + + // Cleanup + free(device_name); + manager_cleanup(manager); + + return 0; +} diff --git a/v-0.11/examples/switch-output-device b/v-0.11/examples/switch-output-device new file mode 100755 index 0000000000000000000000000000000000000000..9830534c06219f606aaacbb4e24cbcb10394e05a GIT binary patch literal 117760 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

  • -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 literal 0 HcmV?d00001 diff --git a/v-0.07/examples/get-card-profiles-pulseaudio_api.c b/v-0.07/examples/get-card-profiles-pulseaudio_api.c new file mode 100644 index 0000000..829f45c --- /dev/null +++ b/v-0.07/examples/get-card-profiles-pulseaudio_api.c @@ -0,0 +1,63 @@ +/** + * @file get-card-profiles-pulseaudio_api.c + * @brief This program queries and displays information about available sound devices in a computer. + * + * It uses the PulseAudio library to interact with the sound system and retrieve information about + * available sound devices, their properties, and ALSA (Advanced Linux Sound Architecture) related data. + */ + +#include +#include "../easypulse_core.h" + +int main(void) { + // Query the total number of PulseAudio devices + uint32_t total_devices = get_output_device_count(); + + printf("Total sound devices in this computer:%lu\n", (unsigned long) total_devices); + printf("Available PulseAudio sound devices:\n"); + + pa_sink_info **sink_info = get_available_output_devices(); + if (!sink_info) { + fprintf(stderr, "Error: Could not retrieve sound device information.\n"); + return 1; + } + + for (uint32_t i = 0; i < total_devices; i++) { + if (!sink_info[i]) { + fprintf(stderr, "Error: sound device information at index %u is NULL.\n", i); + continue; + } + + // Display sink name + printf("\n- Sound device name: %s\n", sink_info[i]->name ? sink_info[i]->name : "NULL"); + printf("\n- Sound device description: %s\n", sink_info[i]->description ? sink_info[i]->description : "NULL"); + + // Query and display the number of profiles + uint32_t profile_count = get_profile_count(i); + printf(" - Number of profiles: %u\n", profile_count); + + // Get and display the ALSA name + const char *alsa_name = get_alsa_output_name(sink_info[i]->name); + const char *alsa_id = get_alsa_output_id(sink_info[i]->name); + int sample_rate = get_output_sample_rate(alsa_id, sink_info[i]); + + printf(" - Sample rate: %i\n", sample_rate); + printf("\n- Alsa ID is: %s\n", alsa_id ? alsa_id : "NULL"); + + if (alsa_name) { + printf(" - ALSA name: %s\n", alsa_name); + } else { + printf(" - No corresponding ALSA name found.\n"); + } + // Get and display the minimum and maximum channels + int min_channels = get_min_output_channels(alsa_id, sink_info[i]); + int max_channels = get_max_output_channels(alsa_id, sink_info[i]); + + if(min_channels > 0) printf(" - Minimum channels: %d\n", min_channels); + if(max_channels > 0) printf(" - Maximum channels: %d\n", max_channels); + free((char *)alsa_name); // Free the memory allocated for alsa_name + } + + delete_output_devices(sink_info); + return 0; +} diff --git a/v-0.07/examples/print-input-sources b/v-0.07/examples/print-input-sources new file mode 100755 index 0000000000000000000000000000000000000000..846578432e5f37682f833bf9fa3b0e57d352d3d2 GIT binary patch literal 88800 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 iO+Wm2F{9Kbk04lm20i-s~{HKyTKde07 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 CUR=%q literal 0 HcmV?d00001 diff --git a/v-0.07/examples/print-input-sources.c b/v-0.07/examples/print-input-sources.c new file mode 100644 index 0000000..fdb585e --- /dev/null +++ b/v-0.07/examples/print-input-sources.c @@ -0,0 +1,90 @@ +#include +#include "../system_query.h" + +int main() { + char *alsa_name = NULL; + int min_channels = 0; + int max_channels = 0; + char *alsa_id = NULL; + + // Get all available input devices + pa_source_info **input_devices = get_available_input_devices(); + if (input_devices == NULL) { + fprintf(stderr, "Failed to get input devices\n"); + // Normally we would clean up here, but no cleanup function is available + return 1; + } + + // Output the number of input devices + uint32_t input_device_count = get_input_device_count(); + printf("Number of input devices: %u\n", input_device_count); + + // Iterate over each input device, print its name and sample rate + for (uint32_t i = 0; input_devices[i] != NULL; ++i) { + + + pa_source_info *source_info = input_devices[i]; + alsa_id = get_alsa_input_id(source_info->name); + + //printf("[DEBUG, main()] Alsa_id is: %s\n", alsa_id); + min_channels = get_min_input_channels(alsa_id, source_info); + max_channels = get_max_input_channels(alsa_id, source_info); + alsa_name = get_alsa_input_name(source_info->name); + + printf(" - Input Device %u:\n", (i +1)); + printf(" - Pulseaudio ID: %s\n", source_info->name); + printf(" - Pulseaudio name: %s\n", source_info->description); + + if ((alsa_name) && (alsa_id)) { + printf(" - Alsa name: %s\n", alsa_name); + printf(" - Alsa id: %s\n", alsa_id); + free(alsa_name); + free(alsa_id); + } + else { + printf(" [!] Unable to find an alsa name and ID.\n"); + printf(" [!] This is probably a pulseaudio-only virtual device.\n"); + } + + + uint32_t sample_rate = get_input_sample_rate(source_info->name); + printf(" - Sample Rate: %u Hz\n", sample_rate); + + if(min_channels > 0) printf(" - Minimum channels: %i\n", min_channels); + if(max_channels > 0) printf(" - Maximum channels: %i\n\n", max_channels); + + //Reset channels for now. + min_channels = 0; + max_channels = 0; + } + + // Clean up all input devices + delete_input_devices(input_devices); + + #if 0 + // Using the get_source_port_info function to get port information + pa_source_info_list* source_ports_info = get_source_port_info(); + + if (source_ports_info == NULL) { + fprintf(stderr, "Failed to get source port information\n"); + // Cleanup would go here + return 1; + } + + // Iterate over the source ports and print information about active and available ports + printf("Available source ports:\n"); + for (int i = 0; i < source_ports_info->num_ports; ++i) { + pa_port_info *port_info = &source_ports_info->ports[i]; + printf(" Port name: %s\n", port_info->name); + printf(" Port description: %s\n", port_info->description); + printf(" Port status: %s\n", port_info->is_active ? "active" : "inactive"); + } + + // Remember to free the source_ports_info structure after use + // Note: This assumes that the 'ports' array and its contents are dynamically allocated + free(source_ports_info->ports); + free(source_ports_info); + #endif + + return 0; +} diff --git a/v-0.07/examples/print_volume_output_devices b/v-0.07/examples/print_volume_output_devices new file mode 100755 index 0000000000000000000000000000000000000000..aae0366543280e9b23258b3cad38137f6707f95a GIT binary patch literal 88320 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 ar5}Y7V3t(i_%iLLEYv*8c-l?hvs6 literal 0 HcmV?d00001 diff --git a/v-0.07/examples/print_volume_output_devices.c b/v-0.07/examples/print_volume_output_devices.c new file mode 100644 index 0000000..9546a1e --- /dev/null +++ b/v-0.07/examples/print_volume_output_devices.c @@ -0,0 +1,72 @@ +/** + * @file print_volume_output_devices.c + * @brief This file contains the main function to demonstrate the retrieval + * of volume % of each individual audio channel of an output device with the PulseAudio API. + * + * volume-demo.c lists the available audio sinks, their ALSA IDs, sample rates, and + * channel volumes. This file assumes the presence of a system_query.h header + * file and related implementations for interacting with the PulseAudio system. + */ + +#include "../system_query.h" +#include + +/** + * @brief Main function which queries and displays audio device information. + * + * The function initializes necessary structures for PulseAudio (done in system_query.c), + * retrieves the count of available devices, and iterates through each device + * to display its details, including the ALSA ID, sample rate, and channel volumes. + * + * @return int Returns 0 on successful execution, 1 on failure (e.g., no sinks available). + */ +int main() { + // Initialize any necessary PulseAudio structures + + // Get the count of available devices + uint32_t device_count = get_output_device_count(); + printf("Total devices: %u\n", device_count); + + // Get all available sinks + pa_sink_info **sinks = get_available_output_devices(); + if (sinks == NULL) { + printf("No sinks available.\n"); + return 1; + } + + + // Iterate through each sink + for (uint32_t i = 0; i < device_count; ++i) { + if (sinks[i] == NULL) { + continue; + } + + char **channel_names = NULL; + + printf("Device %u: %s\n", i, sinks[i]->name); + + // Get the ALSA ID for the sink + const char *alsa_id = get_alsa_output_id(sinks[i]->name); + printf("\tALSA ID: %s\n", alsa_id); + + // Get the sample rate for the sink + int sample_rate = get_output_sample_rate(alsa_id, sinks[i]); + printf("\tSample Rate: %d Hz\n", sample_rate); + + channel_names = get_output_channel_names(sinks[i]->name, sinks[i]->channel_map.channels); + + // Iterate through each channel + for (uint8_t ch = 0; ch < sinks[i]->channel_map.channels; ++ch) { + pa_volume_t volume = get_channel_volume(sinks[i], ch); + float volume_percent = (float)volume / PA_VOLUME_NORM * 100; + printf("\tChannel %u name: %s, volume: %.2f%%\n", (ch + 1), channel_names[ch], volume_percent); + free(channel_names[ch]); + } + free(channel_names); + } + + // Cleanup + delete_output_devices(sinks); + + return 0; +} diff --git a/v-0.07/examples/switch-sink b/v-0.07/examples/switch-sink new file mode 100755 index 0000000000000000000000000000000000000000..f25b46092f58b942d12e6fd902f8b3a9da0ff58c GIT binary patch literal 88312 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 QRlh?mXrJ~~@Ld}J4`Brg4FCWD literal 0 HcmV?d00001 diff --git a/v-0.07/examples/switch-sink-pulseaudio b/v-0.07/examples/switch-sink-pulseaudio new file mode 100755 index 0000000000000000000000000000000000000000..ec5a3527fd8ee274e83c0901512493abc087392b GIT binary patch literal 90472 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

    (S&3CA&zg?L!&r`Q8<=Xj}Jt~ z(0Kczs!(?YIVg($PmF?pEF%_2vqe02v6U@x>|dPDK;AQi@2P!{v88;^(pL;^AtX5F z)MZEE56o9uulEDkw$vG6acFN;g}|?BcM+@OukD`1>KyLf;lBPRJx~|#x3`@6@~L}Q z;iLKZ-UZ=ohhy|7pBfqGkDg5R@$+lq#V02kLSi^SnIE*$=y%iTzuXvXh#P1OSn23F zc`KTK?bnZ=y`GIQp*Ma&X}Gx}bE#(@CJ!hT*j|QN1=o25aT8IcmmTRbb&g#(2QUoe zgIhzhy#L z|K}a=m~e~4a}FsYSTQL(^|9)*a#iS$D;ae>_wFCDmYsJuvj+?2c>dm-!G`CC+5-ad z2eo&@+!gksKvrh>wV%C(bng`AR@n~)vYY_d3{Us28Fs?}Hi|8>=MG@w0joT)pJ0jo zt_O01z?Rxq33z{h5SzkSkKI264bR&PLtw18zeupgevqKu&O!k-_CkVg`-`D$=>Gsu C>V?q& delta 6238 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 diff --git a/v-0.04/examples/switch-sink b/v-0.04/examples/switch-sink index 228242ca132b55c425b8d51156d65c2bc9bee3c0..cdd6d77cfd955fbd71c1f07ea8f1db47a2e7a776 100755 GIT binary patch delta 1790 zcmYk-drVVT90%}wZd)t_EedKPTP2LAGSuMPxrq~U1)}nYn<$73bj&!0JXD+x9aalf z1N+4^S#TTvVbr+EylzvsDH{&KN0G-6A50V^MZ`6_86?x+zPBLQr1_l3@BDt}o^#WF zb5w6VsxJ)_N?G_FuigmB{ppRMF(T3{+h?Gg?W4wtNHHckX`nwWmB=sr_Lsf?=(D*! zp512_i<{G@+{oJVZ>L(W%ZV03HN~_D&=vcEE+kB`8LDPU(m5@QQhd=#t;~weGL-?k zyRI{LTd6EAD%^&qrOIT97l^c37HAQ+9V@inzOjc!YRg;P8K^hT-_J5Uu%SiEWyxe( z7e7(t(eC)z!tt0sw_~8@X|1+%GSVyiEZKvF%e8K?;oF&7F~eaEOI3ax+6%RI@o#4% zvFaSEqr9QTTN}IRtih_DUCf=>6EIdpM>qLz%1( z4#V0!gOmPbuB%?I6yH~h9tJ4I+nvtGe=`@k#ICBmc>|k|a=jdwgsc@a26i~@mEs2m ziw9$er=>#7^b{zz7^k-DlkNkGaVbUHT~fZ5Va;HM*{@{SJD8yp(eA1}vk|#Ti?l6w zDYkr(1MW=O$;y3y50{KRDL$0He)q6@}qHEo=) z?&PuzV^G?L+_cE_w44md-O57(?uQs(Bl!MPE^xmbq}B_^8b?WBcNnUq&3{B`p( zaS;)ixKP7fj`pHU%)8+H%gh&G%2no0_!#PCNm@|P90X6mMX>1_b0+MDRyeJJ`3O7+ zYoSjgvlCjOQ71`(P0V4iq8WFopm82gn+a2KzE)TdkH7@H&$V#oP3DL2z-?x4y(Eoq zV~&7({$fsm);r7_U{pKvUg)~Zd>m%oW4;1^gb$&y1M3Zv^t==6;ivaML;^JQT}S|b zg?nMClerRBbTeOr)zAeuK4A9okffD8%v0gCUgl-ch<7R*&VZ%RAFos;JOQskmCmdR zop8FAIYhgGMI+ol1VLy{$2Z^)>R%O7xUr5o0LLUnkMh|qzdO=H=P!GYFiNjsXdAv8 zaUBQX(7ar#O}ppIG2DguCAg-cdEH|1a{VtD_QUmk0*B`1_3rfn7`iPj}cm%s2SRZ}=L#3e>GlB0$~oq+Ldew5OqR za*|r|v`f}X=RB*?50_D+U!3<5^XvnDaq zt9IqUCTmyz)Nc|VI$=%|=Fni|mZGHJvRQdj|91Xl#nXvS~?8rGG< zjTa=M@e=HPaXQ_?+LH!NMy7W zSQS1ey4Fk{g-+(jlUKrmvx5<=*fG@oP>u?gqaZJBcnkjMTdo!t8&it&81gDJLs8}G z9M*JIxgXpk&xSYFsxhpBtH%SP6T>3^XGE66qS-ApoA&U9a*bmLlWD{ph5{>>=Q^&t zYTVXdL`_dxi8hVipn*jBYf=v{6xbpfct|gvi;}Bv$#d??e5S=qmTYe|27)R^Q}-8$$~8d-w)!f2MCzbEdCvAeF4G4&F3o28 zs`A&L$#Hf#$J--0dSaj~VM%+nD0NFzA~1`FF}!>C`-y6icF>0 z$V$#1>5_MrEKuTQ^M$eQJf-_E4!=lgE*MlxX*HNsM`O()UcW-A z68!55?rlB>^Xe%*0v-l0fD;=iHGqYnnS|qf8Y%SxkFsL}Yd|Hq9ycN%YyppeEAX~l z02kpCkHd9m(&>NpS;f^9B{{J%TG$hzvrt7!1-TvhPH-Y=Po%nS=`(#X*Bv`R z9nDL^nVIA6lar@H_#!fR>I43`Zrk@OU*^x~^mSK6>1V=Jdvc(0`b(l&uHa!Wnh73` zMBf-DTFcnTxoM%pSEAW{(L7VMg;W&Z7cB%gd)@jbUPdYfk=U9`b*cAn2*@7t&{J3u zqf38yTVS2VJo;HW+JVmd=~-L8U)ycX`&;aZ80u?Jgx1Z54;CUVv>R;j4QTY6j`pAp zA7D`#JEW_OE$gu1$4PjNw%d-M%kR`qvFG35=V}!UbF?K4N^LvCa_tlc;Eq<|z$bY diff --git a/v-0.04/examples/switch-sink-pulseaudio b/v-0.04/examples/switch-sink-pulseaudio index 0d290fe7a8ec9efcef0cdb1a37b984cea66fc63b..f954d5dcd87d4f0a427e8bcd8c5044278411a47e 100755 GIT binary patch delta 6527 zcmZ`;dvsLQxj%c7AwwP{APGZ&JSOBx-aO=ykOv72dC*7~HiBLv;B7<$$p8x0Fi41( zA;1l6WvIH^loq7eb_J#iroA|THu4aLTpo%niB##FKrtZq8Ua21eS6M~8`tXjWB>N= z_kG`f@9)e>KJE&3cLlenF=bo&mC(1d6!E;B#fP!%(1A!F9f;%=EPil5{HA`bY?XNxDhW4T@q9n4%;@P(W1_v!n-0dV-`= z=l&;6(rI%3Cs)#GP`(HKPnHaW{W`E%(nBTPD(PX8UL)z@l3pw65t3duFJ zzWqNW8DgaXx1^7f^baL{w4{3^eT<}kEa`EQ-rK03KiYzL$>5a&5+uD}(i0_pK+-Le zuIRUe+E0>nlV7L)^{Xw+QGNqhvJ_yJ^b|=?kn~hZPm}aCNzaw^bm;p0aSJ3vh7?dN z>Ek5bD(RV$UL)yQl3pw6*+1xZrA{*B{9sV(B|T5l8znto(pO9Rcu8L;=@TSql zW5QpXcmlGPd&d3}YIu^55~uX4dIawxj96;M5PdK0Q0f?J43(>+kzg%C>uWjS@7;KPVhc2gS#4<$}nO|28$K%BCf zS|j+~IpCDU)MCMJ6Q|^*<_g|NoRXHBAox|{W9S~LQ9`&x0%a*x5xj?ZJn{bTXa!CX zPaxha_)+4Nj8u={UBoE~scyj!5U1p$b_%|aIOQC*L-1Y1?UZcPb|Jh*0wo!Bo#5Mv zQ*u!o1>Z!Rl8Ra<_Mg1i=@9+v_P=s8K?g zPY&6{6~X5c&mrD_Uz`Erxx{+~FD0Hw+#~o@;*=Xyx8V82DJQ6%f@ct?T%dLcZkeM* zD)p2D)OI1n&f%{lWv5gr%ANnrj*Q;`3$Evu!duk@#y)~611qDgZN_Vr+?zDoBn%U~ zs(JX>(X5iEkB!TKq^uf0&)QPBw35OdU#^U>wiW&dbS=6Tl6NsC^EczlYTh*V)o^q+ zD1zDvrVU8`>ZckxNNB(7}zY=y2y*Uq5*vo9wzexiW}N;@Jg> zQ8+*pf9>yLdS@o`g$2oMB5y4yLwTYgE}0zA*~3_x61_eS^+LUlK^XHU@`%Fx;W(Ti z{~%~}ucAZIHi7@NFf)l1^s(a$^x-hR>GSK*{R-e$FoEwXw8ZLuc^Jzf+Dp}nw*<_! z6ZmI^X1)DlDel~O9y;B^Ch)B3W)toTd~c2C)zi)KM9`(@s+iWhIz95apk3qnhUtl; z{XP)A%g~+Z^ZHY0qL~ZN zG@nw|(DHwj%ZHX&3Xz-wSLlyuPNkPLIjx<93mQgIZROrJ#o@Ld=?$_nkF^`~B-MC0 zmp7J}SuS^!B%%Cc$rzL;ODrgF3O%H>81 zX7i94vspHOWQN6(P2=tM+CCFgya-B$Cag z8IxERf2hndCQF*+TWIk5oR;Rx%GxRL+nmMcmRaDps_bc&$*+{9N5Gp#lmYAUOdegH z4!x-S=P2JS&tr^#Ql7!a@!*+zP`)+uF_yuNvsR;AJBzHHvocWsbk-i0&evNXLwVUc ze=J@){>=-cI%f9UkHyRe^dG(LPwjJiVBVSNC zzV-;Jt?tOyN^$R6>DQ38ZCx#~EzzcM8m!3R$Inw}Yn`zF$nAPqz-^b$tzP4~Rq<>e zuc?}8Z-)8sI&2@h7CY#D1f5#9v^MI)=^^Sc2H{jྮqmY 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 AW&i*H diff --git a/v-0.04/examples/volume-change b/v-0.04/examples/volume-change index 88eed1d2c6f81d4b8c6b74c54a4daaee483f95c1..0517bc795988bf38061d14616339dacc7c63d1f4 100755 GIT binary patch delta 5960 zcmZ`-dsJ0b8bABORiJ>23gQ(3d59n{K@fS!8?P@y(?XmS%{4M63Wx=jU6x4k$U^t5 zaIBdzOLJ@{(d%j$R~e;C(2!6YBgYCKDMzgc%?IOj=J)OUa64yT6^cueIvK0CpQGosvGv>LS`6n{K87(UPH8 z8jv9AeUhFi>Fu@&>7k`cx>9B(!vRdvT_jznC}xMrAQ_w-s-pNxy0fGQN;)OC|0YU0 zJ)Hd)E9o>T>ks*pB!jD62WCjRo1~j0{Siqokn~3-y-?EKCB2w*dVZRXhh!*`26#$( znWP&ey-L!(B)vw`M@V|Tq?<=dhGxm&E$Q1N-AB@QNcw0=-y`Y1lHMxmW30M$|Jx*k zQ5w)L>0>3mQ_}q;y+_i=NqVoO`%8LXneF`176eF!erZ6Uqz_2?cuBu2=|PgN*lq{K z50-QnyH5FSS6i43b^}9LX?4&C9%qy ztR_j1l>7@MJxbCGB|YYWZdQsVL+k^CQX=V-CB012<0QRG(&Ht)M$)H9dcDwdtk-X< zWN4NKBuV-oL_HbvYtDw1g9owa_lKo&g!?5icQ| z+Na?c`WbO5kZOV zMI=x?Qx(DI6Za%O@GFGSS;P&*`vlJ-?nS&u@MPjtuhe$It;DH3sAYmT5~s4D77M>)k1;jnZZkC@UPu4>o0`_4ADPR)h|FO*d{oqUf0UrQcF#>aPy{5$ z$-?pV9R7IJ4VKL_qQ@Jv$+7YU$;ow)qOHv4FGP=r(;r3qNwhEez0p}Li;s(NY2`aROTHpxPM;qJZ9d8|xO0d~|I%m><}YT5MMoh|TSUCS_MmX9rrbx7TrpyTw;kXP%+_B_S&LMVF z9lf?GRl?WUfqLF!iVsgk7d5ADw%F1-deNJjY6^*M_I}2LrY5e}0vg>u9*S4gkFAZX0Ex<9Z74j1IQvap}&jVHrJKeGN&OOZfQQ=IGE!M0zB9(^e^G1 zWNP^IP&7s#MtbDe{~6(EzAG{6dMKO@+nnhAVRzbVbIST!^VP01x@w(pb3FT-m;t{K zJ<`13D^0VVg4!E_riKmu{ewSgTI~Sa)Lxlloo@VqU7+pGvZbSAWly)nmhKqBTF+TE zoqn3;<6=p22TZja1{85#m@PmO0xY*jSZIq-=ZKJmT%*agY2kpWY5jny;S^T?F}yD+ zZ0T9T+`C9~mw45W;7$5p@m4>6gkE^2+8Zw7L(_7~`zz-I1*?bicc1ieDS0kAbX{cV zI=*T_2+u3b;%$YMW;WI-g+4OrmHknNroDx}-{+dP3FzIWX-9#-2VMq-pVTyGe1JaJ zt!W{^E5IC}TaTvEhiM?N9#{h01N;)$37m0C)B1s*0A29Gy6Ci~O$7Fy(af3&o!e&+ z0Qd%;tR6TFJF^E^3+x1zV!v+yyKp5Q#TRb=c}Tt0RF2F0VuYbW%_jR|9VWUj=sHJ=6;9?boy(;1F;C zxJT7A1HPcQT+_5zV95=jI zBUk)&M_($w$GC3s1l`ONJYuoGZqErm3o!0;z6vnAi#Gzcck#W8gLKE@H9&n2{{ZlE5AOyHJHvkjJaLA5Jms&moZ-<= z1(~b=scB2GJ4&X9;bmR6`!J^>-J`=@6#9&P7kV2uVI%quyKV!Sh5ab(MjYERoDPTG z=^17pe;M{w*gPiNb@v_Pot>1YmDwmp??04ax5FU>yM7k-kL3VPZH@#vu&={uc z)sFEiU_W&pt7X)0LiZk@w=q~Xm0L_>9vw%gH`5OSk75*Wh z<0?N3`0^^h4cOk#eTw}PJ#ZMEvA_=&UUNJ~Jr3(24r%v8(>RW4Sjvmj-Fct4##>7Z zNBH5>m43GWxhVMGq;X9EE9J>+%xtaY(3%(qvR~(Oplm;5<@`YTA9P#1NU%IzQQ(h% zRUT~qc{pJAwhBEg7UQ1^z2LWQUlyz2AMTsODlAT|KF+TBv#g1_dC&^aovpzqQ}1`5A(nyzLr-$-=}AsC!dOPa&f8W6{lwFyaM@Wr_wyD^)5H{uIu#% zUGPY~TeW56=^q04e|}Cyy5zy1&_>*RZgRObjjt7y9Bebg(-|tPg1C3+&bR4-6_(RC zJs2i*;Z|6j{r|PL!HOSNmnq&#d#PQqVyMtZEB$ME@-HIu?HJ@Qx=sCAcXl&B%g=YV z(RwxBd(S>4Tp97}#p4kfS?11W=$5&(?1k)Re}EN*Ef?KcqFc`*YxJH)EkPb^Dl2U%@?hzJ?N&HP zu(rkMDWHg;yk)z9zn}AD`Am1uqb0(NB{D#j0Nr>Z3y|lID(Ljt=bQz<@8niXxs4-NNXt`<5{r-Jsa5ro9tTp@l zzwiI|^X&bfbLPme{Re*S-<81HpG*8S@bdkNxGwXFEH$VxOlOT@d@+j&Y}Hv$D{o?{ zKGxUj{?&afiubW2;j60jh?CvUzMFT>&;PPI@5Co7{_*L<$Cd2^ zo)`SSHnJU_y@8v@IlSEj=xr&Dak_Ejd%DG|_w3O9zIY$+bLjdwfX_$DfTT~-Lqs{~ z)g4qJMRJ^zD$JAgAxY1W^gi!^jL@D0OJN^t5Hbxf1fb(6$E-4vzGsT0zJbW@aer%p(}Pd7zb=F|!4 z6LeFQl}??I9;}<9taAcr{^SV3&v(^3b&K>+p9pMp>V$OfUKPStNuQ{Ph|($P;ga4i z>5d4=(Iq(|CB0kHqa=O5q)(RgS0p`J(t9L*imvPT|A^!;Nfr7eeX67nNcuEMAC&az zl73Fo&5}Ok^zJ`e(iq7xELE^b`iP{@ko3EfZk2S!dpfB7SV<4?>C}Im|VlJo>gPmuI9Nl%3Coj*>2B&-jnWWE_^h!xjy{9{r zI?0iC&!N;ydb*@HO8Oj0-zw>ICEY3M4@i2u&!xjGyaYlSl@Lu9bjEdSP z_#xty57i#QUnTBOe81oah*SP^s9i$XM*<~2)hYO1;ZZCwLoi%6n>= z;M<5(zEf?2HxZ{ir=|)181V_jErLHn9C^*5s9{2=CV}#qstCT6IOQ>QJr8)%7Ut6@T@rT}`aP!++K5~pLYj(jWj0C76)>X6|1#Oai)gMw!gr_-(W2|kB7 zoocm5@Fe1Nn$`W_w?oaN>3nzW^qH#^<*P?iLSuHph2z+n%@AnsG>+B)7T#@+w7ZPs zR`G$@X#u2k&O27aZ^TYxD|uj?ISG=|GPlCMGkecUs@`$6IoR&XZh)>uZiO_w7K4A^ z*j&TQ<0@H==hZlaAFKAfHmicMN{?US9mZDh|4XW8D?ID&FK4C-McLigGR5vH>bASk zUjJ~*ZB6SpMpW>V$%Sk=pEP@hc{v4z?%IzeAO)t2z@IJW%VytT%eXCNhG`iEHa{f= z1>U08HZ0>$rOZIke~9uADbcXcrR1}vd}`_*lm}DWSvgNlD`e%K=Cn2=Tf**|5JU<^!3@vBi2H6F)~E9mZQkUB>GKSfwo3FBkL4i>$@o zxZhpXv?FvMRl8Ul<4fe|jC>qt*WPiKh8u_wG__Z6$|W_GTg)Actd-uTmX9?xL^swI zIajZdMbH_XgJWv%_!G5wO<#ZrZ^f0=fy?Ocr4Rm9P-8Lw`=S}Fh)>Njq0GpNMOmF? ziYTIy^$+Kv*7cq)RNPR+f0{Ktm~<>&9+V#x@i((37kMM6>)p-t($&-*_6I0k2>%vO zD5`3LJwi5`zxx*v_2)t!oIQsXa$B}_I$TFZ75J%@>xnyCFDg$*q1xs`?#O zi6|%K)P)yNLq)?oTaPPG(!wt&;6KT+!ug*$W|RXt(@Y2%Yw#jERFlO`h_n>&?{Z>e z@@aHM!!D(x&;It1pPdcT4)@;2r}Mcj*J?t{SQD$MiPy!PA`j&A?YTCV&wro0K$Ouu z#8zg`Q&G3wo+!}@7t_a(lO01hQu-urAus;>+=x&m5m4G z%{JK-<%4%CaEc+F2ccyQg?+-t%kwhOR(qZm<$vW(Wx2dx*w^wl!d{-A7@Vv3orL%Y za`~S8MCga}H?SN&tstE#{Goy**iRN5WZB$OScP(1;Z~N#Zx@m`z9ZOCR{G#F9|UFSlGFl+)-kM`#?z? z%KnmBY$5-$BoXBldos#mdtT`h1g7J~#NP3CFQv+(3Ym~($el;v|@Mdrgs6m%UMaRGtw!V6elp92bNAoU&QgG80i;HvKhb)4f1N@ENIAM>ix zB1b5^N1Ze?Un8~DNayZG?;Hk2|HjLBr9;yf2(XHaVLw4O7AHkooMU)%p_z}O*7bM< zm3xEeVdY!FkGw%2ozt?l>kQ{Qa;M&W96@LBRS|G+UacRCd1b&mw$y>>fnQFEaJ+L? z)4cm~=M9U!qjh+=?n_PEIl^}JHRtFH^Q$p|Hh&L3xM|?@fb@;&-@Rjc0L_Xz>MvB&b9e_ubK0`8;fI!nHIJ`HV5VuGWXj&ZbCa@3~ep1uut04i{ z4r~Oz0=#%qb7%uF{%ugxhJpRS0DMlYIi+a{z@gK)Kfv#R^qKJ@?q54F1ULE>pbIzv zY{53W0X&0*F~MI^Rv>RB1K+=>X%7PX|Ey`7fK8V)?HOPya`S%!UmJ30+Hn|PL%0Df zxr_#k_^$}hgJfVY@Ihb!o~)aI-vXZjp2UN(2RMY6g+ZWUSkp#;J;1PWit-Cp)6#&A z*EOvSSb~k#2y6y+0jqDKKJaD$j6oQ?_y<+9Ox**THj_49;dt>EN*qjjkF@-e2UX8> zlz*UUbU>86kg%T^3WCQOwoMq1k0pBB-;Q4o{6GIEf7h7*1?cg(Zx7)X=s1S2pr#;a;#40A8?ZO{TP@qK_t zFY#W$$xHkKp#D=nT4Oa#zRb<55psp+0D`XY)qw6R{As|Nzwj3U(O3CVz{$_}CBVhc z_;-KVpuEBY;Z7#r?(-MfxKymI@I_kV>|evAN|5$4=2I1wyDgFe`F7L{cSwp zV0V)d9*^n8%87{E@xd{p0iH4G}lIlhEC8H%7_1?M_68FR|n|FsCxr1{-@&bj~pz4zR- z6(`kSpH!DcGH3aeHk~O(aDPlOd@PI6P4)3ir~1grEQXD}obH(qk(Y}7{*#1xowYg9 z_oqvXs{Y-(VdUCrRT=VrRYwA2vN_4YfH$R8s)$I*rpbyEgtLl@WUY2iyh=< z)ZamLw}i8l*eSsnS}Mm_7BE!WEb&T(ttefY?HPAyq_W)MR^X zxtO!Chrh<5Q)1Q5wOG{?j-u}die7rAsC}Slu7k|f!^%)rjk3YBmtqI*aAIGM^nyA( z5^Hlc&WYH6P1RD#+9?&^Gf37QPG|35M8z()vod#ya*bVi=HTI)y~;h+^T(W=~L$U_c6C=oBk+f3rd2N+^F5pY{V_K8< zr0fk_vtw3gZ^;qdqntJGy|sFcu>)CMRbV{$?meO`Fyl|6BG8Dpbr974O;ia^2XBJGy;$#! z8v+fW{1EFwe?E74=y<7yC_?GXYu@f(h)EdYWe5i^@WSO0W`=ge;rfKRqkVRX^Pclk z8O2fFS|J3X?f3>>CRzXv=EWo>?auEgM)qM7J1CJ3tk9VYDjQAlkvZOkra0Rjym1 z7mY1E3g9g~8MyTaUk{vb<)y%)>-;Ei?*_jFB)4G$dT~n|*R9lxU$yZlprD;616SMm zdLX`omjc&1_|cVNV##e@tCV!|`@ptNJ~|7>=;ARzV;4^atWLfWi0|ef0t>tOF~F~f z*JkNscjK|BhxLyJukRN;uD9`cYKL84jU1X?K8n`|^zk3wNf*;nW!=VQYO&mx9~T4U zZCe~KV=TXMn8uATFH}|vLM>l@YCco*!>0`yPvav_^wa1HPhNn)-IPp;s s^HQ)W{>Vk5(uJK> z7!O>a6q3o19A$~v8D~Dzji4}Ld+$7@tq)04RB)gPOWpAobY+Ml7wSToqA)j>?TWlg zdocF~a|AMBhI--0-3OQISu9<;*+GmN&D=jqV!I+&omo}`zk{p-V-b>|BtMJD>{8@f z{ER65Jjs~RU(nZ+jWfcv5wIT3wUloOGKB>x(yi>e!!fok5U-75iN#9{y5rfASf{Zy z9!?Ovtq+GcC#x|21Ftq;h(fwVtW{Q#OP8qrJk`=RzF02w%Cm&`U?_6!_e{wN>=_h_ zqhYl@Y7@@PzTu`+d5F?C012{0W67_SR-TBF3tHs-JCa1t$Ob4#nq~fBGrMrJQC?1kTtE4cyLoPUr0onG1HKD?&JI5Gq zLLnx$FaN{r5CMnE6C`@pll{^4j@WQqd|3F@m}x_$C23iS$!}&RCuXE3rYs5wd_xM? zq)ICmON+BLDOnjSG}5ZH@GO=&%-K11mPa53m9a9mmqrK7+{;9O9yqcjUF zt;5)E!Q%2+G#0!EUIfRZJ0@@^=&j&5Z?tn9SPaI3gE0uJ!EZ2B+rSDoT;P(6@CPq| zCUEX0_$xVX%4JF?fuH8l^|TiPtH;0-A16`UK3mNohY3 zFAF#cbZbTcQ2ZSMzmK=m0C38-tx()a;_x|VFh&b^lG1IE{q8bDV| z+JTF;q-TPUFrtnG0lVwSEWr63(Ioirj-)7|zwmxN*@v?W^`r(Eb)K{*4A4GmpfnM! z<3fA7y(hft>Y#`dTpXRaemH7otwl@nu(sKSb1I*zAgByw!gY>}`#d z;y+8bU3g;i4^wa{Ts3^_S*a@>6qe|S2-mFzscR`8i=c-6Pn{uTbNp6>@d(uXnx=+`rR Opf6|0)$=d%{{I4e%}`tb diff --git a/v-0.04/system_query.c b/v-0.04/system_query.c index d5f23e5..ad581eb 100644 --- a/v-0.04/system_query.c +++ b/v-0.04/system_query.c @@ -477,7 +477,7 @@ int get_max_channels(const char *alsa_id) { return -1; } - if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, 0)) < 0) { + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); return -1; } @@ -522,7 +522,7 @@ int get_min_channels(const char *alsa_id) { return -1; } - if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, 0)) < 0) { + if ((err = snd_pcm_open(&handle, alsa_id, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { fprintf(stderr, "Unable to open PCM device: %s, error: %s\n", alsa_id, snd_strerror(err)); return -1; } @@ -639,7 +639,7 @@ static void get_alsa_id_cb(pa_context *c, const pa_sink_info *i, int eol, void * // Check for end of list if (eol) { // Signal the main loop to unblock the iterate function - fprintf(stderr,"[DEBUG, get_alsa_id_cb()] End of function reached.\n"); + //fprintf(stderr,"[DEBUG, get_alsa_id_cb()] End of function reached.\n"); pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); free(userdata); return; @@ -657,8 +657,8 @@ static void get_alsa_id_cb(pa_context *c, const pa_sink_info *i, int eol, void * const char *alsa_card = pa_proplist_gets(i->proplist, "alsa.card"); const char *alsa_device = pa_proplist_gets(i->proplist, "alsa.device"); - fprintf(stderr, "[DEBUG, get_alsa_id_cb()], alsa.card is %s\n", alsa_card); - fprintf(stderr, "[DEBUG, get_alsa_id_cb()], alsa.device is %s\n", alsa_device); + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()], alsa.card is %s\n", alsa_card); + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()], alsa.device is %s\n", alsa_device); // Check if both properties are available and alsa.device is a digit if (alsa_card && alsa_device && isdigit((unsigned char)alsa_device[0])) { @@ -675,7 +675,7 @@ static void get_alsa_id_cb(pa_context *c, const pa_sink_info *i, int eol, void * fprintf(stderr, "ALSA properties not found or invalid for sink.\n"); } - fprintf(stderr, "[DEBUG, get_alsa_id_cb()] alsa ID is %s\n", shared_data_2.alsa_id); + //fprintf(stderr, "[DEBUG, get_alsa_id_cb()] alsa ID is %s\n", shared_data_2.alsa_id); // Signal the main loop to unblock the iterate function pa_threaded_mainloop_signal(shared_data_1.mainloop, 0); @@ -713,7 +713,7 @@ const char* get_alsa_id(const char *sink_name) { } // Query PulseAudio for the information of the specified sink - fprintf(stderr,"[DEBUG, get_alsa_id()] sink name is: %s\n", sink_name_copy); + //fprintf(stderr,"[DEBUG, get_alsa_id()] sink name is: %s\n", sink_name_copy); op = pa_context_get_sink_info_by_name(shared_data_1.context, sink_name_copy, get_alsa_id_cb, sink_name_copy); // Wait for the PulseAudio operation to complete From fafef77092673e7376914fc6a6dcb7740ec9d145 Mon Sep 17 00:00:00 2001 From: NMagic Date: Wed, 1 Nov 2023 21:59:42 -0300 Subject: [PATCH 08/20] . --- v-0.05/Makefile | 20 + .../pa_context -- interface overview.docx | Bin 0 -> 33970 bytes .../pavucontrol sink update flow.txt | 41 + .../pulseaudio/introspect.c summary | 79 ++ .../pulseaudio/mainloop code flow.txt | 17 + v-0.05/easypulse_core.c | 843 ++++++++++++++++++ v-0.05/easypulse_core.h | 90 ++ v-0.05/examples/Makefile | 19 + v-0.05/examples/alsa-mapper_pulseaudio-api | Bin 0 -> 78584 bytes v-0.05/examples/alsa-mapper_pulseaudio-api.c | 91 ++ v-0.05/examples/change-speaker-mode | Bin 0 -> 70768 bytes v-0.05/examples/change-speaker-mode.c | 88 ++ v-0.05/examples/error.txt | 103 +++ .../examples/get-card-profiles-pulseaudio_api | Bin 0 -> 71984 bytes .../get-card-profiles-pulseaudio_api.c | 63 ++ v-0.05/examples/switch-sink | Bin 0 -> 71280 bytes v-0.05/examples/switch-sink-pulseaudio | Bin 0 -> 73504 bytes v-0.05/examples/switch-sink-pulseaudio.c | 62 ++ v-0.05/examples/switch-sink.c | 61 ++ v-0.05/examples/volume-change | Bin 0 -> 70808 bytes v-0.05/examples/volume-change-pulseaudio | Bin 0 -> 73472 bytes v-0.05/examples/volume-change-pulseaudio.c | 101 +++ v-0.05/examples/volume-change.c | 82 ++ v-0.05/libeasypulse_core.a | Bin 0 -> 39626 bytes v-0.05/system_query.c | 767 ++++++++++++++++ v-0.05/system_query.h | 20 + 26 files changed, 2547 insertions(+) create mode 100644 v-0.05/Makefile create mode 100644 v-0.05/documentation/pa_context -- interface overview.docx create mode 100644 v-0.05/documentation/pavucontrol/pavucontrol sink update flow.txt create mode 100644 v-0.05/documentation/pulseaudio/introspect.c summary create mode 100644 v-0.05/documentation/pulseaudio/mainloop code flow.txt create mode 100644 v-0.05/easypulse_core.c create mode 100644 v-0.05/easypulse_core.h create mode 100644 v-0.05/examples/Makefile create mode 100755 v-0.05/examples/alsa-mapper_pulseaudio-api create mode 100644 v-0.05/examples/alsa-mapper_pulseaudio-api.c create mode 100755 v-0.05/examples/change-speaker-mode create mode 100644 v-0.05/examples/change-speaker-mode.c create mode 100644 v-0.05/examples/error.txt create mode 100755 v-0.05/examples/get-card-profiles-pulseaudio_api create mode 100644 v-0.05/examples/get-card-profiles-pulseaudio_api.c create mode 100755 v-0.05/examples/switch-sink create mode 100755 v-0.05/examples/switch-sink-pulseaudio create mode 100644 v-0.05/examples/switch-sink-pulseaudio.c create mode 100644 v-0.05/examples/switch-sink.c create mode 100755 v-0.05/examples/volume-change create mode 100755 v-0.05/examples/volume-change-pulseaudio create mode 100644 v-0.05/examples/volume-change-pulseaudio.c create mode 100644 v-0.05/examples/volume-change.c create mode 100644 v-0.05/libeasypulse_core.a create mode 100644 v-0.05/system_query.c create mode 100644 v-0.05/system_query.h diff --git a/v-0.05/Makefile b/v-0.05/Makefile new file mode 100644 index 0000000..b1c5107 --- /dev/null +++ b/v-0.05/Makefile @@ -0,0 +1,20 @@ +CC = gcc +CFLAGS = -Wall -g -Wextra + +LIB_NAME = easypulse_core +LIB_SRC = easypulse_core.c +LIB_OBJ = easypulse_core.o +LIB_OUT = lib$(LIB_NAME).a + +all: $(LIB_OUT) + +$(LIB_OUT): $(LIB_OBJ) + ar rcs $(LIB_OUT) $(LIB_OBJ) + +$(LIB_OBJ): $(LIB_SRC) + $(CC) $(CFLAGS) -c $(LIB_SRC) -o $(LIB_OBJ) + +clean: + rm -f $(LIB_OBJ) $(LIB_OUT) + +.PHONY: all clean diff --git a/v-0.05/documentation/pa_context -- interface overview.docx b/v-0.05/documentation/pa_context -- interface overview.docx new file mode 100644 index 0000000000000000000000000000000000000000..6cbe2d09c38dfcab843409c88d5b9d8666c90192 GIT binary patch literal 33970 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 literal 0 HcmV?d00001 diff --git a/v-0.05/documentation/pavucontrol/pavucontrol sink update flow.txt b/v-0.05/documentation/pavucontrol/pavucontrol sink update flow.txt new file mode 100644 index 0000000..9428de8 --- /dev/null +++ b/v-0.05/documentation/pavucontrol/pavucontrol sink update flow.txt @@ -0,0 +1,41 @@ ++----------------+ +| pavucontrol | +| (initial file)| ++----------------+ + | + | Callback function triggered when there's info/change related to a sink + V ++----------------+ +| sink_cb | +| (pavucontrol.cc)| ++----------------+ + | + | - If error, show error and return + | - If end-of-list (eol) is reached, decrease outstanding tasks count and return + | - Update GUI representation of a sink using w->updateSink() + V ++---------------------------+ +| MainWindow::updateSink | +| (mainwindow.cc & .h) | ++---------------------------+ + | + | - Retrieve or create SinkWidget for the sink + | - Update SinkWidget properties (e.g., volume, mute state, active port, etc.) + | - Prepare context menu for the sink + | - Ensure the sink is displayed correctly via updateDeviceVisibility + V ++-------------------------------------+ +| MainWindow::updateDeviceVisibility | +| (mainwindow.cc & .h) | ++-------------------------------------+ + | + | - If idle source/callback is already queued, return + | - Schedule the idle_cb function to be called when the app is idle + V ++----------------+ +| idle_cb | +| (mainwindow.cc)| ++----------------+ + | + V + ... (Specific steps and logic for updating device visibility) diff --git a/v-0.05/documentation/pulseaudio/introspect.c summary b/v-0.05/documentation/pulseaudio/introspect.c summary new file mode 100644 index 0000000..d9616f2 --- /dev/null +++ b/v-0.05/documentation/pulseaudio/introspect.c summary @@ -0,0 +1,79 @@ +* !pa_tagstruct_eof (context_string_callback): this function seems to be a callback function for processing string responses from the server. It examines the incoming command and checks for errors. If there's an error or if the command isn't a reply, it sets the success flag to 0 and prepares an empty response string. If the command is a reply, it extracts the response string from the tag structure. If there's any issue with extracting the string or if there's unexpected data in the tag structure, it flags a protocol error. + +* pa_context_stat: this function sends a simple command to request statistics. It leverages another function pa_context_send_simple_command and provides the context_stat_callback as the callback function to handle the response. It's used to retrieve statistical information. + +* pa_context_get_server_info: similar to the previous function, this function sends a command to get server information. It again uses pa_context_send_simple_command, but this time with a different callback, context_get_server_info_callback, to process the server information response. + +* context_get_sink_info_callback: this function is a callback that processes information about a sink. It first ensures that the operation and context are valid. If the received command is not a reply, it handles the error. If it is a reply, it starts parsing the sink information from the tag structure, extracting details like the sink's name, description, sample specification, channel map, owner module, volume, mute status, monitor source, latency, and more. The function seems to account for different versions of the context and extracts varying levels of information based on that. + +* pa_tagstruct_getu32: this function seems to be a snippet or part of another function and is possibly not a standalone function. It attempts to retrieve a 32-bit unsigned integer from a tag structure. If unsuccessful, it returns an error indicating a protocol issue. + +* pa_context_get_sink_info_list: this function sends a command to retrieve a list of sink information. It utilizes the pa_context_send_simple_command function and provides the context_get_sink_info_callback as the callback to process the list of sinks. + +* pa_context_get_sink_info_by_index: this function requests information about a specific sink identified by its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SINK_INFO) with the specified sink index and sends it to the server. The response from the server is expected to be handled by the context_get_sink_info_callback. + +* pa_context_get_sink_info_by_name: similar to the previous function, this one requests information about a sink, but it identifies the sink by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SINK_INFO) with the specified sink name to the server. The server's response will be processed by the context_get_sink_info_callback. + +* pa_context_set_sink_port_by_index: this function is designed to set the port for a specific sink identified by its index. After some validity checks, it builds a command (PA_COMMAND_SET_SINK_PORT) with the given sink index and port information, then sends this command to the server. The acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_sink_port_by_name: this function sets the port of a sink based on its name. It first performs some validation checks, then constructs a command with the sink's name and desired port. This command is sent to the PulseAudio server, and the response will be handled by a generic acknowledgment callback. + +* context_get_source_info_callback: this callback function processes information about a source. It starts by performing some initializations and checks. If the received command is a reply, it begins parsing the source information from the tag structure. This includes extracting details like the source's name, description, sample specification, volume, mute status, latency, and more. It appears to accommodate different versions of the context, extracting varying levels of information based on that. + +* pa_context_get_source_info_list: this function sends a command to retrieve a list of source information. It employs the pa_context_send_simple_command function, providing the context_get_source_info_callback as the callback to process the list of sources. + +* pa_context_get_source_info_by_index: this function retrieves information about a specific audio source based on its index. After performing some validity checks, it constructs a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source index and sends it to the server. The response from the server is expected to be handled by the context_get_source_info_callback. + +* pa_context_get_source_info_by_name: similar to the previous function, this one retrieves information about a source but identifies the source by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_SOURCE_INFO) with the specified source name to the server. The server's response is again expected to be processed by the context_get_source_info_callback. + +* pa_context_set_source_port_by_index: this function sets the port of a specific source based on its index. After performing some validity checks and ensuring that the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source index. This command is sent to the server, and the acknowledgment from the server will be handled by a generic callback, pa_context_simple_ack_callback. + +* pa_context_set_source_port_by_name: this function is designed to set the port of a specific audio source based on its name. It constructs a command (PA_COMMAND_SET_SOURCE_PORT) with the desired port information and source name and sends this command to the PulseAudio server. The server's response will be handled by a generic acknowledgment callback. + +* context_get_client_info_callback: This callback function processes client-related information. It first performs checks to ensure the received command is a reply. If it is, the function begins parsing the client information, extracting details like client index, name, owner module, and driver. The function appears to be prepared to handle multiple client records in the same response and will loop through them until the end of the tag structure. + +* pa_context_get_client_info: this function requests information about a specific client based on its index. It constructs and sends a command (PA_COMMAND_GET_CLIENT_INFO) with the specified client index to the server. The server's response is expected to be processed by the context_get_client_info_callback. + +* pa_context_get_client_info_list: this function requests a list of client information from the PulseAudio server. It utilizes the pa_context_send_simple_command function and specifies the PA_COMMAND_GET_CLIENT_INFO_LIST command. The response from the server is expected to be handled by the context_get_client_info_callback. + + +* card_info_free: this is a utility function designed to free the memory associated with a pa_card_info structure. It releases memory for various properties and profiles associated with the card, such as its property list (proplist), profiles (profiles), and extended profile information (profiles2). + +* fill_card_port_info: this function populates the port information for a given card. It starts by extracting the number of ports (n_ports) for the card from a tag structure. If the card has ports, it then proceeds to fill in details about each port. If there's a protocol error while fetching the details, it returns an error. + +* fill_card_profile_info: this function is responsible for populating the profile information of a given card. It begins by allocating memory for the profiles and then proceeds to iterate through each profile, extracting details like name, description, number of sinks, number of sources, and priority. It also accounts for different versions of the context, fetching additional details if the version is >= 29. + + +* context_get_card_info_callback: this callback function processes card-related information. It starts by performing initialization checks and then examines the received command. If the command is a reply, the function starts parsing card details like index, name, owner module, driver, and the number of profiles. It then calls the fill_card_profile_info function to populate the profiles for the card. If there are any protocol errors during this process, the function handles them accordingly. + + +* pa_tagstruct_get_proplist: This function seems to be a snippet or a partial representation of a larger function. Its purpose appears to be to extract a property list (proplist) from a tag structure. If there's any issue during this extraction, it flags an error. + + +* pa_context_get_card_info_by_index: this function requests information about a specific card based on its index. After performing several validity checks, it constructs a command (PA_COMMAND_GET_CARD_INFO) with the specified card index and sends it to the server. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_by_name: similar to the previous function, this one requests information about a card, but it identifies the card by its name instead of its index. It constructs and sends a command (PA_COMMAND_GET_CARD_INFO) with the specified card name to the server. Again, the server's response is expected to be processed by the context_get_card_info_callback. + +* pa_context_get_card_info_list: this function requests a list of all card information from the PulseAudio server. It employs the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_CARD_INFO_LIST command. The response from the server will be processed by the context_get_card_info_callback. + +* pa_context_set_card_profile_by_index: this function sets the profile of a specific card based on its index. After checking the validity of the context and ensuring the PulseAudio server version supports this operation, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the specified card index and desired profile. This command is sent to the server, and the response is handled by a generic acknowledgment callback. + +* pa_context_set_card_profile_by_name: this function sets the profile of a card identified by its name. Like the previous function, it constructs a command (PA_COMMAND_SET_CARD_PROFILE) with the card name and desired profile, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_module_info_callback: this callback function processes module-related information. It checks if the received command is a reply and, if so, starts parsing the module details. This includes extracting details like the module's index, name, argument, and usage count. If there's an error or unexpected end of file in the tag structure, it flags a protocol error. + +* pa_context_get_module_info: this function retrieves information about a specific module based on its index. After conducting various validity checks, it constructs a command (PA_COMMAND_GET_MODULE_INFO) with the specified module index and sends it to the server. The response from the server will be processed by the context_get_module_info_callback. + +* pa_context_get_module_info_list: this function requests a list of all module information from the PulseAudio server. It uses the pa_context_send_simple_command function, specifying the PA_COMMAND_GET_MODULE_INFO_LIST command. The server's response will be processed by the context_get_module_info_callback. + +* context_get_sink_input_info_callback: this callback function processes information related to sink inputs. It checks if the received command is a reply and, if so, starts parsing the sink input details. This includes extracting details like the sink input's index, name, owner module, client, sink, sample specification, channel map, volume, buffer usec, sink usec, resample method, driver, and more. It also accounts for different versions of the context, extracting varying levels of information based on that. + +* pa_context_set_source_output_volume: this function sets the volume of a specific source output based on its index. It starts by performing various checks, including verifying the validity of the provided volume. It then constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_VOLUME) with the specified source output index and volume and sends it to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_set_source_output_mute: this function mutes or unmutes a specific source output based on its index. It constructs a command (PA_COMMAND_SET_SOURCE_OUTPUT_MUTE) with the desired mute status and the source output index, then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* context_get_sample_info_callback: this callback function processes sample-related information. It checks if the received command is a reply and, if so, begins parsing the sample details, extracting attributes like the sample's index, name, volume, mute status, proplist, and more. The function also handles possible protocol errors and is prepared to process multiple sample records in the same response. + +* pa_context_suspend_source_by_index: this function suspends or resumes a specific source based on its index. It verifies the server version, constructs a command (PA_COMMAND_SUSPEND_SOURCE) with the desired suspend status and source index, and then sends this command to the server. The server's response will be processed by a generic acknowledgment callback. + +* pa_context_send_message_to_object: this function sends a message to a specific object within the PulseAudio server. After checking the server version and other conditions, it constructs a command (PA_COMMAND_SEND_OBJECT_MESSAGE) with the object's path, the message, and any additional parameters. The server's response will be processed by a callback function. diff --git a/v-0.05/documentation/pulseaudio/mainloop code flow.txt b/v-0.05/documentation/pulseaudio/mainloop code flow.txt new file mode 100644 index 0000000..f4c8b96 --- /dev/null +++ b/v-0.05/documentation/pulseaudio/mainloop code flow.txt @@ -0,0 +1,17 @@ ++---------------------------------------------+ +| Mainloop | +| | +| +--------------+ +-------------------+ | +| | I/O Events | | Timers | | +| +--------------+ +-------------------+ | +| | +| +--------------+ +-------------------+ | +| | Signals | | Deferred Callbacks| | +| +--------------+ +-------------------+ | +| | +| +---------------------+ | +| | Other Asynchronous | | +| | Tasks | | +| +---------------------+ | +| | ++---------------------------------------------+ diff --git a/v-0.05/easypulse_core.c b/v-0.05/easypulse_core.c new file mode 100644 index 0000000..718aff0 --- /dev/null +++ b/v-0.05/easypulse_core.c @@ -0,0 +1,843 @@ +/** + * @file easypulse_core.c + * @brief Implementation of the easypulse core functions. + * + * This file provides the core functionality to interact with PulseAudio, + * allowing operations like setting the default device and adjusting volume. + */ + +#include "easypulse_core.h" +#include +#include +#include +#include +#include +#include +#include + +//Variables shared for count_profile function and its callback. +typedef struct { + pulseaudio_manager *manager; + pulseaudio_device *device; + uint32_t profile_count; +} _shared_vars_1; + +static _shared_vars_1 shared_vars_1; + +/** + * @brief Callback function to check the state of the PulseAudio context. + * @param c The PulseAudio context. + * @param userdata User-provided data (expected to be a pointer to an int indicating readiness). + */ +static void context_state_cb(pa_context *c, void *userdata) { + pa_context_state_t state; + pulseaudio_manager *manager = (pulseaudio_manager *) userdata; + int *pa_ready = &(manager->pa_ready); + pa_threaded_mainloop *m = manager->mainloop; + + state = pa_context_get_state(c); + switch (state) { + // There are other states you can handle, but these are the important ones + case PA_CONTEXT_CONNECTING: + case PA_CONTEXT_AUTHORIZING: + case PA_CONTEXT_SETTING_NAME: + default: + break; + case PA_CONTEXT_READY: + *pa_ready = 1; + pa_threaded_mainloop_signal(m, 0); + break; + case PA_CONTEXT_FAILED: + case PA_CONTEXT_TERMINATED: + *pa_ready = 2; + pa_threaded_mainloop_signal(m, 0); + break; + } +} + + +/** + * @brief Initializes the pulseaudio_manager. + * + * @param self Pointer to the pulseaudio_manager instance. + * @return Boolean indicating success or failure. + */ +bool initialize(pulseaudio_manager *self) { + // 1. Create the threaded mainloop + self->mainloop = pa_threaded_mainloop_new(); + if (!self->mainloop) { + return false; + } + + // Get the mainloop API + pa_mainloop_api *mlapi = pa_threaded_mainloop_get_api(self->mainloop); + + // Create the context + self->context = pa_context_new(mlapi, "PulseAudio Manager"); + if (!self->context) { + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // Set the state callback + pa_context_set_state_callback(self->context, context_state_cb, self); + + // Lock the mainloop and connect the context + pa_threaded_mainloop_lock(self->mainloop); + + if (pa_context_connect(self->context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) { + pa_threaded_mainloop_unlock(self->mainloop); + pa_threaded_mainloop_free(self->mainloop); + return false; + } + + // 2. Start the threaded mainloop + pa_threaded_mainloop_start(self->mainloop); + + // 4. Wait for the context to be ready + while (self->pa_ready == 0) { + pa_threaded_mainloop_wait(self->mainloop); + } + + pa_threaded_mainloop_unlock(self->mainloop); + + if (self->pa_ready == 2) { + return false; + } + + return true; +} + + +/** + * @brief Cleans up the pulseaudio_manager. + * + * @param self Pointer to the pulseaudio_manager instance. + * @return Boolean indicating success or failure. + */ +static bool cleanup(pulseaudio_manager *self) { + // Lock the mainloop before making changes to the context + pa_threaded_mainloop_lock(self->mainloop); + + // Disconnect the context + pa_context_disconnect(self->context); + + // Unlock the mainloop before stopping it + pa_threaded_mainloop_unlock(self->mainloop); + + // Stop the threaded mainloop + pa_threaded_mainloop_stop(self->mainloop); + + // Unreference the context + pa_context_unref(self->context); + + // Free the threaded mainloop + pa_threaded_mainloop_free(self->mainloop); + + return true; +} + + +/** + * @brief Nested callback to load sound card profiles for a device. + * + * This function is triggered after invoking pa_context_get_card_info_by_index() + * to fetch details about a specific card. It is responsible for allocating memory + * for the profiles associated with the card and populating them with the relevant details. + * + * @param c Pointer to the PulseAudio context. + * @param i Pointer to the pa_card_info structure containing details about the card. + * @param eol Indicates the end of the list. If eol > 0, the list has ended or no more data is available. + * @param userdata User-provided data, expected to be a pointer to the profiles field of a pulseaudio_device structure. + */ +static void load_devices_cb_cb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { + (void) c; + + // Cast userdata to a double pointer to pulseaudio_profile + pulseaudio_profile **profiles_ptr = (pulseaudio_profile **) userdata; + + // If eol > 0, the list has ended or no more data is available + if (eol > 0) { + return; + } + + // Allocate memory for device profiles based on the number of profiles available for the card + *profiles_ptr = malloc(i->n_profiles * sizeof(pulseaudio_profile)); + if (!*profiles_ptr) { + fprintf(stderr, "[ERROR]: Failed to allocate memory for profiles.\n"); + return; + } + + // Populate the allocated memory with the profile details + for (uint32_t j = 0; j < i->n_profiles; j++) { + (*profiles_ptr)[j].name = strdup(i->profiles[j].name); + (*profiles_ptr)[j].description = strdup(i->profiles[j].description); + } +} + +/** + * @brief Callback function for retrieving device information. + * @param c The PulseAudio context. + * @param i The device information. + * @param eol End of list flag. + * @param userdata User-provided data (expected to be a pointer to pulseaudio_manager). + */ +static void load_devices_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + (void) userdata; +#if 0 + //Variable to check if devices need to be reloaded. + static bool reload_devices = false; + pulseaudio_manager *manager = (pulseaudio_manager *)userdata; + pulseaudio_device *devices = NULL; + pulseaudio_profile *profiles = NULL; + + if(manager->devices) { + devices = manager->devices; + if(manager->devices->profiles) profiles = manager->devices->profiles; + } + + if(reload_devices == true) { + for(uint32_t i = 0; i < manager->device_count; ++i) { + for(uint32_t j = 0 j > profiles-> + } + } + + manager->devices = (pulseaudio_device *)malloc(manager->device_count * sizeof(pulseaudio_device)); + + if (!manager->devices) { + free(manager); + return NULL; + } +#endif + +#if 0 + //TODO: rewrite this so that this is called every time load_devices has been called again. + //We need to detect that. + //size_t newSize = (manager->device_count) * sizeof(pulseaudio_device); + //pulseaudio_device *new_devices = realloc(manager->devices, newSize); + + /*if (!new_devices) { + fprintf(stderr, "[ERROR]: Failed to resize the devices array.\n"); + free(manager->devices); // Free old memory + manager->devices = NULL; + manager->device_count = 0; // Reset device_count to prevent out-of-bounds access + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + manager->devices = new_devices; */ + + if (eol < 0) { + if (pa_context_errno(c) != PA_ERR_NOENTITY) + fprintf(stderr, "Sink callback failure\\n"); + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + + if (eol > 0) { + manager->devices_loaded = 1; + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + + // Store the device's information + pulseaudio_device device; + device.index = i->index; + device.code = strdup(i->name); + device.description = strdup(i->description); + device.volume = i->volume; + device.channel_map = i->channel_map; + device.mute = i->mute; + + //Pulseaudio operation to fetch card profiles. + //pa_operation *profile_op = pa_context_get_card_info_by_index(manager->context,device.index,load_devices_cb_cb,&i->profiles); + //iterate(manager, profile_op); + + // Add the device to the manager's list + manager->devices[manager->device_count++] = device; + + pa_threaded_mainloop_signal(manager->mainloop, 0); + #endif +} + +/** + * @brief Load available sound cards (devices). + * @param self The pulseaudio_manager instance. + * @return true on success, false otherwise. + */ +bool load_devices(pulseaudio_manager *self) { + pa_operation *data_op; + + data_op = pa_context_get_sink_info_list(self->context, load_devices_cb, self); + iterate(self, data_op); + + #if 0 + pa_threaded_mainloop_lock(self->mainloop); + data_op = pa_context_get_sink_info_list(self->context, load_devices_cb, self); + pa_threaded_mainloop_wait(self->mainloop); + + // Once all devices are loaded, loads the active device. + // get_active_device(self); + + pa_threaded_mainloop_unlock(self->mainloop); + pa_operation_unref(data_op); + #endif + return true; +} + + +/** + * @brief Callback function handling the completion of the "unmute" operation. + * + * @param c The PulseAudio context. + * @param success A flag indicating the success or failure of the operation. + * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. + */ +static void operation_complete_unmute_cb(pa_context *c, int success, void *userdata) { + (void)c; // Suppress unused parameter warning + + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + manager->operations_pending--; + + if (!success) { + fprintf(stderr, "Failed to unmute the device input.\n"); + } + + // Signal the mainloop to resume any waiting threads. + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + +/** + * @brief Callback function handling the completion of the "move" operation. + * + * @param c The PulseAudio context. + * @param success A flag indicating the success or failure of the operation. + * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. + */ +static void operation_complete_move_cb(pa_context *c, int success, void *userdata) { + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + + if (success) { + pa_operation* unmute_op = pa_context_set_sink_input_mute(c, manager->current_device_index, 0, operation_complete_unmute_cb, manager); + pa_operation_unref(unmute_op); + } else { + // Handle error... + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + +/** + * @brief Callback function handling the completion of the "mute" operation. + * + * @param c The PulseAudio context. + * @param success A flag indicating the success or failure of the operation. + * @param userdata User-provided data, expected to be a pointer to a pulseaudio_manager instance. + */ +static void operation_complete_mute_cb(pa_context *c, int success, void *userdata) { + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + uint32_t target_device_index = manager->current_device_index; + + if (success) { + pa_operation* move_op = pa_context_move_sink_input_by_index(c, manager->current_device_index, target_device_index, operation_complete_move_cb, manager); + pa_operation_unref(move_op); + } else { + // Handle error... + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + +/** + * @brief Callback function to handle each device input. + * @param c The PulseAudio context. + * @param i The device input information. + * @param eol End of list flag. + * @param userdata User-provided data (expected to be a pointer to the target device index). + */ +static void switch_device_cb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata) { + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + + if (!eol && i) { + // Move this device input to the desired device + pa_operation* move_op = pa_context_move_sink_input_by_index(c, i->index, manager->devices[manager->current_device_index].index, NULL, NULL); + pa_operation_unref(move_op); + } + + if (eol) { + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + +/** + * @brief Switches the device (audio source) for the pulseaudio_manager. + * + * @param self Pointer to the pulseaudio_manager instance. + * @param device_index Index of the device to switch to. + * @return Boolean indicating success or failure. + */ +bool switch_device(pulseaudio_manager *self, uint32_t device_index) { + // Ensure the context is valid + if (!self || !self->context) { + return false; + } + + // Check if device_index is out of bounds + if (device_index >= self->device_count) { + fprintf(stderr, "[ERROR]: device_index out of bounds.\n"); + return false; + } + + self->current_device_index = device_index; + + // Set the desired device as the default device + /*fprintf(stderr, "[DEBUG]: self->context = %p\n", self->context); + fprintf(stderr, "[DEBUG]: self->devices = %p\n", self->devices); + fprintf(stderr, "[DEBUG]: device_index = %d\n", device_index);*/ + + if (self->devices) { + // Check if the name attribute is NULL + if (!self->devices[device_index].code) { + fprintf(stderr, "[ERROR]: Sink's name is NULL.\n"); + return false; + } + //fprintf(stderr, "[DEBUG]: self->devices[device_index].code = %s\n", self->devices[device_index].code); + } + pa_operation* set_default_op = pa_context_set_default_sink(self->context, self->devices[device_index].code, NULL, NULL); + pa_operation_unref(set_default_op); + + // Use the introspect API to get a list of all device inputs + pa_operation *op = pa_context_get_sink_input_info_list(self->context, switch_device_cb, self); + + if (!op) { + return false; + } + + while (pa_operation_get_state(op) == PA_OPERATION_RUNNING) { + iterate(self, op); + } + + pa_operation_unref(op); + + return true; +} + + +/** + * @brief Process PulseAudio profiles using a null sink. + * + * This function initializes a null sink, iterates through all `pulseaudio_profile`s, + * retrieves the number of channels from the device's channel map, assigns it to the + * profile's `channels` attribute, and finally unloads the null sink. + * + * @param manager A pointer to the `pulseaudio_manager` structure. + * + * @note This function uses the `iterate` method from `pulseaudio_manager` to wait for PulseAudio operations to complete. + * + * @warning Ensure that the `pulseaudio_manager` is properly initialized before calling this function. + */ +void get_profile_channels(pulseaudio_manager *manager) { + uint32_t module_index = PA_INVALID_INDEX; + + // Static variable to track if the mainloop is locked + static int is_mainloop_locked = 0; + + // Check if the threaded mainloop is locked + if (!is_mainloop_locked) { + pa_threaded_mainloop_lock(manager->mainloop); + is_mainloop_locked = 1; + } + + // Callback to capture the module index when loading the null sink module + void load_module_callback(pa_context *c, uint32_t idx, void *userdata) { + (void) c; + (void) userdata; + module_index = idx; + } + + // 1. Initialize a Null Sink + pa_operation *load_op = pa_context_load_module(manager->context, "module-null-sink", "sink_name=easy_pulse_null_sink", load_module_callback, NULL); + if (!load_op) { + fprintf(stderr, "Failed to load null sink module\n"); + if (is_mainloop_locked) { + pa_threaded_mainloop_unlock(manager->mainloop); + is_mainloop_locked = 0; + } + return; + } + + // Wait for the operation to complete and for the callback to capture the module index + iterate(manager, load_op); + + // 2. Iterate through Profiles and Extract Channel Map + for (uint32_t i = 0; i < manager->device_count; i++) { + pulseaudio_device *device = &(manager->devices[i]); + for (uint32_t j = 0; j < device->profile_count; j++) { + pulseaudio_profile *profile = &(device->profiles[j]); + + // Extract the number of channels from the device's channel map + int num_channels = device->channel_map.channels; + + // Update the pulseaudio_profile with the number of channels + profile->channels = num_channels; + } + } + + // 3. Unload the Null Sink using the captured module index + if (module_index != PA_INVALID_INDEX) { + pa_operation *unload_op = pa_context_unload_module(manager->context, module_index, NULL, NULL); + if (!unload_op) { + fprintf(stderr, "Failed to unload null sink module\n"); + if (is_mainloop_locked) { + pa_threaded_mainloop_unlock(manager->mainloop); + is_mainloop_locked = 0; + } + return; + } + + // Wait for the operation to complete + iterate(manager, unload_op); + } else { + fprintf(stderr, "Invalid module index for null sink\n"); + } + + if (is_mainloop_locked) { + pa_threaded_mainloop_unlock(manager->mainloop); + is_mainloop_locked = 0; + } +} + + +/** + * @brief Retrieves the number of channels for a specified device. + * + * @param devices Pointer to an array of PulseSink structures. + * @param device_index Index of the device whose number of channels is to be retrieved. + * + * @return Number of channels for the specified device. Returns -1 on error. + */ +int get_active_profile_channels(const pulseaudio_device *devices, int device_index) { + if (!devices || device_index < 0) { + fprintf(stderr, "[ERROR]: Invalid devices array or device index in get_device_channels.\n"); + return -1; // Return -1 or another indicator of failure + } + return devices[device_index].channel_map.channels; +} + + + +/** + * @brief Callback function belonging to set_volume. Triggers when audio volume is set. + * + * + * @param c Pointer to the PulseAudio context. + * @param success Indicates the success (1) or failure (0) of the volume setting operation. + * @param userdata User data provided during the set_volume operation, expected to be of type `pulseaudio_manager`. + * + * @note On failure, an error message is printed to stderr with the reason for the failure. + * @note After the operations are processed, the function signals the main loop to continue. + */ +static void set_volume_cb1(pa_context *c, int success, void *userdata) { + (void) c; + pulseaudio_manager* manager = (pulseaudio_manager*) userdata; + + + if (!success) { + fprintf(stderr, "[ERROR]: Failed to set volume. Reason: %s\n", pa_strerror(pa_context_errno(c))); + } + + // Debug: Print cvolume values for each channel as percentages + //pa_cvolume cvolume = manager->devices[manager->active_device_index].volume; + + /*for (int i = 0; i < cvolume.channels; i++) { + float percentage = (cvolume.values[i] / (float)PA_VOLUME_NORM) * 100; + //printf("[DEBUG, volume_set_complete_cb()]: Channel %d cvolume value: %u (%.2f%%)\n", i, cvolume.values[i], percentage); + } + //printf("[DEBUG, volume_set_complete_cb invoked. Success: %d\n", success);*/ + + // Decrease the operations count and potentially signal the condition variable. + manager->operations_pending--; + + // Signal the main loop to continue + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + + +/** + * @brief Callback function belonging to set_volume. + * Triggers after audio volume levels are updated. + * + * @param c Pointer to the PulseAudio context. + * @param success Indicates the success (1) or failure (0) of the volume setting operation. + * @param userdata User data provided during the set_volume operation, expected to be of type `pulseaudio_manager`. + * + * @note On failure, an error message is printed to stderr with the reason for the failure. + * @note After the operations are processed, the function signals the main loop to continue. + */ +static void set_volume_cb2(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + (void) c; + pulseaudio_manager *self = (pulseaudio_manager *)userdata; + + if (eol > 0) { + //printf("[DEBUG, volume_check_cb()]: End-of-list reached.\n"); + self->operations_pending--; + return; + } + + if (!i) { + fprintf(stderr, "[ERROR, volume_check_cb()]: Null pointer for pa_sink_info.\n"); + self->operations_pending--; + return; + } + + if (!i->name) { + fprintf(stderr, "[ERROR, volume_check_cb()]: Null pointer for device name.\n"); + self->operations_pending--; + return; + } + + printf("[DEBUG, volume_check_cb()]: Processing device info for device: %s\n", i->name); + + // Update the volume values in the manager's devices structure + self->active_device->volume = i->volume; + + // Print the volume for each channel + for (int channel = 0; channel < i->volume.channels; channel++) { + //float volume_percentage = (float)i->volume.values[channel] / PA_VOLUME_NORM * 100.0; + //printf("Channel %d Volume: %.2f%%\n", channel, volume_percentage); + } + + //Signaling to continue. + pa_threaded_mainloop_signal(self->mainloop, 0); +} + + +/** + * @brief Set the volume for a specified device. + * + * This function allows setting the volume for a specific device based on the given percentage. + * The function performs various checks to ensure valid inputs and that the PulseAudio system is ready. + * It will adjust the volume for all channels of the device to the desired level. + * + * @param self Pointer to the pulseaudio_manager instance. + * @param device_index Index of the device to set the volume for. + * @param percentage Desired volume level as a percentage. + * @return Boolean indicating success or failure. + */ +bool set_volume(pulseaudio_manager *self, uint32_t device_index, float percentage) { + if (!self || percentage < 0.0f || percentage > 100.0f || device_index >= self->device_count) { + return false; + } + + // Convert percentage to volume + pa_volume_t volume = (percentage / 100.0) * PA_VOLUME_NORM; + if (volume >= PA_VOLUME_NORM) { + volume = PA_VOLUME_NORM - 1; + } + + // Debug: show index and desired volume. + //printf("[DEBUG, set_volume()] Index is: %i\n", device_index); + //printf("[DEBUG, set_volume()] Desired volume: %f%% (value: %u)\n", percentage, volume); + + // Ensure PulseAudio is ready and devices are loaded + if (self->pa_ready != 1 || self->devices_loaded != 1) { + return false; + } + + // Debug: Show channel volumes before the change. + /*for (int channel = 0; channel < self->devices[device_index].channel_map.channels; channel++) { + printf("[DEBUG, set_volume()]: Channel %d Before volume: %f%%\n", + channel, + 100.0 * self->devices[device_index].volume.values[channel] / PA_VOLUME_NORM); + }*/ + + // Create a pa_cvolume structure and set the volume for all channels + pa_cvolume cvolume; + pa_cvolume_init(&cvolume); + cvolume.channels = self->devices[device_index].channel_map.channels; // Manually set channels + pa_cvolume_set(&cvolume, cvolume.channels, volume); + + printf("[DEBUG, set_volume()] channels: %d\n", cvolume.channels); + + // Apply the volume change to the specific device by index and wait for the operation to complete + const char *device_name_to_change = self->devices[device_index].code; + self->operations_pending++; + pa_operation *op = pa_context_set_sink_volume_by_name(self->context, device_name_to_change, &cvolume, set_volume_cb1, self); + iterate(self, op); + + // Fetch the updated volume for the device and wait for the operation to complete + pa_operation *op2 = pa_context_get_sink_info_by_name(self->context, device_name_to_change, set_volume_cb2, self); + iterate(self, op2); + + return true; +} + + +/** + * @brief Iterates through operations in the pulseaudio_manager. + * + * @param manager Pointer to the pulseaudio_manager instance. + * @param op Pointer to the pa_operation instance. + */ +void iterate(pulseaudio_manager *manager, pa_operation *op) { + //Leaves if operation is invalid. + if (!op) return; + + bool is_in_mainloop_thread = pa_threaded_mainloop_in_thread(manager->mainloop); + + // If we're not in the mainloop thread, lock it. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_lock(manager->mainloop); + } + + //Wait for the operation to complete. + //The signaling to continue is performed inside the callback operation (op). + pa_threaded_mainloop_wait(manager->mainloop); + + //Cleaning up. + pa_operation_unref(op); + + // If we locked the mainloop earlier, unlock it now. + if (!is_in_mainloop_thread) { + pa_threaded_mainloop_unlock(manager->mainloop); + } +} + +/** + * @brief Create a new pulseaudio_manager instance. + * @return Returns a pointer to a manager structure. + */ +pulseaudio_manager *new_manager(void) { + pulseaudio_manager *manager = (pulseaudio_manager *)malloc(sizeof(pulseaudio_manager)); + if (!manager) return NULL; + + + // Initialize pointers to 0 -- good practice. + manager->device_count = 0; + manager->devices_loaded = 0; // Initialize to 0 + manager->load_devices = load_devices; + manager->destroy = destroy; + manager->switch_device = switch_device; + manager->set_volume = set_volume; + manager->get_active_device = get_active_device; + manager->iterate = iterate; + manager->get_active_profile_channels = get_active_profile_channels; + //manager->get_profiles_for_device = get_profiles_for_device; + manager->get_profile_channels = get_profile_channels; + manager->get_profile_count = get_profile_count; + + if(!initialize(manager)) { + free(manager->devices); + free(manager); + return NULL; + } + + manager->device_count = get_device_count(); + manager->devices = malloc(manager->device_count * sizeof(pulseaudio_manager)); + + if(!manager->devices) { + fprintf(stderr, "[new_manager()] Could not allocate memory for the manager devices.\n"); + return NULL; + } + +#if 0 + if (!load_devices(manager)) { + fprintf(stderr, "No audio devices were detected. Aborting.\n"); + destroy(manager); + return NULL; + } +#endif + + return manager; +} + +/** + * @brief Callback function to process the PulseAudio server information. + * + * This callback is invoked once the server information is available. It retrieves the default device name + * from the server response and determines the active device by matching the name with the available devices + * in the manager's list. + * + * @param c Pointer to the PulseAudio context. + * @param info Pointer to the pa_server_info structure containing the server's information. + * @param userdata User-provided data (expected to be a pointer to pulseaudio_manager). + */ +static void get_active_device_cb(pa_context *c, const pa_server_info *info, void *userdata) { + (void) c; + pulseaudio_manager *manager = (pulseaudio_manager *)userdata; + + if (!info || !info->default_sink_name) { + fprintf(stderr, "[ERROR]: Null pointer in active_device_cb.\n"); + pa_threaded_mainloop_signal(manager->mainloop, 0); + return; + } + + // Get the default device name from the server information + const char *default_device_name = info->default_sink_name; + + // Iterate over the available devices to find the active one + for (uint32_t i = 0; i < manager->device_count; i++) { + if (strcmp(manager->devices[i].code, default_device_name) == 0) { + // Set the active device pointer when a match is found + manager->active_device = &manager->devices[i]; + break; + } + } + pa_threaded_mainloop_signal(manager->mainloop, 0); +} + + +/** + * @brief Request the default device name from the PulseAudio server and determine the active device. + * + * This function initiates a request to retrieve the default device name (active device) from the PulseAudio server. + * Once the server provides this information, the active_device_cb callback is triggered to process the response. + * + * @param manager Pointer to the pulseaudio_manager instance. + */ +//TODO: REWORK THE WAITING LOGIC. +void get_active_device(pulseaudio_manager *manager) { + pa_threaded_mainloop_lock(manager->mainloop); + + // Request server information + pa_context_get_server_info(manager->context, get_active_device_cb, manager); + + // Wait until the iterate function signals that it's done + pa_threaded_mainloop_wait(manager->mainloop); + + pa_threaded_mainloop_unlock(manager->mainloop); + + // The original loop to wait for active_device_name to be set + int timeout = 50; // Number of iterations or timeout value + while (!manager->active_device->code && timeout-- > 0) { + manager->iterate(manager, NULL); + pa_threaded_mainloop_signal(manager->mainloop, 0); + } +} + + +/** + * @brief Frees the memory of a pulseaudio_manager instance. + * + * @param manager Pointer to the pulseaudio_manager instance to be deleted. + */ +void destroy(pulseaudio_manager *self) { + cleanup(self); + + if (self) { + for (uint32_t i = 0; i < self->device_count; i++) { + if (self->devices[i].code) { + free(self->devices[i].code); + self->devices[i].code = NULL; + } + if (self->devices[i].description) { + free(self->devices[i].description); + self->devices[i].description = NULL; + } + } + // Now, free profiles for each device (if they exist) + for (uint32_t i = 0; i < self->device_count; i++) { + if (self->devices[i].profiles) free(self->devices[i].profiles); + } + if (self->devices) free(self->devices); + free(self); + } +} diff --git a/v-0.05/easypulse_core.h b/v-0.05/easypulse_core.h new file mode 100644 index 0000000..9129942 --- /dev/null +++ b/v-0.05/easypulse_core.h @@ -0,0 +1,90 @@ +/** + * @file core.h + * @brief EasyPulse Library Header. + * + * EasyPulse is a library designed to provide pseudo-object oriented programming + * functions to simplify access to PulseAudio. + */ + +#ifndef EASPYPULSE_CORE_H +#define EASPYPULSE_CORE_H +#define DEBUG_MODE 0 // Debug mode flag + +#include +#include "system_query.h" +#include +#include +#include + +typedef struct { + char *name; // Name of the profile + char *description; // Description of the profile + uint32_t channels; // Number of channels this profile has +} pulseaudio_profile; + + +// Forward declarations +typedef struct pulseaudio_manager pulseaudio_manager; +typedef struct pulseaudio_device pulseaudio_device; + +/** + * @brief Represents a PulseAudio devices. + */ +struct pulseaudio_device { + uint32_t index; // Index of the device. + char *code; // Name of the device. + char *description; // Description of the device. + pa_cvolume volume; // Volume of the device. + /* pulseaudio_profile *active_profile; // Active alsa profile of this device. */ + pa_channel_map channel_map; // Channel map of the devices. + int mute; // Mute status of the devices (1 for muted, 0 for unmuted). + int min_play_channels; // The minimum number of playback channels of the device. + int max_play_channels; // The maximum number of playback channels of the device. + pulseaudio_profile *profiles; // Array of available profiles for the device + uint32_t profile_count; // Number of available profiles +}; + +/** + * @brief Represents the main manager for PulseAudio operations. + */ +struct pulseaudio_manager { + pa_threaded_mainloop *mainloop; // Mainloop for PulseAudio operations. + pa_context *context; // PulseAudio context. + pulseaudio_device *devices; // Array of available devices. + uint32_t device_count; // Count of available devices. + int pa_ready; // Indicates if PulseAudio is ready (1 for ready, 2 for error). + int devices_loaded; // Indicates if devices are loaded (0 for not loaded, 1 for loaded successfully, 2 for error). + int operations_pending; // Counter for pending operations. + pulseaudio_device *active_device; // Pointer to active device. + uint32_t current_device_index; // The devices being processed right now by the program. It's not necessarily the same as the playback device. + + bool (*initialize)(pulseaudio_manager *self); // Initializes the manager. + void (*destroy)(pulseaudio_manager *manager); // Destroys the manager. + bool (*load_devices)(pulseaudio_manager *self); // Loads available devices. + bool (*switch_device)(pulseaudio_manager *self, uint32_t devices_index); // Switches to a specified device. + bool (*set_volume)(pulseaudio_manager *self, uint32_t devices_index, float percentage); // Sets the volume to a specified percentage. + void (*get_active_device)(pulseaudio_manager *manager); // Assures that a pulseaudio operation is not pending. + void (*iterate)(pulseaudio_manager *manager, pa_operation *op); // Goes through every step of a threaded loop. + int (*get_active_profile_channels) (const pulseaudio_device *device, int device_index); // Gets the number of channels of an active profile. + //void (*get_profiles_for_device)(pulseaudio_manager *manager, const char* device_code); // Updates the profiles of a particular device. + void (*get_profile_channels)(pulseaudio_manager *manager); // Extracts profile channels by copying them to null sink. + uint32_t (*get_profile_count)(uint32_t card_index); // Gets the number of pulseaudio profiles in the system. +}; + +/** + * @brief Create a new pulseaudio_manager instance. + * @return A pointer to the newly created pulseaudio_manager instance. + */ +pulseaudio_manager* new_manager(void); + +bool load_devices(pulseaudio_manager *self); +int get_active_profile_channels(const pulseaudio_device *devices, int device_index); +bool set_volume(pulseaudio_manager *self, uint32_t devices_index, float percentage); +void iterate(pulseaudio_manager *manager, pa_operation *op); +int get_device_channels(const pulseaudio_device *devices, int devices_index); +void destroy(pulseaudio_manager *manager); +//void get_profiles_for_device(pulseaudio_manager *manager, const char* device_code); +void get_active_device(pulseaudio_manager *manager); +void get_profile_channels(pulseaudio_manager *manager); + +#endif // CORE_H diff --git a/v-0.05/examples/Makefile b/v-0.05/examples/Makefile new file mode 100644 index 0000000..6f11288 --- /dev/null +++ b/v-0.05/examples/Makefile @@ -0,0 +1,19 @@ +CC = gcc +CFLAGS = -Wall -Wextra -g -O0 + +LIB_DIR = ../ +LIB_SRC = $(LIB_DIR)*.c + +EXAMPLES_DIR = . +EXAMPLES_SRC = $(wildcard $(EXAMPLES_DIR)/*.c) +EXAMPLES_OUT = $(patsubst $(EXAMPLES_DIR)/%.c,$(EXAMPLES_DIR)/%,$(EXAMPLES_SRC)) + +all: $(EXAMPLES_OUT) + +$(EXAMPLES_DIR)/%: $(EXAMPLES_DIR)/%.c + $(CC) $(CFLAGS) $< $(LIB_SRC) -o $@ -lpulse -lasound + +clean: + rm -f $(EXAMPLES_DIR)/*~ $(EXAMPLES_OUT) + +.PHONY: all clean diff --git a/v-0.05/examples/alsa-mapper_pulseaudio-api b/v-0.05/examples/alsa-mapper_pulseaudio-api new file mode 100755 index 0000000000000000000000000000000000000000..caa8a222211d3ff8f3f05b409b9eebcd772183de GIT binary patch literal 78584 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%0DV85_d2qp@BY+`(Z6%2m2 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 literal 0 HcmV?d00001 diff --git a/v-0.05/examples/alsa-mapper_pulseaudio-api.c b/v-0.05/examples/alsa-mapper_pulseaudio-api.c new file mode 100644 index 0000000..47eb39b --- /dev/null +++ b/v-0.05/examples/alsa-mapper_pulseaudio-api.c @@ -0,0 +1,91 @@ +/** + * @file pulseaudio_alsa_mapper.c + * @brief Demonstrates how to map PulseAudio sinks to their corresponding ALSA device names. + */ + +#include +#include +#include +#include + +static const char* get_alsa_friendly_name(int card_num) { + snd_ctl_t *ctl; + char name[128]; + snprintf(name, sizeof(name), "hw:%d", card_num); + + if (snd_ctl_open(&ctl, name, 0) < 0) { + return NULL; + } + + snd_ctl_card_info_t *info; + snd_ctl_card_info_alloca(&info); + if (snd_ctl_card_info(ctl, info) < 0) { + snd_ctl_close(ctl); + return NULL; + } + + const char *friendly_name = strdup(snd_ctl_card_info_get_name(info)); + snd_ctl_close(ctl); + return friendly_name; +} + +static void sink_info_cb(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { + (void) userdata; + + if (eol > 0) { + pa_context_disconnect(c); + return; + } + + const char *udev_description = pa_proplist_gets(info->proplist, "device.description"); + const char *card_str = pa_proplist_gets(info->proplist, "alsa.card"); + const char *device_str = pa_proplist_gets(info->proplist, "alsa.device"); + + int card_num = card_str ? atoi(card_str) : -1; + const char *friendly_name = card_num != -1 ? get_alsa_friendly_name(card_num) : NULL; + + if (udev_description && card_str && device_str) { + printf("Sink: %s, UDEV description: %s, ALSA name: hw:%s,%s", info->name, udev_description, card_str, device_str); + if (friendly_name) { + printf(", Friendly ALSA name: %s", friendly_name); + free((void*)friendly_name); + } + printf("\n"); + } else if (udev_description) { + printf("Sink: %s, UDEV description: %s, Incomplete ALSA name information.\n", info->name, udev_description); + } +} + +static void context_state_cb(pa_context *c, void *userdata) { + switch (pa_context_get_state(c)) { + case PA_CONTEXT_READY: + pa_context_get_sink_info_list(c, sink_info_cb, NULL); + break; + case PA_CONTEXT_FAILED: + case PA_CONTEXT_TERMINATED: + pa_mainloop_quit((pa_mainloop*)userdata, 0); + break; + default: + break; + } +} + +int main(void) { + pa_mainloop *mainloop; + pa_mainloop_api *mainloop_api; + pa_context *context; + + mainloop = pa_mainloop_new(); + mainloop_api = pa_mainloop_get_api(mainloop); + context = pa_context_new(mainloop_api, "udev_description_fetcher"); + + pa_context_set_state_callback(context, context_state_cb, mainloop); + pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, NULL); + + pa_mainloop_run(mainloop, NULL); + + pa_context_unref(context); + pa_mainloop_free(mainloop); + + return 0; +} diff --git a/v-0.05/examples/change-speaker-mode b/v-0.05/examples/change-speaker-mode new file mode 100755 index 0000000000000000000000000000000000000000..1c38674f5c5d5c5a180c3b346019492b5de5aae1 GIT binary patch literal 70768 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 Lb>Sd5kHP-}@rfk5 literal 0 HcmV?d00001 diff --git a/v-0.05/examples/change-speaker-mode.c b/v-0.05/examples/change-speaker-mode.c new file mode 100644 index 0000000..64fa962 --- /dev/null +++ b/v-0.05/examples/change-speaker-mode.c @@ -0,0 +1,88 @@ +/** + * @file sample_program.c + * @brief PulseAudio Mode Selector + * + * This program is designed to manage the audio mode of the active PulseAudio sink. + * + * The program performs the following tasks: + * - Initializes the PulseAudio manager. + * - Detects and displays the current mode of the active device. + * - Lists audio modes supported by the active device based on its number of channels. + * - Prompts the user to select a desired mode from the list. + * - Sets the active device to the mode selected by the user. + * + * The available modes include: mono, stereo, 4.0, 5.0, 5.1, and 7.1. The program lists + * modes dynamically, ensuring that only those supported by the active device are presented. + * + * @date 10-15-2023 (creation date) + */ + +#include "../easypulse_core.h" +#include + +int main(void) { + // Initialize the pulseaudio_manager + pulseaudio_manager *manager = new_manager(); + //pulseaudio_manager *self = manager; + + if (!manager) { + fprintf(stderr, "Failed to initialize PulseAudio manager.\n"); + return 1; + } + + #if 0 + // Detect the current mode of the active device + const char* current_mode = manager->get_device_mode_by_code(manager, manager->active_device->code); + printf("Current mode of the active device (%s): %s\n", manager->active_device->code, current_mode); + + // List available modes based on the number of channels of the active device + printf("\nAvailable modes:\n"); + printf("1. mono\n"); + printf("2. stereo\n"); + + int max_choice = 2; // To keep track of the maximum mode choice number + uint32_t channels = manager->active_device->number_of_channels; + + if (channels >= 4) { + printf("3. 4.0\n"); + max_choice = 3; + } + if (channels >= 5) { + printf("4. 5.0\n"); + max_choice = 4; + } + if (channels >= 6) { + printf("5. 5.1\n"); + max_choice = 5; + } + if (channels >= 8) { + printf("6. 7.1\n"); + max_choice = 6; + } + + // Prompt the user to select a mode + printf("\nEnter the number corresponding to the desired mode: "); + int choice; + scanf("%d", &choice); + + if (choice < 1 || choice > max_choice) { + printf("Invalid choice.\n"); + manager->destroy(self); + return 1; + } + + const char* mode_choices[] = {"mono", "stereo", "4.0", "5.0", "5.1", "7.1"}; + const char* mode_to_set = mode_choices[choice - 1]; + + // Set the mode of the active device + if (manager->set_device_mode_by_code(manager, manager->active_device->code, mode_to_set)) { + printf("Mode set to %s successfully!\n", mode_to_set); + } else { + fprintf(stderr, "Failed to set the mode.\n"); + } + + // Cleanup + manager->destroy(self); + return 0; + #endif +} diff --git a/v-0.05/examples/error.txt b/v-0.05/examples/error.txt new file mode 100644 index 0000000..edb3387 --- /dev/null +++ b/v-0.05/examples/error.txt @@ -0,0 +1,103 @@ +Operation state at cycle 0: 0 +Operation state at cycle 1: 0 +Operation state at cycle 2: 0 +Operation state at cycle 3: 0 +Operation state at cycle 4: 0 +Operation state at cycle 5: 0 +Operation state at cycle 6: 0 +Operation state at cycle 7: 0 +Operation state at cycle 8: 0 +Operation state at cycle 9: 0 +Operation state at cycle 10: 0 +Operation state at cycle 11: 0 +Operation state at cycle 12: 0 +Operation state at cycle 13: 0 +Operation state at cycle 14: 0 +Operation state at cycle 15: 0 +Operation state at cycle 16: 0 +Operation state at cycle 17: 0 +Operation state at cycle 18: 0 +Operation state at cycle 19: 0 +Operation state at cycle 20: 0 +Operation state at cycle 21: 1 +Operation state at cycle 0: 0 +Operation state at cycle 1: 0 +Operation state at cycle 2: 0 +Operation state at cycle 3: 0 +Operation state at cycle 4: 0 +Operation state at cycle 5: 0 +Operation state at cycle 6: 0 +Operation state at cycle 7: 0 +Operation state at cycle 8: 0 +Operation state at cycle 9: 0 +Operation state at cycle 10: 0 +Operation state at cycle 11: 0 +Operation state at cycle 12: 0 +Operation state at cycle 13: 0 +Operation state at cycle 14: 0 +Operation state at cycle 15: 0 +Operation state at cycle 16: 0 +Operation state at cycle 17: 0 +Operation state at cycle 18: 0 +Operation state at cycle 19: 0 +Operation state at cycle 20: 0 +Operation state at cycle 21: 0 +Operation state at cycle 22: 0 +Operation state at cycle 23: 0 +Operation state at cycle 24: 0 +Operation state at cycle 25: 0 +Operation state at cycle 26: 0 +Operation state at cycle 27: 0 +Operation state at cycle 28: 0 +Operation state at cycle 29: 0 +Operation state at cycle 30: 0 +Operation state at cycle 31: 0 +Operation state at cycle 32: 0 +Operation state at cycle 33: 0 +Operation state at cycle 34: 0 +Operation state at cycle 35: 0 +Operation state at cycle 36: 0 +Operation state at cycle 37: 0 +Operation state at cycle 38: 0 +Operation state at cycle 39: 0 +Operation state at cycle 40: 0 +Operation state at cycle 41: 0 +Operation state at cycle 42: 0 +Operation state at cycle 43: 0 +Operation state at cycle 44: 0 +Operation state at cycle 45: 0 +Operation state at cycle 46: 0 +Operation state at cycle 47: 0 +Operation state at cycle 48: 0 +Operation state at cycle 49: 0 +Operation state at cycle 50: 0 +Operation state at cycle 51: 0 +Operation state at cycle 52: 0 +Operation state at cycle 53: 0 +Operation state at cycle 54: 0 +Operation state at cycle 55: 0 +Operation state at cycle 56: 0 +Operation state at cycle 57: 0 +Operation state at cycle 58: 0 +Operation state at cycle 59: 0 +Operation state at cycle 60: 0 +Operation state at cycle 61: 1 +Operation state at cycle 0: 0 +Operation state at cycle 1: 0 +Operation state at cycle 2: 0 +Operation state at cycle 3: 0 +Operation state at cycle 4: 0 +Operation state at cycle 5: 0 +Operation state at cycle 6: 0 +Operation state at cycle 7: 0 +Operation state at cycle 8: 0 +Operation state at cycle 9: 0 +Operation state at cycle 10: 0 +Operation state at cycle 11: 0 +Operation state at cycle 12: 0 +Operation state at cycle 13: 0 +Operation state at cycle 14: 0 +Operation state at cycle 15: 0 +Operation state at cycle 16: 0 +Operation state at cycle 17: 0 +Assertion '!m->thread || !pa_thread_is_running(m->thread) || !in_worker(m) || pa_atomic_load(&m->in_once_unlocked)' failed at ../pulseaudio/src/pulse/thread-mainloop.c:179, function pa_threaded_mainloop_lock(). Aborting. diff --git a/v-0.05/examples/get-card-profiles-pulseaudio_api b/v-0.05/examples/get-card-profiles-pulseaudio_api new file mode 100755 index 0000000000000000000000000000000000000000..52d68608fc16b2116d6bf73e0beb6f6b61662ecb GIT binary patch literal 71984 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 literal 0 HcmV?d00001 diff --git a/v-0.05/examples/get-card-profiles-pulseaudio_api.c b/v-0.05/examples/get-card-profiles-pulseaudio_api.c new file mode 100644 index 0000000..6f6c112 --- /dev/null +++ b/v-0.05/examples/get-card-profiles-pulseaudio_api.c @@ -0,0 +1,63 @@ +/** + * @file get-card-profiles-pulseaudio_api.c + * @brief This program queries and displays information about available sound devices in a computer. + * + * It uses the PulseAudio library to interact with the sound system and retrieve information about + * available sound devices, their properties, and ALSA (Advanced Linux Sound Architecture) related data. + */ + +#include +#include "../easypulse_core.h" + +int main(void) { + // Query the total number of PulseAudio devices + uint32_t total_devices = get_device_count(); + + printf("Total sound devices in this computer:%lu\n", (unsigned long) total_devices); + printf("Available PulseAudio sound devices:\n"); + + pa_sink_info **sink_info = get_available_sinks(); + if (!sink_info) { + fprintf(stderr, "Error: Could not retrieve sound device information.\n"); + return 1; + } + + for (uint32_t i = 0; i < total_devices; i++) { + if (!sink_info[i]) { + fprintf(stderr, "Error: sound device information at index %u is NULL.\n", i); + continue; + } + + // Display sink name + printf("\n- Sound device name: %s\n", sink_info[i]->name ? sink_info[i]->name : "NULL"); + printf("\n- Sound device description: %s\n", sink_info[i]->description ? sink_info[i]->description : "NULL"); + + // Query and display the number of profiles + uint32_t profile_count = get_profile_count(i); + printf(" - Number of profiles: %u\n", profile_count); + + // Get and display the ALSA name + const char *alsa_name = get_alsa_name(sink_info[i]->name); + const char *alsa_id = get_alsa_id(sink_info[i]->name); + int sample_rate = get_sample_rate(alsa_id, sink_info[i]); + + printf(" - Sample rate: %i\n", sample_rate); + printf("\n- Alsa ID is: %s\n", alsa_id ? alsa_id : "NULL"); + + if (alsa_name) { + printf(" - ALSA name: %s\n", alsa_name); + } else { + printf(" - No corresponding ALSA name found.\n"); + } + // Get and display the minimum and maximum channels + int min_channels = get_min_channels(alsa_id, sink_info[i]); + int max_channels = get_max_channels(alsa_id, sink_info[i]); + + if(min_channels > 0) printf(" - Minimum channels: %d\n", min_channels); + if(max_channels > 0) printf(" - Maximum channels: %d\n", max_channels); + free((char *)alsa_name); // Free the memory allocated for alsa_name + } + + delete_devices(sink_info); + return 0; +} diff --git a/v-0.05/examples/switch-sink b/v-0.05/examples/switch-sink new file mode 100755 index 0000000000000000000000000000000000000000..39a03e78632498729ebd9bfd3f540cffc4db683b GIT binary patch literal 71280 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 literal 0 HcmV?d00001 diff --git a/v-0.05/examples/switch-sink-pulseaudio b/v-0.05/examples/switch-sink-pulseaudio new file mode 100755 index 0000000000000000000000000000000000000000..484ea507f702696bacc1035add0828a45fe479a3 GIT binary patch literal 73504 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