mirror of
https://github.com/sle118/squeezelite-esp32.git
synced 2025-12-06 19:47:02 +03:00
77 lines
2.3 KiB
C
77 lines
2.3 KiB
C
/*
|
|
* Squeezelite - lightweight headless squeezebox emulator
|
|
*
|
|
* (c) Adrian Smith 2012-2015, triode1@btinternet.com
|
|
* Ralph Irving 2015-2017, ralph_irving@hotmail.com
|
|
* Philippe_44 2020, philippe_44@outloook.com
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
#include "squeezelite.h"
|
|
|
|
#define VISUEXPORT_SIZE 2048
|
|
|
|
EXT_BSS struct visu_export_s visu_export;
|
|
static struct visu_export_s *visu = &visu_export;
|
|
|
|
static log_level loglevel = lINFO;
|
|
|
|
void output_visu_export(s16_t *frames, frames_t out_frames, u32_t rate, bool silence) {
|
|
|
|
// no data to process
|
|
if (silence) {
|
|
visu->running = false;
|
|
return;
|
|
}
|
|
|
|
// do not block, try to stuff data put wait for consumer to have used them
|
|
if (!pthread_mutex_trylock(&visu->mutex)) {
|
|
// don't mix sample rates
|
|
if (visu->rate != rate) visu->level = 0;
|
|
|
|
// stuff buffer up and wait for consumer to read it (should reset level)
|
|
if (visu->level < visu->size) {
|
|
u32_t space = min(visu->size - visu->level, out_frames * 2) * 2;
|
|
memcpy(visu->buffer + visu->level, frames, space);
|
|
|
|
visu->level += space / 2;
|
|
visu->running = true;
|
|
visu->rate = rate ? rate : 44100;
|
|
}
|
|
|
|
// mutex must be released
|
|
pthread_mutex_unlock(&visu->mutex);
|
|
}
|
|
}
|
|
|
|
void output_visu_close(void) {
|
|
pthread_mutex_lock(&visu->mutex);
|
|
visu->running = false;
|
|
free(visu->buffer);
|
|
pthread_mutex_unlock(&visu->mutex);
|
|
}
|
|
|
|
void output_visu_init(log_level level) {
|
|
loglevel = level;
|
|
pthread_mutex_init(&visu->mutex, NULL);
|
|
visu->size = VISUEXPORT_SIZE;
|
|
visu->running = false;
|
|
visu->rate = 44100;
|
|
visu->buffer = malloc(VISUEXPORT_SIZE * sizeof(s16_t) * 2);
|
|
LOG_INFO("Initialize VISUEXPORT %u 16 bits samples", VISUEXPORT_SIZE);
|
|
}
|
|
|