| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 | #include "squeezelite.h"static log_level loglevel;static bool running = true;extern struct outputstate output;extern struct buffer *outputbuf;extern struct buffer *streambuf;#define LOCK   mutex_lock(outputbuf->mutex)#define UNLOCK mutex_unlock(outputbuf->mutex)#define FRAME_BLOCK MAX_SILENCE_FRAMESextern u8_t *silencebuf;extern u8_t *bt_optr;void hal_bluetooth_init(log_level);static int _write_frames(frames_t out_frames, bool silence, s32_t gainL, s32_t gainR,								s32_t cross_gain_in, s32_t cross_gain_out, ISAMPLE_T **cross_ptr);#if BTAUDIOvoid set_volume(unsigned left, unsigned right) {	LOG_DEBUG("setting internal gain left: %u right: %u", left, right);	LOCK;	output.gainL = left;	output.gainR = right;	UNLOCK;}#endifvoid output_init_bt(log_level level, char *device, unsigned output_buf_size, char *params, unsigned rates[], unsigned rate_delay, unsigned idle) {	loglevel = level;	LOG_INFO("init output BT");	memset(&output, 0, sizeof(output));	output.start_frames = FRAME_BLOCK; //CONFIG_ //FRAME_BLOCK * 2;	output.write_cb = &_write_frames;	output.rate_delay = rate_delay;	// ensure output rate is specified to avoid test open	if (!rates[0]) {		rates[0] = 44100;	}	hal_bluetooth_init(loglevel);/* * Bluetooth audio source init Start */	device = CONFIG_OUTPUT_NAME;	output_init_common(level, device, output_buf_size, rates, idle);}void output_close_bt(void) {	LOG_INFO("close output");	LOCK;	running = false;	UNLOCK;	output_close_common();}static int _write_frames(frames_t out_frames, bool silence, s32_t gainL, s32_t gainR,						 s32_t cross_gain_in, s32_t cross_gain_out, ISAMPLE_T **cross_ptr) {	if (!silence ) {		DEBUG_LOG_TIMED(200,"Not silence, Writing audio out.");		// TODO need 16 bit fix		if (output.fade == FADE_ACTIVE && output.fade_dir == FADE_CROSS && *cross_ptr) {			_apply_cross(outputbuf, out_frames, cross_gain_in, cross_gain_out, cross_ptr);		}		if (gainL != FIXED_ONE || gainR!= FIXED_ONE) {			_apply_gain(outputbuf, out_frames, gainL, gainR);		}#if BYTES_PER_FRAME == 4		memcpy(bt_optr, outputbuf->readp, out_frames * BYTES_PER_FRAME);#else	{		frames_t count = out_frames;		s32_t *_iptr = (s32_t*) outputbuf->readp;		s16_t *_optr = (s16_t*) bt_optr;		while (count--) {			*_optr++ = *_iptr++ >> 16;			*_optr++ = *_iptr++ >> 16;		}	}#endif	} else {		DEBUG_LOG_TIMED(200,"Silence flag true. Writing silence to audio out.");		u8_t *buf = silencebuf;		memcpy(bt_optr, buf, out_frames * 4);	}	bt_optr += out_frames * 4;	return (int)out_frames;}
 |