--- linuxsampler/trunk/src/network/lscp.y 2005/02/21 04:28:50 397 +++ linuxsampler/trunk/src/network/lscp.y 2006/11/27 21:34:55 947 @@ -3,6 +3,7 @@ * LinuxSampler - modular, streaming capable sampler * * * * Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck * + * Copyright (C) 2005, 2006 Christian Schoenebeck * * * * 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 * @@ -20,8 +21,12 @@ * MA 02111-1307 USA * ***************************************************************************/ -/* Note: don't forget to run 'make parser' after you changed this file, */ -/* otherwise the parser will not be regenerated! */ +/* CAUTION: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ +/* */ +/* don't forget to run 'make parser' after you changed this file, */ +/* otherwise the parser will not be regenerated ! */ +/* */ +/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ %{ @@ -67,10 +72,11 @@ %type char digit %type dotnum volume_value boolean -%type number sampler_channel instrument_index audio_channel_index device_index midi_input_channel_index midi_input_port_index -%type string text stringval digits param_val filename engine_name command create_instruction destroy_instruction get_instruction list_instruction load_instruction set_chan_instruction load_instr_args load_engine_args audio_output_type_name midi_input_type_name set_instruction subscribe_event unsubscribe_event +%type number sampler_channel instrument_index audio_channel_index device_index midi_input_channel_index midi_input_port_index midi_bank_msb midi_bank_lsb midi_prog +%type string text stringval digits param_val_list param_val filename entry_name engine_name command create_instruction destroy_instruction get_instruction list_instruction load_instruction set_chan_instruction load_instr_args load_engine_args audio_output_type_name midi_input_type_name remove_instruction unmap_instruction set_instruction subscribe_event unsubscribe_event map_instruction reset_instruction clear_instruction %type buffer_size_type %type key_val_list +%type instr_load_mode %start input @@ -78,6 +84,14 @@ //TODO: return more meaningful error messages +/* + The LSCP specification input file (Documentation/lscp.xml) is automatically + updated with this file using the scripts/update_grammar.pl script. Do not + modify or delete the GRAMMAR_BNF_BEGIN and GRAMMAR_BNF_END lines ! +*/ + +// GRAMMAR_BNF_BEGIN - do NOT delete or modify this line !!! + input : line LF | line CR LF ; @@ -85,7 +99,7 @@ line : /* epsilon (empty line ignored) */ { return LSCP_DONE; } | comment { return LSCP_DONE; } | command { LSCPSERVER->AnswerClient($1); return LSCP_DONE; } - | error { LSCPSERVER->AnswerClient("Err:0:Unknown command.\r\n"); RESTART; return LSCP_SYNTAX_ERROR; } + | error { LSCPSERVER->AnswerClient("ERR:0:Unknown command.\r\n"); RESTART; return LSCP_SYNTAX_ERROR; } ; comment : '#' @@ -96,35 +110,52 @@ ; command : ADD SP CHANNEL { $$ = LSCPSERVER->AddChannel(); } + | MAP SP map_instruction { $$ = $3; } + | UNMAP SP unmap_instruction { $$ = $3; } | GET SP get_instruction { $$ = $3; } | CREATE SP create_instruction { $$ = $3; } | DESTROY SP destroy_instruction { $$ = $3; } | LIST SP list_instruction { $$ = $3; } | LOAD SP load_instruction { $$ = $3; } - | REMOVE SP CHANNEL SP sampler_channel { $$ = LSCPSERVER->RemoveChannel($5); } + | REMOVE SP remove_instruction { $$ = $3; } | SET SP set_instruction { $$ = $3; } | SUBSCRIBE SP subscribe_event { $$ = $3; } | UNSUBSCRIBE SP unsubscribe_event { $$ = $3; } | SELECT SP text { $$ = LSCPSERVER->QueryDatabase($3); } - | RESET SP CHANNEL SP sampler_channel { $$ = LSCPSERVER->ResetChannel($5); } + | RESET SP reset_instruction { $$ = $3; } + | CLEAR SP clear_instruction { $$ = $3; } | RESET { $$ = LSCPSERVER->ResetSampler(); } | QUIT { LSCPSERVER->AnswerClient("Bye!\r\n"); return LSCP_QUIT; } ; -subscribe_event : CHANNELS { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_channels); } - | VOICE_COUNT { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_voice_count); } - | STREAM_COUNT { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_stream_count); } - | BUFFER_FILL { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_buffer_fill); } - | INFO { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_info); } - | MISCELLANEOUS { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_misc); } +subscribe_event : CHANNEL_COUNT { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_channel_count); } + | VOICE_COUNT { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_voice_count); } + | STREAM_COUNT { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_stream_count); } + | BUFFER_FILL { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_buffer_fill); } + | CHANNEL_INFO { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_channel_info); } + | MISCELLANEOUS { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_misc); } + | TOTAL_VOICE_COUNT { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_total_voice_count); } + ; + +unsubscribe_event : CHANNEL_COUNT { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_channel_count); } + | VOICE_COUNT { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_voice_count); } + | STREAM_COUNT { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_stream_count); } + | BUFFER_FILL { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_buffer_fill); } + | CHANNEL_INFO { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_channel_info); } + | MISCELLANEOUS { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_misc); } + | TOTAL_VOICE_COUNT { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_total_voice_count); } + ; + +map_instruction : MIDI_INSTRUMENT SP midi_bank_msb SP midi_bank_lsb SP midi_prog SP engine_name SP filename SP instrument_index SP volume_value { $$ = LSCPSERVER->AddOrReplaceMIDIInstrumentMapping($3,$5,$7,$9,$11,$13,$15,MidiInstrumentMapper::VOID,""); } + | MIDI_INSTRUMENT SP midi_bank_msb SP midi_bank_lsb SP midi_prog SP engine_name SP filename SP instrument_index SP volume_value SP instr_load_mode { $$ = LSCPSERVER->AddOrReplaceMIDIInstrumentMapping($3,$5,$7,$9,$11,$13,$15,$17,""); } + | MIDI_INSTRUMENT SP midi_bank_msb SP midi_bank_lsb SP midi_prog SP engine_name SP filename SP instrument_index SP volume_value SP entry_name { $$ = LSCPSERVER->AddOrReplaceMIDIInstrumentMapping($3,$5,$7,$9,$11,$13,$15,MidiInstrumentMapper::VOID,$17); } + | MIDI_INSTRUMENT SP midi_bank_msb SP midi_bank_lsb SP midi_prog SP engine_name SP filename SP instrument_index SP volume_value SP instr_load_mode SP entry_name { $$ = LSCPSERVER->AddOrReplaceMIDIInstrumentMapping($3,$5,$7,$9,$11,$13,$15,$17,$19); } + ; + +unmap_instruction : MIDI_INSTRUMENT SP midi_bank_msb SP midi_bank_lsb SP midi_prog { $$ = LSCPSERVER->RemoveMIDIInstrumentMapping($3,$5,$7); } ; -unsubscribe_event : CHANNELS { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_channels); } - | VOICE_COUNT { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_voice_count); } - | STREAM_COUNT { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_stream_count); } - | BUFFER_FILL { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_buffer_fill); } - | INFO { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_info); } - | MISCELLANEOUS { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_misc); } +remove_instruction : CHANNEL SP sampler_channel { $$ = LSCPSERVER->RemoveChannel($3); } ; get_instruction : AVAILABLE_ENGINES { $$ = LSCPSERVER->GetAvailableEngines(); } @@ -150,14 +181,19 @@ | CHANNEL SP STREAM_COUNT SP sampler_channel { $$ = LSCPSERVER->GetStreamCount($5); } | CHANNEL SP VOICE_COUNT SP sampler_channel { $$ = LSCPSERVER->GetVoiceCount($5); } | ENGINE SP INFO SP engine_name { $$ = LSCPSERVER->GetEngineInfo($5); } + | SERVER SP INFO { $$ = LSCPSERVER->GetServerInfo(); } + | TOTAL_VOICE_COUNT { $$ = LSCPSERVER->GetTotalVoiceCount(); } + | TOTAL_VOICE_COUNT_MAX { $$ = LSCPSERVER->GetTotalVoiceCountMax(); } + | MIDI_INSTRUMENTS { $$ = LSCPSERVER->GetMidiIstrumentMappings(); } + | MIDI_INSTRUMENT SP INFO SP midi_bank_msb SP midi_bank_lsb SP midi_prog { $$ = LSCPSERVER->GetMidiInstrumentMapping($5,$7,$9); } ; -set_instruction : AUDIO_OUTPUT_DEVICE_PARAMETER SP number SP string '=' param_val { $$ = LSCPSERVER->SetAudioOutputDeviceParameter($3, $5, $7); } - | AUDIO_OUTPUT_CHANNEL_PARAMETER SP number SP number SP string '=' param_val { $$ = LSCPSERVER->SetAudioOutputChannelParameter($3, $5, $7, $9); } - | MIDI_INPUT_DEVICE_PARAMETER SP number SP string '=' param_val { $$ = LSCPSERVER->SetMidiInputDeviceParameter($3, $5, $7); } - | MIDI_INPUT_PORT_PARAMETER SP number SP number SP string '=' param_val { $$ = LSCPSERVER->SetMidiInputPortParameter($3, $5, $7, $9); } - | CHANNEL SP set_chan_instruction { $$ = $3; } - | ECHO SP boolean { $$ = LSCPSERVER->SetEcho((yyparse_param_t*) yyparse_param, $3); } +set_instruction : AUDIO_OUTPUT_DEVICE_PARAMETER SP number SP string '=' param_val_list { $$ = LSCPSERVER->SetAudioOutputDeviceParameter($3, $5, $7); } + | AUDIO_OUTPUT_CHANNEL_PARAMETER SP number SP number SP string '=' param_val_list { $$ = LSCPSERVER->SetAudioOutputChannelParameter($3, $5, $7, $9); } + | MIDI_INPUT_DEVICE_PARAMETER SP number SP string '=' param_val_list { $$ = LSCPSERVER->SetMidiInputDeviceParameter($3, $5, $7); } + | MIDI_INPUT_PORT_PARAMETER SP number SP number SP string '=' param_val_list { $$ = LSCPSERVER->SetMidiInputPortParameter($3, $5, $7, $9); } + | CHANNEL SP set_chan_instruction { $$ = $3; } + | ECHO SP boolean { $$ = LSCPSERVER->SetEcho((yyparse_param_t*) yyparse_param, $3); } ; create_instruction : AUDIO_OUTPUT_DEVICE SP string SP key_val_list { $$ = LSCPSERVER->CreateAudioOutputDevice($3,$5); } @@ -166,6 +202,12 @@ | MIDI_INPUT_DEVICE SP string { $$ = LSCPSERVER->CreateMidiInputDevice($3); } ; +reset_instruction : CHANNEL SP sampler_channel { $$ = LSCPSERVER->ResetChannel($3); } + ; + +clear_instruction : MIDI_INSTRUMENTS { $$ = LSCPSERVER->ClearMidiInstrumentMappings(); } + ; + destroy_instruction : AUDIO_OUTPUT_DEVICE SP number { $$ = LSCPSERVER->DestroyAudioOutputDevice($3); } | MIDI_INPUT_DEVICE SP number { $$ = LSCPSERVER->DestroyMidiInputDevice($3); } ; @@ -183,26 +225,37 @@ | MIDI_INPUT_CHANNEL SP sampler_channel SP midi_input_channel_index { $$ = LSCPSERVER->SetMIDIInputChannel($5, $3); } | MIDI_INPUT_TYPE SP sampler_channel SP midi_input_type_name { $$ = LSCPSERVER->SetMIDIInputType($5, $3); } | VOLUME SP sampler_channel SP volume_value { $$ = LSCPSERVER->SetVolume($5, $3); } + | MUTE SP sampler_channel SP boolean { $$ = LSCPSERVER->SetChannelMute($5, $3); } + | SOLO SP sampler_channel SP boolean { $$ = LSCPSERVER->SetChannelSolo($5, $3); } ; -key_val_list : string '=' param_val { $$[$1] = $3; } - | key_val_list SP string '=' param_val { $$ = $1; $$[$3] = $5; } +key_val_list : string '=' param_val_list { $$[$1] = $3; } + | key_val_list SP string '=' param_val_list { $$ = $1; $$[$3] = $5; } ; buffer_size_type : BYTES { $$ = fill_response_bytes; } | PERCENTAGE { $$ = fill_response_percentage; } ; -list_instruction : AUDIO_OUTPUT_DEVICES { $$ = LSCPSERVER->GetAudioOutputDevices(); } - | MIDI_INPUT_DEVICES { $$ = LSCPSERVER->GetMidiInputDevices(); } - | CHANNELS { $$ = LSCPSERVER->ListChannels(); } +list_instruction : AUDIO_OUTPUT_DEVICES { $$ = LSCPSERVER->GetAudioOutputDevices(); } + | MIDI_INPUT_DEVICES { $$ = LSCPSERVER->GetMidiInputDevices(); } + | CHANNELS { $$ = LSCPSERVER->ListChannels(); } + | AVAILABLE_ENGINES { $$ = LSCPSERVER->ListAvailableEngines(); } + | AVAILABLE_MIDI_INPUT_DRIVERS { $$ = LSCPSERVER->ListAvailableMidiInputDrivers(); } + | AVAILABLE_AUDIO_OUTPUT_DRIVERS { $$ = LSCPSERVER->ListAvailableAudioOutputDrivers(); } + | MIDI_INSTRUMENTS { $$ = LSCPSERVER->ListMidiInstrumentMappings(); } ; load_instr_args : filename SP instrument_index SP sampler_channel { $$ = LSCPSERVER->LoadInstrument($1, $3, $5); } | NON_MODAL SP filename SP instrument_index SP sampler_channel { $$ = LSCPSERVER->LoadInstrument($3, $5, $7, true); } ; -load_engine_args : engine_name SP sampler_channel { $$ = LSCPSERVER->LoadEngine($1, $3); } +load_engine_args : engine_name SP sampler_channel { $$ = LSCPSERVER->SetEngineType($1, $3); } + ; + +instr_load_mode : ON_DEMAND { $$ = MidiInstrumentMapper::ON_DEMAND; } + | ON_DEMAND_HOLD { $$ = MidiInstrumentMapper::ON_DEMAND_HOLD; } + | PERSISTENT { $$ = MidiInstrumentMapper::PERSISTENT; } ; device_index : number @@ -224,6 +277,15 @@ midi_input_type_name : string ; +midi_bank_msb : number + ; + +midi_bank_lsb : number + ; + +midi_prog : number + ; + volume_value : dotnum | number { $$ = $1; } ; @@ -240,12 +302,21 @@ filename : stringval ; +entry_name : stringval + ; + +param_val_list : param_val + | param_val_list','param_val { $$ = $1 + "," + $3; } + ; + param_val : string | stringval - | number { std::stringstream ss; ss << $1; $$ = ss.str(); } - | dotnum { std::stringstream ss; ss << $1; $$ = ss.str(); } + | number { std::stringstream ss; ss << "\'" << $1 << "\'"; $$ = ss.str(); } + | dotnum { std::stringstream ss; ss << "\'" << $1 << "\'"; $$ = ss.str(); } ; +// GRAMMAR_BNF_END - do NOT delete or modify this line !!! + // atomic variable symbol rules @@ -370,6 +441,15 @@ GET : 'G''E''T' ; +MAP : 'M''A''P' + ; + +UNMAP : 'U''N''M''A''P' + ; + +CLEAR : 'C''L''E''A''R' + ; + CREATE : 'C''R''E''A''T''E' ; @@ -418,6 +498,12 @@ INFO : 'I''N''F''O' ; +CHANNEL_COUNT : 'C''H''A''N''N''E''L''_''C''O''U''N''T' + ; + +CHANNEL_INFO : 'C''H''A''N''N''E''L''_''I''N''F''O' + ; + BUFFER_FILL : 'B''U''F''F''E''R''_''F''I''L''L' ; @@ -427,12 +513,27 @@ VOICE_COUNT : 'V''O''I''C''E''_''C''O''U''N''T' ; +TOTAL_VOICE_COUNT : 'T''O''T''A''L''_''V''O''I''C''E''_''C''O''U''N''T' + ; + +TOTAL_VOICE_COUNT_MAX: 'T''O''T''A''L''_''V''O''I''C''E''_''C''O''U''N''T''_''M''A''X' + ; + INSTRUMENT : 'I''N''S''T''R''U''M''E''N''T' ; ENGINE : 'E' 'N' 'G' 'I' 'N' 'E' ; +ON_DEMAND : 'O''N''_''D''E''M''A''N''D' + ; + +ON_DEMAND_HOLD : 'O''N''_''D''E''M''A''N''D''_''H''O''L''D' + ; + +PERSISTENT : 'P''E''R''S''I''S''T''E''N''T' + ; + AUDIO_OUTPUT_DEVICE_PARAMETER : 'A''U''D''I''O''_''O''U''T''P''U''T''_''D''E''V''I''C''E''_''P''A''R''A''M''E''T''E''R' ; @@ -475,6 +576,12 @@ MIDI_INPUT_DRIVER_PARAMETER : 'M''I''D''I''_''I''N''P''U''T''_''D''R''I''V''E''R''_''P''A''R''A''M''E''T''E''R' ; +MIDI_INSTRUMENT : 'M''I''D''I''_''I''N''S''T''R''U''M''E''N''T' + ; + +MIDI_INSTRUMENTS : 'M''I''D''I''_''I''N''S''T''R''U''M''E''N''T''S' + ; + MIDI_INPUT_DRIVER : 'M''I''D''I''_''I''N''P''U''T''_''D''R''I''V''E''R' ; @@ -490,9 +597,18 @@ MIDI_INPUT : 'M''I''D''I''_''I''N''P''U''T' ; +SERVER : 'S''E''R''V''E''R' + ; + VOLUME : 'V''O''L''U''M''E' ; +MUTE : 'M''U''T''E' + ; + +SOLO : 'S''O''L''O' + ; + BYTES : 'B''Y''T''E''S' ;