/* 
 *  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, u32_t gain) {
	
	// 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;
			visu->gain = gain;
		}
		
		// 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);
}