|  | @@ -25,23 +25,23 @@ const char * desc_spdif= "SPDIF Options";
 | 
	
		
			
				|  |  |  const char * desc_audio= "General Audio Options";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -#define CODECS_BASE "flac,pcm,mp3,ogg"
 | 
	
		
			
				|  |  | +#define CODECS_BASE "flac|pcm|mp3|ogg"
 | 
	
		
			
				|  |  |  #if NO_FAAD
 | 
	
		
			
				|  |  |  #define CODECS_AAC  ""
 | 
	
		
			
				|  |  |  #else
 | 
	
		
			
				|  |  | -#define CODECS_AAC  ",aac"
 | 
	
		
			
				|  |  | +#define CODECS_AAC  "|aac"
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  #if FFMPEG
 | 
	
		
			
				|  |  | -#define CODECS_FF   ",wma,alac"
 | 
	
		
			
				|  |  | +#define CODECS_FF   "|wma|alac"
 | 
	
		
			
				|  |  |  #else
 | 
	
		
			
				|  |  |  #define CODECS_FF   ""
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  #if DSD
 | 
	
		
			
				|  |  | -#define CODECS_DSD  ",dsd"
 | 
	
		
			
				|  |  | +#define CODECS_DSD  "|dsd"
 | 
	
		
			
				|  |  |  #else
 | 
	
		
			
				|  |  |  #define CODECS_DSD  ""
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  | -#define CODECS_MP3  " (mad,mpg for specific mp3 codec)"
 | 
	
		
			
				|  |  | +#define CODECS_MP3  "|mad|mpg"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #define CODECS CODECS_BASE CODECS_AAC CODECS_FF CODECS_DSD CODECS_MP3
 | 
	
		
			
				|  |  |  #define NOT_OUTPUT "has input capabilities only"
 | 
	
	
		
			
				|  | @@ -75,6 +75,8 @@ static struct {
 | 
	
		
			
				|  |  |      struct arg_end *end;
 | 
	
		
			
				|  |  |  } audio_args;
 | 
	
		
			
				|  |  |  static struct {
 | 
	
		
			
				|  |  | +	struct arg_str * output_device; // "  -d <log>=<level>\tSet logging level, logs: all|slimproto|stream|decode|output|ir, level: info|debug|sdebug\n"
 | 
	
		
			
				|  |  | +	struct arg_str * name;//			   "  -n <name>\t\tSet the player name\n"
 | 
	
		
			
				|  |  |  	struct arg_str * server; // -s <server>[:<port>]\tConnect to specified server, otherwise uses autodiscovery to find server\n"
 | 
	
		
			
				|  |  |  	struct arg_str * buffers;//			   "  -b <stream>:<output>\tSpecify internal Stream and Output buffer sizes in Kbytes\n"
 | 
	
		
			
				|  |  |  	struct arg_str * codecs;//			   "  -c <codec1>,<codec2>\tRestrict codecs to those specified, otherwise load all available codecs; known codecs: " CODECS "\n"
 | 
	
	
		
			
				|  | @@ -88,7 +90,6 @@ static struct {
 | 
	
		
			
				|  |  |  	#if IR
 | 
	
		
			
				|  |  |  	struct arg_str * log_level_ir;
 | 
	
		
			
				|  |  |  	#endif
 | 
	
		
			
				|  |  | -	struct arg_str * output_device; // "  -d <log>=<level>\tSet logging level, logs: all|slimproto|stream|decode|output|ir, level: info|debug|sdebug\n"
 | 
	
		
			
				|  |  |  	//			   "  -e <codec1>,<codec2>\tExplicitly exclude native support of one or more codecs; known codecs: " CODECS "\n"
 | 
	
		
			
				|  |  |  	//			   "  -f <logfile>\t\tWrite debug to logfile\n"
 | 
	
		
			
				|  |  |  	//	#if IR
 | 
	
	
		
			
				|  | @@ -96,7 +97,6 @@ static struct {
 | 
	
		
			
				|  |  |  	//	#endif
 | 
	
		
			
				|  |  |  	struct arg_str * mac_addr; //			   "  -m <mac addr>\t\tSet mac address, format: ab:cd:ef:12:34:56\n"
 | 
	
		
			
				|  |  |  	struct arg_str * model_name;//			   "  -M <modelname>\tSet the squeezelite player model name sent to the server (default: " MODEL_NAME_STRING ")\n"
 | 
	
		
			
				|  |  | -	struct arg_str * name;//			   "  -n <name>\t\tSet the player name\n"
 | 
	
		
			
				|  |  |  	struct arg_lit * header_format;//			   "  -W\t\t\tRead wave and aiff format from header, ignore server parameters\n"
 | 
	
		
			
				|  |  |  	struct arg_str * rates; //			   "  -r <rates>[:<delay>]\tSample rates supported, allows output to be off when squeezelite is started; rates = <maxrate>|<minrate>-<maxrate>|<rate1>,<rate2>,<rate3>; delay = optional delay switching rates in ms\n"
 | 
	
		
			
				|  |  |  	#if RESAMPLE
 | 
	
	
		
			
				|  | @@ -160,10 +160,10 @@ static int do_audio_cmd(int argc, char **argv){
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      if(audio_args.jack_behavior->count>0){
 | 
	
		
			
				|  |  |          err = ESP_OK; // suppress any error code that might have happened in a previous step
 | 
	
		
			
				|  |  | -        if(strcasecmp(audio_args.jack_behavior->sval[0],"Headphones")){
 | 
	
		
			
				|  |  | +        if(strcasecmp(audio_args.jack_behavior->sval[0],"Headphones")==0){
 | 
	
		
			
				|  |  |              err = config_set_value(NVS_TYPE_STR, "jack_mutes_amp", "y");
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        else if(strcasecmp(audio_args.jack_behavior->sval[0],"Subwoofer")){
 | 
	
		
			
				|  |  | +        else if(strcasecmp(audio_args.jack_behavior->sval[0],"Subwoofer")==0){
 | 
	
		
			
				|  |  |              err = config_set_value(NVS_TYPE_STR, "jack_mutes_amp", "n");
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          else {
 | 
	
	
		
			
				|  | @@ -382,7 +382,7 @@ cJSON * spdif_cb(){
 | 
	
		
			
				|  |  |  cJSON * audio_cb(){
 | 
	
		
			
				|  |  |  	cJSON * values = cJSON_CreateObject();
 | 
	
		
			
				|  |  |  	char * 	p = config_alloc_get_default(NVS_TYPE_STR, "jack_mutes_amp", "n", 0);
 | 
	
		
			
				|  |  | -    cJSON_AddBoolToObject(values,"jack_behavior",(strcmp(p,"1") == 0 ||strcasecmp(p,"y") == 0));
 | 
	
		
			
				|  |  | +    cJSON_AddStringToObject(values,"jack_behavior",(strcmp(p,"1") == 0 ||strcasecmp(p,"y") == 0)?"Headphones":"Subwoofer");
 | 
	
		
			
				|  |  |      FREE_AND_NULL(p);    
 | 
	
		
			
				|  |  |  	return values;
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -561,7 +561,7 @@ static void register_audio_config(void){
 | 
	
		
			
				|  |  |  static void register_squeezelite_config(void){
 | 
	
		
			
				|  |  |  	squeezelite_args.server = arg_str0("s","server","<server>[:<port>]","Connect to specified server, otherwise uses autodiscovery to find server");
 | 
	
		
			
				|  |  |  	squeezelite_args.buffers = arg_str0("b","buffers","<stream>:<output>","Internal Stream and Output buffer sizes in Kbytes");
 | 
	
		
			
				|  |  | -	squeezelite_args.codecs = arg_strn("c","codecs","<codec1>,<codec2>",0,20,"Restrict codecs to those specified, otherwise load all available codecs; known codecs");
 | 
	
		
			
				|  |  | +	squeezelite_args.codecs = arg_strn("c","codecs","+" CODECS "+",0,20,"Restrict codecs to those specified, otherwise load all available codecs; known codecs: " CODECS );
 | 
	
		
			
				|  |  |  	squeezelite_args.timeout = arg_int0("C","timeout","<n>","Close output device when idle after timeout seconds, default is to keep it open while player is 'on");
 | 
	
		
			
				|  |  |  	squeezelite_args.log_level = arg_str0("d","loglevel","log=level","Set logging level, logs: all|slimproto|stream|decode|output|ir, level: info|debug|sdebug"); // "  -d <log>=<level>\tSet logging level, logs: all|slimproto|stream|decode|output|ir, level: info|debug|sdebug\n"
 | 
	
		
			
				|  |  |  //	squeezelite_args.log_level_all = arg_str0(NULL,"all",get_log_level_options("all"),"Overall Logging Level");
 | 
	
	
		
			
				|  | @@ -573,10 +573,10 @@ static void register_squeezelite_config(void){
 | 
	
		
			
				|  |  |  	squeezelite_args.log_level_ir= arg_str0(NULL,"loglevel_ir",get_log_level_options("ir"),"IR Logging Level");
 | 
	
		
			
				|  |  |  	#endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	squeezelite_args.output_device = arg_str0("o","output_device","<string>","Output device");
 | 
	
		
			
				|  |  | -	squeezelite_args.mac_addr = arg_str0("m","mac_addr","<string>","Mac address, format: ab:cd:ef:12:34:56");
 | 
	
		
			
				|  |  | -	squeezelite_args.model_name = arg_str0("M", "modelname", "<string>","Squeezelite player model name sent to the server");
 | 
	
		
			
				|  |  | -	squeezelite_args.name = arg_str0("n","name","<string>","Player name");
 | 
	
		
			
				|  |  | +	squeezelite_args.output_device = arg_str0("o","output_device","<string>","Output device (BT, I2S or SPDIF)");
 | 
	
		
			
				|  |  | +	squeezelite_args.mac_addr = arg_str0("m","mac_addr","<string>","Mac address, format: ab:cd:ef:12:34:56.");
 | 
	
		
			
				|  |  | +	squeezelite_args.model_name = arg_str0("M", "modelname", "<string>","Set the squeezelite player model name sent to the server (default: " MODEL_NAME ")");
 | 
	
		
			
				|  |  | +	squeezelite_args.name = arg_str0("n","name","<string>","Player name, if different from the current host name. Name can alternatively be assigned from the system/device name configuration.");
 | 
	
		
			
				|  |  |  	squeezelite_args.header_format = arg_lit0("W","header_format","Read wave and aiff format from header, ignore server parameters");
 | 
	
		
			
				|  |  |  	squeezelite_args.rates = arg_str0("r","rates","<rates>[:<delay>]", "Sample rates supported, allows output to be off when squeezelite is started; rates = <maxrate>|<minrate>-<maxrate>|<rate1>,<rate2>,<rate3>; delay = optional delay switching rates in ms\n");
 | 
	
		
			
				|  |  |  	#if RESAMPLE
 |