blob: eb1fe1a69d2a520b99fe6b3660fd273f6d834b16 [file] [log] [blame] [edit]
/*
* BRLTTY - A background process providing access to the console screen (when in
* text mode) for a blind person using a refreshable braille display.
*
* Copyright (C) 1995-2023 by The BRLTTY Developers.
*
* BRLTTY comes with ABSOLUTELY NO WARRANTY.
*
* This is free software, placed under the terms of the
* GNU Lesser General Public License, as published by the Free Software
* Foundation; either version 2.1 of the License, or (at your option) any
* later version. Please see the file LICENSE-LGPL for details.
*
* Web Page: http://brltty.app/
*
* This software is maintained by Dave Mielke <dave@mielke.cc>.
*/
#include "prologue.h"
#include <string.h>
#include "log.h"
#include "tune.h"
#include "tune_utils.h"
#include "tune_types.h"
#include "midi.h"
#include "parse.h"
#include "prefs.h"
static const char *tuneDeviceNames[] = {
"beeper",
"pcm",
"midi",
"fm",
NULL
};
const char *
getTuneDeviceName (TuneDevice device) {
return tuneDeviceNames[device];
}
int
parseTuneDevice (const char *setting) {
if (setting && *setting) {
unsigned int device;
if (!validateChoice(&device, setting, tuneDeviceNames)) {
logMessage(LOG_ERR, "%s: %s", "invalid tune device", setting);
return 0;
}
prefs.tuneDevice = device;
}
return 1;
}
int
setTuneDevice (void) {
unsigned char device = prefs.tuneDevice;
if (!tuneSetDevice(device)) {
logMessage(LOG_ERR, "unsupported tune device: %s", getTuneDeviceName(device));
return 0;
}
return 1;
}
int
parseTuneVolume (const char *setting) {
if (setting && *setting) {
static const int minimum = 0;
static const int maximum = 100;
int volume;
if (!validateInteger(&volume, setting, &minimum, &maximum)) {
logMessage(LOG_ERR, "%s: %s", "invalid volume percentage", setting);
return 0;
}
switch (prefs.tuneDevice) {
case tdPcm:
prefs.pcmVolume = volume;
break;
case tdMidi:
prefs.midiVolume = volume;
break;
case tdFm:
prefs.fmVolume = volume;
break;
default:
break;
}
}
return 1;
}
#ifdef HAVE_MIDI_SUPPORT
static int
validateMidiInstrument (unsigned char *value, const char *string) {
size_t stringLength = strlen(string);
unsigned char instrument;
for (instrument=0; instrument<midiInstrumentCount; ++instrument) {
const char *component = midiInstrumentTable[instrument];
size_t componentLeft = strlen(component);
const char *word = string;
size_t wordLeft = stringLength;
{
const char *delimiter = memchr(component, '(', componentLeft);
if (delimiter) componentLeft = delimiter - component;
}
while (1) {
while (*component == ' ') component++, componentLeft--;
if ((componentLeft == 0) != (wordLeft == 0)) break;
if (!componentLeft) {
*value = instrument;
return 1;
}
{
size_t wordLength = wordLeft;
size_t componentLength = componentLeft;
const char *delimiter;
if ((delimiter = memchr(word, '-', wordLeft))) wordLength = delimiter - word;
if ((delimiter = memchr(component, ' ', componentLeft))) componentLength = delimiter - component;
if (strncasecmp(word, component, wordLength) != 0) break;
word += wordLength; wordLeft -= wordLength;
if (*word) word++, wordLeft--;
component += componentLength; componentLeft -= componentLength;
}
}
}
return 0;
}
int
parseTuneInstrument (const char *setting) {
if (setting && *setting) {
unsigned char instrument;
if (!validateMidiInstrument(&instrument, setting)) {
logMessage(LOG_ERR, "%s: %s", "invalid musical instrument", setting);
return 0;
}
prefs.midiInstrument = instrument;
}
return 1;
}
#endif /* HAVE_MIDI_SUPPORT */