|
Packit |
427e91 |
/*
|
|
Packit |
427e91 |
* EMU10k1 loader
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
* Copyright (c) 2003,2004 by Peter Zubaj
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
427e91 |
* it under the terms of the GNU General Public License as published by
|
|
Packit |
427e91 |
* the Free Software Foundation; either version 2 of the License, or
|
|
Packit |
427e91 |
* (at your option) any later version.
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
427e91 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
427e91 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
427e91 |
* GNU General Public License for more details.
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
427e91 |
* along with this program; if not, write to the Free Software
|
|
Packit |
427e91 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
*/
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
#include <getopt.h>
|
|
Packit |
427e91 |
#include <stdarg.h>
|
|
Packit |
427e91 |
#include <stdio.h>
|
|
Packit |
427e91 |
#include <stdlib.h>
|
|
Packit |
427e91 |
#include <ctype.h>
|
|
Packit |
427e91 |
#include <sys/stat.h>
|
|
Packit |
427e91 |
#include <unistd.h>
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
427e91 |
#include "config.h"
|
|
Packit |
427e91 |
#endif
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
#include <alsa/asoundlib.h>
|
|
Packit |
427e91 |
#include "version.h"
|
|
Packit |
427e91 |
#include "comm.h"
|
|
Packit |
427e91 |
#include "ld10k1_fnc.h"
|
|
Packit |
427e91 |
#include "ld10k1_error.h"
|
|
Packit |
427e91 |
#include "ld10k1_debug.h"
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
#include "liblo10k1.h"
|
|
Packit |
427e91 |
#include "liblo10k1ef.h"
|
|
Packit |
427e91 |
#include "liblo10k1lf.h"
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
char comm_pipe[256];
|
|
Packit |
427e91 |
liblo10k1_connection_t conn;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void error(const char *fmt,...)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
va_list va;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
va_start(va, fmt);
|
|
Packit |
427e91 |
fprintf(stderr, "Error: ");
|
|
Packit |
427e91 |
vfprintf(stderr, fmt, va);
|
|
Packit |
427e91 |
fprintf(stderr, "\n");
|
|
Packit |
427e91 |
va_end(va);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void help(char *command)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
fprintf(stderr,
|
|
Packit |
427e91 |
"Usage: %s [-options]\n"
|
|
Packit |
427e91 |
"\nAvailable options:\n"
|
|
Packit |
427e91 |
" -h, --help this help\n"
|
|
Packit |
427e91 |
" -p, --pipe_name connect to this, default = /tmp/.ld10k1_port\n"
|
|
Packit |
427e91 |
" -l, --list dump lkoaded patch\n"
|
|
Packit |
427e91 |
" -i, --info print some info\n"
|
|
Packit |
427e91 |
" -s, --setup setup DSP\n"
|
|
Packit |
427e91 |
" -a, --add load patch\n"
|
|
Packit |
427e91 |
" -d, --del unload patch\n"
|
|
Packit |
427e91 |
" -q, --conadd connect 2 patches\n"
|
|
Packit |
427e91 |
" -w, --condel delete connection\n"
|
|
Packit |
427e91 |
" --debug print debug information\n"
|
|
Packit |
427e91 |
" -n, --defionames define default in/out names for loaded patch\n"
|
|
Packit |
427e91 |
" --ctrl modify control parameters for loaded patch\n"
|
|
Packit |
427e91 |
" --patch_name load patch with this name\n"
|
|
Packit |
427e91 |
" --where insert patch before\n"
|
|
Packit |
427e91 |
" --renam rename patch, input, output, fx, patch input, patch output\n"
|
|
Packit |
427e91 |
" --dump dump DSP setup to file, can by loaded by dl10k1\n"
|
|
Packit |
427e91 |
" --host lo10k1 uses network socket instead of named socked (host,port)\n"
|
|
Packit |
427e91 |
" -P, --path include path\n"
|
|
Packit |
427e91 |
" --store store DSP setup\n"
|
|
Packit |
427e91 |
" --restore restore DSP setup\n"
|
|
Packit |
427e91 |
, command);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
typedef struct tag_path_info {
|
|
Packit |
427e91 |
char *path;
|
|
Packit |
427e91 |
struct tag_path_info *next;
|
|
Packit |
427e91 |
} path_t;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
path_t *first_path;
|
|
Packit |
427e91 |
path_t *last_path;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void add_path(char *path)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
path_t *path_info = malloc(sizeof(path_t));
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
path_info->path = strdup(path);
|
|
Packit |
427e91 |
path_info->next = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (last_path)
|
|
Packit |
427e91 |
last_path->next = path_info;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
last_path = path_info;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (!first_path)
|
|
Packit |
427e91 |
first_path = path_info;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void add_paths(char *paths)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
char *str = strdup(paths);
|
|
Packit |
427e91 |
char *path = strtok(str, ":");
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
while (path) {
|
|
Packit |
427e91 |
add_path(path);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
path = strtok(NULL, ":");
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
free (str);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void free_all_paths()
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
path_t *path_info = first_path;
|
|
Packit |
427e91 |
path_t *path_info_n = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
while (path_info) {
|
|
Packit |
427e91 |
path_info_n = path_info->next;
|
|
Packit |
427e91 |
free(path_info);
|
|
Packit |
427e91 |
path_info = path_info_n;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static liblo10k1_emu_patch_t *try_patch(char *file_name)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int en;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
liblo10k1_emu_patch_t *p = NULL;
|
|
Packit |
427e91 |
if ((en = liblo10k1_emu_load_patch(file_name, &p)) < 0)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return p;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static liblo10k1_emu_patch_t *open_patch(char *file_name)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
liblo10k1_emu_patch_t *patch;
|
|
Packit |
427e91 |
path_t *path_info = first_path;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
patch = try_patch(file_name);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch)
|
|
Packit |
427e91 |
return patch;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
while (path_info) {
|
|
Packit |
427e91 |
char path[256]; /* FIXME */
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
memset(path, 0, sizeof(path));
|
|
Packit |
427e91 |
snprintf(path, sizeof(path)-1, "%s/%s",
|
|
Packit |
427e91 |
path_info->path, file_name);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
patch = try_patch(path);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch) {
|
|
Packit |
427e91 |
return patch;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
snprintf(path, sizeof(path)-1, "%s/%s.emu10k1",
|
|
Packit |
427e91 |
path_info->path, file_name);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
patch = try_patch(path);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (patch) {
|
|
Packit |
427e91 |
return patch;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
path_info = path_info->next;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static int load_patch(char *file_name, liblo10k1_emu_patch_t **p)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
liblo10k1_emu_patch_t *patch;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (!(patch = open_patch(file_name))) {
|
|
Packit |
427e91 |
error("unable to load patch %s", file_name);
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
*p = patch;
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static char get_str(char **str, char *out, int maxlen, char *sep, int isnum)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
char ch = **str;
|
|
Packit |
427e91 |
char *tmpsep;
|
|
Packit |
427e91 |
int len = 0;
|
|
Packit |
427e91 |
int found = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
*out = '\0';
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (ch == '\0')
|
|
Packit |
427e91 |
return ch;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
len = 0;
|
|
Packit |
427e91 |
while (**str && len < maxlen) {
|
|
Packit |
427e91 |
found = 0;
|
|
Packit |
427e91 |
ch = **str;
|
|
Packit |
427e91 |
for (tmpsep = sep; *tmpsep; tmpsep++) {
|
|
Packit |
427e91 |
if (ch == *tmpsep) {
|
|
Packit |
427e91 |
found = 1;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (found)
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
if (isnum && !isdigit(ch))
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
*out++ = *(*str)++;
|
|
Packit |
427e91 |
len++;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
*out = '\0';
|
|
Packit |
427e91 |
return ch;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static int transfer_patch(int udin, char *ctrl_opt, liblo10k1_emu_patch_t *ep, liblo10k1_dsp_patch_t **p)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int i, j, k;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
char ctrl_from_concate[16][32][MAX_NAME_LEN]; /* max 32 ctrl to 1 and max 16 of this*/
|
|
Packit |
427e91 |
char ctrl_to_concate[16][MAX_NAME_LEN];
|
|
Packit |
427e91 |
int ctrl_to_concate_count;
|
|
Packit |
427e91 |
int ctrl_from_count[16];
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
char ctrl_visible[16][MAX_NAME_LEN];
|
|
Packit |
427e91 |
char ctrl_visible_max[16];
|
|
Packit |
427e91 |
unsigned char ctrl_visible_count;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
char ctrl_translate[16][MAX_NAME_LEN];
|
|
Packit |
427e91 |
char ctrl_translate_type[16];
|
|
Packit |
427e91 |
unsigned char ctrl_translate_count;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
char ctrl_index[16][MAX_NAME_LEN];
|
|
Packit |
427e91 |
int ctrl_index_val[16];
|
|
Packit |
427e91 |
unsigned char ctrl_index_count;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
char ctrl_values[16][MAX_NAME_LEN];
|
|
Packit |
427e91 |
int ctrl_values_val[16][32];
|
|
Packit |
427e91 |
unsigned char ctrl_values_cnt[16];
|
|
Packit |
427e91 |
unsigned char ctrl_values_count;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
char *tmp_str;
|
|
Packit |
427e91 |
char *tmp_num;
|
|
Packit |
427e91 |
char tmp_num_str[20];
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
char sep;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
liblo10k1_ctl_transform_t *tctl;
|
|
Packit |
427e91 |
int ctl_idx;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
liblo10k1_dsp_patch_t *np = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ctrl_to_concate_count = 0;
|
|
Packit |
427e91 |
ctrl_visible_count = 0;
|
|
Packit |
427e91 |
ctrl_translate_count = 0;
|
|
Packit |
427e91 |
ctrl_index_count = 0;
|
|
Packit |
427e91 |
ctrl_values_count = 0;
|
|
Packit |
427e91 |
for (i = 0; i < 16; i++) {
|
|
Packit |
427e91 |
ctrl_from_count[i] = 0;
|
|
Packit |
427e91 |
ctrl_to_concate[i][0] = '\0';
|
|
Packit |
427e91 |
ctrl_visible[i][0] = '\0';
|
|
Packit |
427e91 |
ctrl_visible_max[i] = 1;
|
|
Packit |
427e91 |
ctrl_translate[i][0] = '\0';
|
|
Packit |
427e91 |
ctrl_translate_type[i] = 1;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ctrl_index[i][0] = '\0';
|
|
Packit |
427e91 |
ctrl_index_val[i] = -1;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ctrl_values[i][0] = '\0';
|
|
Packit |
427e91 |
ctrl_values_cnt[i] = 0;
|
|
Packit |
427e91 |
for (j = 0; j < 32; j++) {
|
|
Packit |
427e91 |
ctrl_from_concate[i][j][0] = '\0';
|
|
Packit |
427e91 |
ctrl_values_val[i][j] = 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* parse ctrl opt */
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* TODO - check for name boundary */
|
|
Packit |
427e91 |
while (ctrl_opt && *ctrl_opt) {
|
|
Packit |
427e91 |
switch (*ctrl_opt++) {
|
|
Packit |
427e91 |
case 'c':
|
|
Packit |
427e91 |
if (*ctrl_opt++ != '-') {
|
|
Packit |
427e91 |
error("wrong ctrl option format (c) - waiting -");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
while (1) {
|
|
Packit |
427e91 |
tmp_str = ctrl_from_concate[ctrl_to_concate_count][ctrl_from_count[ctrl_to_concate_count]];
|
|
Packit |
427e91 |
sep = get_str(&ctrl_opt, tmp_str, MAX_NAME_LEN, ",:", 0);
|
|
Packit |
427e91 |
if (strlen(ctrl_from_concate[ctrl_to_concate_count][ctrl_from_count[ctrl_to_concate_count]]) == 0) {
|
|
Packit |
427e91 |
error("wrong ctrl option format (c) - wrong source ctrl name");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
ctrl_from_count[ctrl_to_concate_count]++;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (sep == ':') {
|
|
Packit |
427e91 |
ctrl_opt++;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (sep != ',') {
|
|
Packit |
427e91 |
error("wrong ctrl option format (c) - wrong separator - waiting , %c", sep);
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ctrl_opt++;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
tmp_str = ctrl_to_concate[ctrl_to_concate_count];
|
|
Packit |
427e91 |
/* next is new ctrl name */
|
|
Packit |
427e91 |
sep = get_str(&ctrl_opt, tmp_str, MAX_NAME_LEN, ",", 0);
|
|
Packit |
427e91 |
if (strlen(ctrl_to_concate[ctrl_to_concate_count]) == 0) {
|
|
Packit |
427e91 |
error("wrong ctrl option format (c) - wrong target ctrl name");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
ctrl_to_concate_count++;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'v':
|
|
Packit |
427e91 |
if (*ctrl_opt++ != '-') {
|
|
Packit |
427e91 |
error("wrong ctrl option format (v) - waiting -");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
while (1)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
tmp_str = ctrl_visible[ctrl_visible_count];
|
|
Packit |
427e91 |
sep = get_str(&ctrl_opt, tmp_str, MAX_NAME_LEN, ":", 0);
|
|
Packit |
427e91 |
if (strlen(ctrl_visible[ctrl_visible_count]) == 0) {
|
|
Packit |
427e91 |
error("wrong ctrl option format (v) - wrong ctrl name");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (sep == ':') {
|
|
Packit |
427e91 |
ctrl_opt++;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
ctrl_opt++;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
tmp_num = tmp_num_str;
|
|
Packit |
427e91 |
/* next is new ctrl name */
|
|
Packit |
427e91 |
sep = get_str(&ctrl_opt, tmp_num, 10, ",", 1);
|
|
Packit |
427e91 |
if (strlen(tmp_num_str) == 0) {
|
|
Packit |
427e91 |
error("wrong ctrl option format (v) - wrong vcount count");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
ctrl_visible_max[ctrl_visible_count] = atoi(tmp_num_str);
|
|
Packit |
427e91 |
ctrl_visible_count++;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 't':
|
|
Packit |
427e91 |
if (*ctrl_opt++ != '-') {
|
|
Packit |
427e91 |
error("wrong ctrl option format (t) - waiting -");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
while (1)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
tmp_str = ctrl_translate[ctrl_translate_count];
|
|
Packit |
427e91 |
sep = get_str(&ctrl_opt, tmp_str, MAX_NAME_LEN, ":", 0);
|
|
Packit |
427e91 |
if (strlen(ctrl_translate[ctrl_translate_count]) == 0) {
|
|
Packit |
427e91 |
error("wrong ctrl option format (t) - wrong ctrl name");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (sep == ':') {
|
|
Packit |
427e91 |
ctrl_opt++;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
ctrl_opt++;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
tmp_num = tmp_num_str;
|
|
Packit |
427e91 |
/* next is new ctrl translate */
|
|
Packit |
427e91 |
sep = get_str(&ctrl_opt, tmp_num, 10, ",", 1);
|
|
Packit |
427e91 |
if (strlen(tmp_num_str) == 0) {
|
|
Packit |
427e91 |
error("wrong ctrl option format (t) - wrong translation function num");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
ctrl_translate_type[ctrl_translate_count] = atoi(tmp_num_str);
|
|
Packit |
427e91 |
ctrl_translate_count++;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'i':
|
|
Packit |
427e91 |
if (*ctrl_opt++ != '-') {
|
|
Packit |
427e91 |
error("wrong ctrl option format (i) - waiting -");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
while (1)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
tmp_str = ctrl_index[ctrl_index_count];
|
|
Packit |
427e91 |
sep = get_str(&ctrl_opt, tmp_str, MAX_NAME_LEN, ":", 0);
|
|
Packit |
427e91 |
if (strlen(ctrl_index[ctrl_index_count]) == 0) {
|
|
Packit |
427e91 |
error("wrong ctrl option format (i) - wrong ctrl name");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (sep == ':') {
|
|
Packit |
427e91 |
ctrl_opt++;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
ctrl_opt++;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
tmp_num = tmp_num_str;
|
|
Packit |
427e91 |
/* next is new ctrl index */
|
|
Packit |
427e91 |
sep = get_str(&ctrl_opt, tmp_num, 10, ",", 1);
|
|
Packit |
427e91 |
if (strlen(tmp_num_str) == 0) {
|
|
Packit |
427e91 |
error("wrong ctrl option format (i) - wrong index num");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
ctrl_index_val[ctrl_index_count] = atoi(tmp_num_str);
|
|
Packit |
427e91 |
ctrl_index_count++;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 's':
|
|
Packit |
427e91 |
if (*ctrl_opt++ != '-') {
|
|
Packit |
427e91 |
error("wrong ctrl option format (s) - waiting -");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
while (1)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
tmp_str = ctrl_values[ctrl_values_count];
|
|
Packit |
427e91 |
sep = get_str(&ctrl_opt, tmp_str, MAX_NAME_LEN, ":", 0);
|
|
Packit |
427e91 |
if (strlen(ctrl_values[ctrl_values_count]) == 0) {
|
|
Packit |
427e91 |
error("wrong ctrl option format (s) - wrong ctrl name");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (sep == ':') {
|
|
Packit |
427e91 |
ctrl_opt++;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
ctrl_opt++;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* next is new ctrl name */
|
|
Packit |
427e91 |
do {
|
|
Packit |
427e91 |
tmp_num = tmp_num_str;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
sep = get_str(&ctrl_opt, tmp_num, 10, ",#", 1);
|
|
Packit |
427e91 |
if (strlen(tmp_num_str) == 0) {
|
|
Packit |
427e91 |
error("wrong ctrl option format (s) - wrong value");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
ctrl_values_val[ctrl_values_count][ctrl_values_cnt[ctrl_values_count]] = atoi(tmp_num_str);
|
|
Packit |
427e91 |
ctrl_values_cnt[ctrl_values_count]++;
|
|
Packit |
427e91 |
if (sep != '#')
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
ctrl_opt++;
|
|
Packit |
427e91 |
} while (1);
|
|
Packit |
427e91 |
ctrl_values_count++;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
default:
|
|
Packit |
427e91 |
error("wrong ctrl option format - unknown subfunction");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (*ctrl_opt) {
|
|
Packit |
427e91 |
if (*ctrl_opt != ',') {
|
|
Packit |
427e91 |
error("wrong ctrl option format - wrong separator beetwen subfunctions");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
} else
|
|
Packit |
427e91 |
*ctrl_opt++;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
tctl = (liblo10k1_ctl_transform_t *)malloc(sizeof(liblo10k1_ctl_transform_t) * ctrl_to_concate_count);
|
|
Packit |
427e91 |
memset(tctl, 0, sizeof(liblo10k1_ctl_transform_t) * ctrl_to_concate_count);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < ctrl_to_concate_count; i++) {
|
|
Packit |
427e91 |
/* find all controls for this ctl */
|
|
Packit |
427e91 |
for (k = 0; k < ctrl_from_count[i]; k++) {
|
|
Packit |
427e91 |
for (j = 0; j < ep->ctl_count; j++) {
|
|
Packit |
427e91 |
if (strcmp(ctrl_from_concate[i][k], ep->ctls[j].ctl_name) == 0) {
|
|
Packit |
427e91 |
tctl[i].emu_ctls[tctl[i].emu_ctl_count++] = j;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
strcpy(tctl[i].ctl_name, ctrl_to_concate[i]);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (liblo10k1_emu_transform_patch(ep, tctl, ctrl_to_concate_count, &np) < 0)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
error("error on liblo10k1_emu_transform_patch");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
free(tctl);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < ctrl_visible_count; i++) {
|
|
Packit |
427e91 |
ctl_idx = liblo10k1_patch_find_ctl_by_name(np, ctrl_visible[i]);
|
|
Packit |
427e91 |
if (ctl_idx < 0)
|
|
Packit |
427e91 |
goto err;
|
|
Packit |
427e91 |
if (liblo10k1_patch_ctl_set_vcount(np, ctl_idx, ctrl_visible_max[i]) < 0)
|
|
Packit |
427e91 |
goto err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < ctrl_translate_count; i++) {
|
|
Packit |
427e91 |
ctl_idx = liblo10k1_patch_find_ctl_by_name(np, ctrl_translate[i]);
|
|
Packit |
427e91 |
if (ctl_idx < 0)
|
|
Packit |
427e91 |
goto err;
|
|
Packit |
427e91 |
if (liblo10k1_patch_ctl_set_trans(np, ctl_idx, ctrl_translate_type[i]) < 0)
|
|
Packit |
427e91 |
goto err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < ctrl_index_count; i++) {
|
|
Packit |
427e91 |
ctl_idx = liblo10k1_patch_find_ctl_by_name(np, ctrl_index[i]);
|
|
Packit |
427e91 |
if (ctl_idx < 0)
|
|
Packit |
427e91 |
goto err;
|
|
Packit |
427e91 |
if (liblo10k1_patch_ctl_set_index(np, ctl_idx, ctrl_index_val[i]) < 0)
|
|
Packit |
427e91 |
goto err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < ctrl_values_count; i++) {
|
|
Packit |
427e91 |
ctl_idx = liblo10k1_patch_find_ctl_by_name(np, ctrl_values[i]);
|
|
Packit |
427e91 |
if (ctl_idx < 0)
|
|
Packit |
427e91 |
goto err;
|
|
Packit |
427e91 |
for (j = 0; j < ctrl_values_cnt[i]; j++) {
|
|
Packit |
427e91 |
if (liblo10k1_patch_ctl_set_value(np, ctl_idx, j, ctrl_values_val[i][j]) < 0)
|
|
Packit |
427e91 |
goto err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
*p = np;
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
err:
|
|
Packit |
427e91 |
if (np)
|
|
Packit |
427e91 |
liblo10k1_patch_free(np);
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static int transfer_native_patch(liblo10k1_dsp_patch_t *p, char *ctrl_opt)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
unsigned char ctrl_values_count;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
char tmp_name_from_str[MAX_NAME_LEN];
|
|
Packit |
427e91 |
char tmp_name_to_str[MAX_NAME_LEN];
|
|
Packit |
427e91 |
char *tmp_str;
|
|
Packit |
427e91 |
char *tmp_num;
|
|
Packit |
427e91 |
char tmp_num_str[20];
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
char sep;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int ctl_idx;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* parse ctrl opt */
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* TODO - check for name boundary */
|
|
Packit |
427e91 |
while (ctrl_opt && *ctrl_opt) {
|
|
Packit |
427e91 |
switch (*ctrl_opt++) {
|
|
Packit |
427e91 |
case 'r':
|
|
Packit |
427e91 |
if (*ctrl_opt++ != '-') {
|
|
Packit |
427e91 |
error("wrong ctrl option format (r) - waiting -");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
while (1) {
|
|
Packit |
427e91 |
tmp_str = tmp_name_from_str;
|
|
Packit |
427e91 |
sep = get_str(&ctrl_opt, tmp_str, MAX_NAME_LEN, ",:", 0);
|
|
Packit |
427e91 |
if (strlen(tmp_name_from_str) == 0) {
|
|
Packit |
427e91 |
error("wrong ctrl option format (r) - wrong source ctrl name");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (sep == ':') {
|
|
Packit |
427e91 |
ctrl_opt++;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ctrl_opt++;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
tmp_str = tmp_name_to_str;
|
|
Packit |
427e91 |
/* next is new ctrl name */
|
|
Packit |
427e91 |
sep = get_str(&ctrl_opt, tmp_str, MAX_NAME_LEN, ",", 0);
|
|
Packit |
427e91 |
if (strlen(tmp_name_to_str) == 0) {
|
|
Packit |
427e91 |
error("wrong ctrl option format (r) - wrong target ctrl name");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ctl_idx = liblo10k1_patch_find_ctl_by_name(p, tmp_name_from_str);
|
|
Packit |
427e91 |
if (ctl_idx < 0) {
|
|
Packit |
427e91 |
error("unknown ctrl name");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
strcpy(p->ctl[ctl_idx].name, tmp_name_to_str);
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'i':
|
|
Packit |
427e91 |
if (*ctrl_opt++ != '-') {
|
|
Packit |
427e91 |
error("wrong ctrl option format (i) - waiting -");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
while (1)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
tmp_str = tmp_name_from_str;
|
|
Packit |
427e91 |
sep = get_str(&ctrl_opt, tmp_str, MAX_NAME_LEN, ":", 0);
|
|
Packit |
427e91 |
if (strlen(tmp_name_from_str) == 0) {
|
|
Packit |
427e91 |
error("wrong ctrl option format (i) - wrong ctrl name");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (sep == ':') {
|
|
Packit |
427e91 |
ctrl_opt++;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
ctrl_opt++;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
tmp_num = tmp_num_str;
|
|
Packit |
427e91 |
/* next is new ctrl index */
|
|
Packit |
427e91 |
sep = get_str(&ctrl_opt, tmp_num, 10, ",", 1);
|
|
Packit |
427e91 |
if (strlen(tmp_num_str) == 0) {
|
|
Packit |
427e91 |
error("wrong ctrl option format (i) - wrong index num");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
ctl_idx = liblo10k1_patch_find_ctl_by_name(p, tmp_name_from_str);
|
|
Packit |
427e91 |
if (ctl_idx < 0) {
|
|
Packit |
427e91 |
error("unknown ctrl name");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (liblo10k1_patch_ctl_set_index(p, ctl_idx, atoi(tmp_num_str)) < 0) {
|
|
Packit |
427e91 |
error("can not set ctrl index");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 's':
|
|
Packit |
427e91 |
if (*ctrl_opt++ != '-') {
|
|
Packit |
427e91 |
error("wrong ctrl option format (s) - waiting -");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
while (1)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
tmp_str = tmp_name_from_str;
|
|
Packit |
427e91 |
sep = get_str(&ctrl_opt, tmp_str, MAX_NAME_LEN, ":", 0);
|
|
Packit |
427e91 |
if (strlen(tmp_name_from_str) == 0) {
|
|
Packit |
427e91 |
error("wrong ctrl option format (s) - wrong ctrl name");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (sep == ':') {
|
|
Packit |
427e91 |
ctrl_opt++;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
ctrl_opt++;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
ctl_idx = liblo10k1_patch_find_ctl_by_name(p, tmp_name_from_str);
|
|
Packit |
427e91 |
if (ctl_idx < 0){
|
|
Packit |
427e91 |
error("unknown ctrl name");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* next is value */
|
|
Packit |
427e91 |
ctrl_values_count = 0;
|
|
Packit |
427e91 |
do {
|
|
Packit |
427e91 |
tmp_num = tmp_num_str;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
sep = get_str(&ctrl_opt, tmp_num, 10, ",#", 1);
|
|
Packit |
427e91 |
if (strlen(tmp_num_str) == 0) {
|
|
Packit |
427e91 |
error("wrong ctrl option format (s) - wrong value");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (liblo10k1_patch_ctl_set_value(p, ctl_idx, ctrl_values_count, atoi(tmp_num_str)) < 0){
|
|
Packit |
427e91 |
error("can not set ctrl value");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (sep != '#')
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
ctrl_opt++;
|
|
Packit |
427e91 |
ctrl_values_count++;
|
|
Packit |
427e91 |
} while (1);
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
default:
|
|
Packit |
427e91 |
error("wrong ctrl option format - unknown subfunction");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (*ctrl_opt) {
|
|
Packit |
427e91 |
if (*ctrl_opt != ',') {
|
|
Packit |
427e91 |
error("wrong ctrl option format - wrong separator beetwen subfunctions");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
} else
|
|
Packit |
427e91 |
*ctrl_opt++;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static int list_patch(char *file_name)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int err, i, j;
|
|
Packit |
427e91 |
liblo10k1_emu_patch_t *p;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
err = load_patch(file_name, &p);
|
|
Packit |
427e91 |
if (err)
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* and now print */
|
|
Packit |
427e91 |
printf("Patch name : %s\n", p->patch_name);
|
|
Packit |
427e91 |
printf("IN:\n");
|
|
Packit |
427e91 |
for (i = 0; i < p->in_count; i++)
|
|
Packit |
427e91 |
printf("%03d: %08x\n", i, p->ins[i]);
|
|
Packit |
427e91 |
printf("OUT:\n");
|
|
Packit |
427e91 |
for (i = 0; i < p->out_count; i++)
|
|
Packit |
427e91 |
printf("%03d: %08x\n", i, p->outs[i]);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
printf("DYN:\n");
|
|
Packit |
427e91 |
for (i = 0; i < p->dyn_count; i++)
|
|
Packit |
427e91 |
printf("%03d: %08x\n", i, p->dyns[i]);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
printf("STA:\n");
|
|
Packit |
427e91 |
for (i = 0; i < p->sta_count; i++)
|
|
Packit |
427e91 |
printf("%03d: %08x %08x\n", i, p->stas[i].sc, p->stas[i].sc_val);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
printf("CTRL:\n");
|
|
Packit |
427e91 |
for (i = 0; i < p->ctl_count; i++)
|
|
Packit |
427e91 |
printf("%03d: %08x %08x %08x %08x %s\n", i, p->ctls[i].ctl, p->ctls[i].ctl_val, p->ctls[i].ctl_val_min, p->ctls[i].ctl_val_max, p->ctls[i].ctl_name);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
printf("CON:\n");
|
|
Packit |
427e91 |
for (i = 0; i < p->con_count; i++)
|
|
Packit |
427e91 |
printf("%03d: %08x %08x\n", i, p->cons[i].sc, p->cons[i].sc_val);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
printf("TRAM LOOKUP:\n");
|
|
Packit |
427e91 |
for (i = 0; i < p->tram_lookup_count; i++) {
|
|
Packit |
427e91 |
printf("%03d: %08x\n", i, p->tram_lookups[i].size);
|
|
Packit |
427e91 |
for (j = 0; j < p->tram_lookups[i].read_line_count; j++)
|
|
Packit |
427e91 |
printf(" %03d: %c %03d %08x %08x\n", i, 'R', j, p->tram_lookups[i].read_lines[j].line,p->tram_lookups[i].read_lines[j].line_size);
|
|
Packit |
427e91 |
for (j = 0; j < p->tram_lookups[i].write_line_count; j++)
|
|
Packit |
427e91 |
printf(" %03d: %c %03d %08x %08x\n", i, 'W', j, p->tram_lookups[i].write_lines[j].line,p->tram_lookups[i].write_lines[j].line_size);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
printf("TRAM DELAY:\n");
|
|
Packit |
427e91 |
for (i = 0; i < p->tram_delay_count; i++) {
|
|
Packit |
427e91 |
printf("%03d: %08x\n", i, p->tram_delays[i].size);
|
|
Packit |
427e91 |
for (j = 0; j < p->tram_delays[i].read_line_count; j++)
|
|
Packit |
427e91 |
printf(" %03d: %c %03d %08x %08x\n", i, 'R', j, p->tram_delays[i].read_lines[j].line,p->tram_delays[i].read_lines[j].line_size);
|
|
Packit |
427e91 |
for (j = 0; j < p->tram_delays[i].write_line_count; j++)
|
|
Packit |
427e91 |
printf(" %03d: %c %03d %08x %08x\n", i, 'W', j, p->tram_delays[i].write_lines[j].line,p->tram_delays[i].write_lines[j].line_size);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
printf("INSTR:\n");
|
|
Packit |
427e91 |
for (i = 0; i < p->instr_count; i++)
|
|
Packit |
427e91 |
printf("%03d: %08x %08x %08x %08x %08x\n", i, p->instrs[i].op, p->instrs[i].arg[0], p->instrs[i].arg[1], p->instrs[i].arg[2], p->instrs[i].arg[3]);
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static int add_patch(char *file_name, int udin, char *ctrl_opt, char *opt_patch_name, int where)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int err;
|
|
Packit |
427e91 |
liblo10k1_emu_patch_t *ep;
|
|
Packit |
427e91 |
liblo10k1_dsp_patch_t *p;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
err = load_patch(file_name, &ep);
|
|
Packit |
427e91 |
if (err)
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
err = transfer_patch(udin, ctrl_opt, ep, &p);
|
|
Packit |
427e91 |
if (err) {
|
|
Packit |
427e91 |
error("unable to transfer patch");
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (opt_patch_name) {
|
|
Packit |
427e91 |
strncpy(p->patch_name, opt_patch_name, MAX_NAME_LEN - 1);
|
|
Packit |
427e91 |
p->patch_name[MAX_NAME_LEN - 1] = '\0';
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((err = liblo10k1_patch_load(&conn, p, where, NULL, NULL)) < 0) {
|
|
Packit |
427e91 |
error("unable to load patch (ld10k1 error:%s)", liblo10k1_error_str(err));
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static int load_dsp_patch(char *file_name, char *ctrl_opt, char *opt_patch_name, int where)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int err;
|
|
Packit |
427e91 |
liblo10k1_dsp_patch_t *p;
|
|
Packit |
427e91 |
liblo10k1_file_info_t *fi;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
fi = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((err = liblo10k1lf_load_dsp_patch(&p, file_name, &fi)) < 0) {
|
|
Packit |
427e91 |
error("unable to load dsp patch (ld10k1 error:%s)", liblo10k1_error_str(err));
|
|
Packit |
427e91 |
goto err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
err = transfer_native_patch(p, ctrl_opt);
|
|
Packit |
427e91 |
if (err)
|
|
Packit |
427e91 |
goto err;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (opt_patch_name) {
|
|
Packit |
427e91 |
strncpy(p->patch_name, opt_patch_name, MAX_NAME_LEN - 1);
|
|
Packit |
427e91 |
p->patch_name[MAX_NAME_LEN - 1] = '\0';
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((err = liblo10k1_patch_load(&conn, p, where, NULL, NULL)) < 0) {
|
|
Packit |
427e91 |
error("unable to load dsp patch (ld10k1 error:%s)", liblo10k1_error_str(err));
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
liblo10k1lf_file_info_free(fi);
|
|
Packit |
427e91 |
liblo10k1_patch_free(p);
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
err:
|
|
Packit |
427e91 |
if (fi)
|
|
Packit |
427e91 |
liblo10k1lf_file_info_free(fi);
|
|
Packit |
427e91 |
if (p)
|
|
Packit |
427e91 |
liblo10k1_patch_free(p);
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static int save_dsp_patch(char *file_name, int pn)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int err;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
liblo10k1_dsp_patch_t *p;
|
|
Packit |
427e91 |
liblo10k1_file_info_t *fi;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (pn < 0) {
|
|
Packit |
427e91 |
error("wrong patch num");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
fi = liblo10k1lf_file_info_alloc();
|
|
Packit |
427e91 |
if (!fi) {
|
|
Packit |
427e91 |
error("no mem");
|
|
Packit |
427e91 |
goto err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((err = liblo10k1_patch_get(&conn, pn, &p)) < 0) {
|
|
Packit |
427e91 |
error("unable to get dsp patch (ld10k1 error:%s)", liblo10k1_error_str(err));
|
|
Packit |
427e91 |
goto err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
fi->creater = strdup("lo10k1 - emu10k1/emu10k2 effect loader for alsa");
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((err = liblo10k1lf_save_dsp_patch(p, file_name, fi)) < 0) {
|
|
Packit |
427e91 |
error("unable to save dsp patch (ld10k1 error:%s)", liblo10k1_error_str(err));
|
|
Packit |
427e91 |
goto err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
liblo10k1lf_file_info_free(fi);
|
|
Packit |
427e91 |
liblo10k1_patch_free(p);
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
err:
|
|
Packit |
427e91 |
if (fi)
|
|
Packit |
427e91 |
liblo10k1lf_file_info_free(fi);
|
|
Packit |
427e91 |
if (p)
|
|
Packit |
427e91 |
liblo10k1_patch_free(p);
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void debug_print(char *str)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
printf("%s", str);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static int debug(int deb)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int err;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((err = liblo10k1_debug(&conn, deb, debug_print)) < 0) {
|
|
Packit |
427e91 |
error("unable to debug (ld10k1 error:%s)", liblo10k1_error_str(err));
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static int del_patch(char *file_name)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int err;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((err = liblo10k1_patch_unload(&conn, atoi(file_name))) < 0 ) {
|
|
Packit |
427e91 |
error("unable to del patch (ld10k1 error:%s)", liblo10k1_error_str(err));
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static int setup_dsp()
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int err;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((err = liblo10k1_dsp_init(&conn)) < 0) {
|
|
Packit |
427e91 |
error("unable to setup DSP (ld10k1 error:%s)", liblo10k1_error_str(err));
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static int is_num(char *str)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int i;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < strlen(str); i++)
|
|
Packit |
427e91 |
if (!isdigit(str[i]))
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
typedef struct
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
char type;
|
|
Packit |
427e91 |
int patch;
|
|
Packit |
427e91 |
int io;
|
|
Packit |
427e91 |
} conn_info_t;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
char *parse_connect_sym(char *con_str, char *sym, int *len, int max_len)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
*len = 0;
|
|
Packit |
427e91 |
while (*len < max_len && *con_str && *con_str != ',' && *con_str != ')') {
|
|
Packit |
427e91 |
*sym++ = *con_str++;
|
|
Packit |
427e91 |
(*len)++;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
*sym++ = '\0';
|
|
Packit |
427e91 |
if (*len == 0)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
return con_str;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
char *parse_simple_params(char *con_str, char io_type, int pn, conn_info_t *con_info, int *con_info_count, int max_con_info_count)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
char con_arg[255];
|
|
Packit |
427e91 |
int con_arg_len = 0;
|
|
Packit |
427e91 |
int io_idx;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
while(1) {
|
|
Packit |
427e91 |
if (*con_info_count >= max_con_info_count)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
if (!(con_str = parse_connect_sym(con_str, con_arg, &con_arg_len, sizeof(con_arg) - 1)))
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
if (*con_str != ')' && *con_str != ',')
|
|
Packit |
427e91 |
return NULL; /* wrong format */
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
con_info[*con_info_count].type = io_type;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (is_num(con_arg)) {
|
|
Packit |
427e91 |
/* input number */
|
|
Packit |
427e91 |
if (io_type == 'A' || io_type == 'B') {
|
|
Packit |
427e91 |
con_info[*con_info_count].patch = pn;
|
|
Packit |
427e91 |
con_info[(*con_info_count)++].io = atoi(con_arg);
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
con_info[*con_info_count].patch = -1;
|
|
Packit |
427e91 |
con_info[(*con_info_count)++].io = atoi(con_arg);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
/* input name */
|
|
Packit |
427e91 |
switch (io_type) {
|
|
Packit |
427e91 |
case 'A':
|
|
Packit |
427e91 |
if (liblo10k1_find_patch_in(&conn, pn, con_arg, &io_idx) < 0)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
con_info[*con_info_count].patch = pn;
|
|
Packit |
427e91 |
con_info[(*con_info_count)++].io = io_idx;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'B':
|
|
Packit |
427e91 |
if (liblo10k1_find_patch_out(&conn, pn, con_arg, &io_idx) < 0)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
con_info[*con_info_count].patch = pn;
|
|
Packit |
427e91 |
con_info[(*con_info_count)++].io = io_idx;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'F':
|
|
Packit |
427e91 |
if (liblo10k1_find_fx(&conn, con_arg, &io_idx) < 0)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
con_info[*con_info_count].patch = -1;
|
|
Packit |
427e91 |
con_info[(*con_info_count)++].io = io_idx;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'I':
|
|
Packit |
427e91 |
if (liblo10k1_find_in(&conn, con_arg, &io_idx) < 0)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
con_info[*con_info_count].patch = -1;
|
|
Packit |
427e91 |
con_info[(*con_info_count)++].io = io_idx;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'O':
|
|
Packit |
427e91 |
if (liblo10k1_find_out(&conn, con_arg, &io_idx) < 0)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
con_info[*con_info_count].patch = -1;
|
|
Packit |
427e91 |
con_info[(*con_info_count)++].io = io_idx;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (*con_str != ',')
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
con_str++;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
return con_str;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
char *parse_patch_params(char *con_str, char io_type, conn_info_t *con_info, int *con_info_count, int max_con_info_count)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
char con_arg[255];
|
|
Packit |
427e91 |
int con_arg_len = 0;
|
|
Packit |
427e91 |
int i;
|
|
Packit |
427e91 |
int patch_num = -1;
|
|
Packit |
427e91 |
int io_count = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (!(con_str = parse_connect_sym(con_str, con_arg, &con_arg_len, sizeof(con_arg) - 1)))
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
if (*con_str != ')' && *con_str != ',')
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (is_num(con_arg))
|
|
Packit |
427e91 |
/* patch number */
|
|
Packit |
427e91 |
patch_num = atoi(con_arg);
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
/* patch name - find patch */
|
|
Packit |
427e91 |
if (liblo10k1_find_patch(&conn, con_arg, &patch_num) < 0)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* argumenty */
|
|
Packit |
427e91 |
if (*con_str == ',') {
|
|
Packit |
427e91 |
con_str++;
|
|
Packit |
427e91 |
if (*con_info_count >= max_con_info_count)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
if (!(con_str = parse_simple_params(con_str, io_type, patch_num, con_info, con_info_count, max_con_info_count)))
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
/* add all patch inputs or outputs */
|
|
Packit |
427e91 |
if (io_type == 'A') {
|
|
Packit |
427e91 |
/* get all inputs */
|
|
Packit |
427e91 |
if (liblo10k1_get_pin_count(&conn, patch_num, &io_count) < 0)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
/* get all outputs */
|
|
Packit |
427e91 |
if (liblo10k1_get_pout_count(&conn, patch_num, &io_count) < 0)
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
i = 0;
|
|
Packit |
427e91 |
while (i < io_count) {
|
|
Packit |
427e91 |
if (*con_info_count >= max_con_info_count) {
|
|
Packit |
427e91 |
return NULL;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
con_info[*con_info_count].type = io_type;
|
|
Packit |
427e91 |
con_info[*con_info_count].patch = patch_num;
|
|
Packit |
427e91 |
con_info[(*con_info_count)++].io = i;
|
|
Packit |
427e91 |
i++;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
return con_str;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int parse_connect(int add, char *con_str, int *multi, int *simple, conn_info_t **con_info, int *con_info_count, int max_con_info_count)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
char con[10];
|
|
Packit |
427e91 |
int con_len;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int ft = 0;
|
|
Packit |
427e91 |
while (1) {
|
|
Packit |
427e91 |
con_len = 0;
|
|
Packit |
427e91 |
for(;*con_str && *con_str != '('; con_str++) {
|
|
Packit |
427e91 |
if (con_len >= sizeof(con) - 1)
|
|
Packit |
427e91 |
return 1;/* ERROR */
|
|
Packit |
427e91 |
con[con_len++] = *con_str;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
con[con_len++] = '\0';
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (*con_str != '(')
|
|
Packit |
427e91 |
return 1;/* ERROR */
|
|
Packit |
427e91 |
con_str++;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (ft && strcmp(con,"FX") == 0) {
|
|
Packit |
427e91 |
if (!(con_str = parse_simple_params(con_str, 'F', -1, con_info[ft], &(con_info_count[ft]), max_con_info_count)))
|
|
Packit |
427e91 |
return 1;/* ERROR */
|
|
Packit |
427e91 |
} else if (ft && strcmp(con,"IN") == 0) {
|
|
Packit |
427e91 |
if (!(con_str = parse_simple_params(con_str, 'I', -1, con_info[ft], &(con_info_count[ft]), max_con_info_count)))
|
|
Packit |
427e91 |
return 1;/* ERROR */
|
|
Packit |
427e91 |
} else if (ft && strcmp(con,"OUT") == 0) {
|
|
Packit |
427e91 |
if (!(con_str = parse_simple_params(con_str, 'O', -1, con_info[ft], &(con_info_count[ft]), max_con_info_count)))
|
|
Packit |
427e91 |
return 1;/* ERROR */
|
|
Packit |
427e91 |
} else if (strcmp(con,"PIN") == 0) {
|
|
Packit |
427e91 |
if (!(con_str = parse_patch_params(con_str, 'A', con_info[ft], &(con_info_count[ft]), max_con_info_count)))
|
|
Packit |
427e91 |
return 1;/* ERROR */
|
|
Packit |
427e91 |
} else if (strcmp(con,"POUT") == 0) {
|
|
Packit |
427e91 |
if (!(con_str = parse_patch_params(con_str, 'B', con_info[ft], &(con_info_count[ft]), max_con_info_count)))
|
|
Packit |
427e91 |
return 1;/* ERROR */
|
|
Packit |
427e91 |
} else
|
|
Packit |
427e91 |
return 1;/* ERROR */
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
con_str++;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (ft && !*con_str)
|
|
Packit |
427e91 |
return 0; /* OK */
|
|
Packit |
427e91 |
if (!add) {
|
|
Packit |
427e91 |
if (!*con_str)
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (add && !ft && (*con_str == '=' || *con_str == '>' || *con_str == ':')) {
|
|
Packit |
427e91 |
ft++;
|
|
Packit |
427e91 |
if (*con_str == '=') {
|
|
Packit |
427e91 |
*multi = 0;
|
|
Packit |
427e91 |
*simple = 0;
|
|
Packit |
427e91 |
} else if (*con_str == ':') {
|
|
Packit |
427e91 |
*multi = 0;
|
|
Packit |
427e91 |
*simple = 1;
|
|
Packit |
427e91 |
} else
|
|
Packit |
427e91 |
*multi = 1;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
} else if (add &&*con_str != '+')
|
|
Packit |
427e91 |
return 1;/* ERROR */
|
|
Packit |
427e91 |
/* process next */
|
|
Packit |
427e91 |
con_str++;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int parse_rename(char *con_str, char *io_type, int *pn, int *io, char **new_name)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
char con[10];
|
|
Packit |
427e91 |
int con_len = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
char con_arg1[255];
|
|
Packit |
427e91 |
int con_arg_len1 = 0;
|
|
Packit |
427e91 |
int is_arg_num1 = 0;
|
|
Packit |
427e91 |
int arg_num1 = -1;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
char con_arg2[255];
|
|
Packit |
427e91 |
int con_arg_len2 = 0;
|
|
Packit |
427e91 |
int is_arg_num2 = 0;
|
|
Packit |
427e91 |
int arg_num2 = -1;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for(;*con_str && *con_str != '('; con_str++) {
|
|
Packit |
427e91 |
if (con_len >= sizeof(con) - 1)
|
|
Packit |
427e91 |
return 1;/* ERROR */
|
|
Packit |
427e91 |
con[con_len++] = *con_str;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
con[con_len++] = '\0';
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (*con_str != '(')
|
|
Packit |
427e91 |
return 1;/* ERROR */
|
|
Packit |
427e91 |
con_str++;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
*io_type = '\0';
|
|
Packit |
427e91 |
if (strcmp(con,"FX") == 0)
|
|
Packit |
427e91 |
*io_type = 'F';
|
|
Packit |
427e91 |
else if (strcmp(con,"IN") == 0)
|
|
Packit |
427e91 |
*io_type = 'I';
|
|
Packit |
427e91 |
else if (strcmp(con,"OUT") == 0)
|
|
Packit |
427e91 |
*io_type = 'O';
|
|
Packit |
427e91 |
else if (strcmp(con,"PIN") == 0)
|
|
Packit |
427e91 |
*io_type = 'A';
|
|
Packit |
427e91 |
else if (strcmp(con,"POUT") == 0)
|
|
Packit |
427e91 |
*io_type = 'B';
|
|
Packit |
427e91 |
else if (strcmp(con,"PATCH") == 0)
|
|
Packit |
427e91 |
*io_type = 'P';
|
|
Packit |
427e91 |
else
|
|
Packit |
427e91 |
return 1;/* ERROR */
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (!(con_str = parse_connect_sym(con_str, con_arg1, &con_arg_len1, sizeof(con_arg1) - 1)))
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((is_arg_num1 = is_num(con_arg1)))
|
|
Packit |
427e91 |
arg_num1 = atoi(con_arg1);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (*io_type == 'A' || *io_type == 'B') {
|
|
Packit |
427e91 |
/* two arguments */
|
|
Packit |
427e91 |
if (*con_str != ',')
|
|
Packit |
427e91 |
return 1; /* ERROR */
|
|
Packit |
427e91 |
con_str++;
|
|
Packit |
427e91 |
if (!(con_str = parse_connect_sym(con_str, con_arg2, &con_arg_len2, sizeof(con_arg2) - 1)))
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((is_arg_num2 = is_num(con_arg2)))
|
|
Packit |
427e91 |
arg_num2 = atoi(con_arg2);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (*con_str != ')')
|
|
Packit |
427e91 |
return 1; /* ERROR */
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
switch (*io_type) {
|
|
Packit |
427e91 |
case 'A':
|
|
Packit |
427e91 |
if (!is_arg_num1)
|
|
Packit |
427e91 |
if (liblo10k1_find_patch(&conn, con_arg1, &arg_num1) < 0)
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
if (!is_arg_num2)
|
|
Packit |
427e91 |
if (liblo10k1_find_patch_in(&conn, arg_num1, con_arg2, &arg_num2) < 0)
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'B':
|
|
Packit |
427e91 |
if (!is_arg_num1)
|
|
Packit |
427e91 |
if (liblo10k1_find_patch(&conn, con_arg1, &arg_num1) < 0)
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
if (!is_arg_num2)
|
|
Packit |
427e91 |
if (liblo10k1_find_patch_out(&conn, arg_num1, con_arg2, &arg_num2) < 0)
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'F':
|
|
Packit |
427e91 |
if (!is_arg_num1)
|
|
Packit |
427e91 |
if (liblo10k1_find_fx(&conn, con_arg1, &arg_num1) < 0)
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'I':
|
|
Packit |
427e91 |
if (!is_arg_num1)
|
|
Packit |
427e91 |
if (liblo10k1_find_in(&conn, con_arg1, &arg_num1) < 0)
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'O':
|
|
Packit |
427e91 |
if (!is_arg_num1)
|
|
Packit |
427e91 |
if (liblo10k1_find_out(&conn, con_arg1, &arg_num1) < 0)
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'P':
|
|
Packit |
427e91 |
if (!is_arg_num1)
|
|
Packit |
427e91 |
if (liblo10k1_find_patch(&conn, con_arg1, &arg_num1) < 0)
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
con_str++;
|
|
Packit |
427e91 |
if (*con_str != '=')
|
|
Packit |
427e91 |
return 1; /* ERROR */
|
|
Packit |
427e91 |
con_str++;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (*io_type == 'A' || *io_type == 'B' || *io_type == 'P') {
|
|
Packit |
427e91 |
*pn = arg_num1;
|
|
Packit |
427e91 |
*io = arg_num2;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
*io = arg_num1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
*new_name = con_str;
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static int con_add(char *file_name)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int err, i;
|
|
Packit |
427e91 |
int multi = 0;
|
|
Packit |
427e91 |
int simple = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
conn_info_t con_infof[32];
|
|
Packit |
427e91 |
conn_info_t con_infot[32];
|
|
Packit |
427e91 |
conn_info_t *con_info[2] = {con_infof, con_infot};
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int con_info_count[2] = {0, 0};
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (parse_connect(1, file_name, &multi, &simple, con_info, con_info_count, 32)) {
|
|
Packit |
427e91 |
error("wrong parameter - connection string");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (con_info_count[0] != con_info_count[1]) {
|
|
Packit |
427e91 |
error("wrong parameter - connection string from <> to");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (!con_info_count[0]) {
|
|
Packit |
427e91 |
error("wrong parameter - connection string");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < con_info_count[0]; i++) {
|
|
Packit |
427e91 |
if ((err = liblo10k1_con_add(&conn, multi, simple,
|
|
Packit |
427e91 |
con_infof[i].type, con_infof[i].patch, con_infof[i].io,
|
|
Packit |
427e91 |
con_infot[i].type, con_infot[i].patch, con_infot[i].io,
|
|
Packit |
427e91 |
NULL)) < 0) {
|
|
Packit |
427e91 |
error("unable to connect (ld10k1 error:%s)", liblo10k1_error_str(err));
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static int con_del(char *file_name)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
conn_info_t con_info[32];
|
|
Packit |
427e91 |
int err, i;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
conn_info_t *con_info_p = con_info;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int con_info_count = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (parse_connect(0, file_name, NULL, NULL, &con_info_p, &con_info_count, 32)) {
|
|
Packit |
427e91 |
error("wrong parameter - disconnection string");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (!con_info_count) {
|
|
Packit |
427e91 |
error("wrong parameter - disconnection string");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < con_info_count; i++) {
|
|
Packit |
427e91 |
if ((err = liblo10k1_con_del(&conn, con_info[i].type, con_info[i].patch, con_info[i].io, NULL)) < 0) {
|
|
Packit |
427e91 |
error("unable to connect (ld10k1 error:%s)", liblo10k1_error_str(err));
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static int rename_arg(char *arg_name)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
char io_type = '\0';
|
|
Packit |
427e91 |
int pn = -1;
|
|
Packit |
427e91 |
int io = -1;
|
|
Packit |
427e91 |
char *new_name = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (parse_rename(arg_name, &io_type, &pn, &io, &new_name)) {
|
|
Packit |
427e91 |
error("wrong parameter for rename");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
switch (io_type) {
|
|
Packit |
427e91 |
case 'A':
|
|
Packit |
427e91 |
if (liblo10k1_rename_patch_in(&conn, pn, io, new_name) < 0) {
|
|
Packit |
427e91 |
error("couldn't rename patch in");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'B':
|
|
Packit |
427e91 |
if (liblo10k1_rename_patch_out(&conn, pn, io, new_name) < 0) {
|
|
Packit |
427e91 |
error("couldn't rename patch out");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'F':
|
|
Packit |
427e91 |
if (liblo10k1_rename_fx(&conn, io, new_name) < 0) {
|
|
Packit |
427e91 |
error("couldn't rename fx");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'I':
|
|
Packit |
427e91 |
if (liblo10k1_rename_in(&conn, io, new_name) < 0) {
|
|
Packit |
427e91 |
error("couldn't rename in");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'O':
|
|
Packit |
427e91 |
if (liblo10k1_rename_out(&conn, io, new_name) < 0) {
|
|
Packit |
427e91 |
error("couldn't rename out");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'P':
|
|
Packit |
427e91 |
if (liblo10k1_rename_patch(&conn, pn, new_name) < 0) {
|
|
Packit |
427e91 |
error("couldn't rename patch");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static int dump(char *file_name)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int err;
|
|
Packit |
427e91 |
void *dump = NULL;
|
|
Packit |
427e91 |
int size = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
FILE *dump_file = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((err = liblo10k1_dump(&conn, &dump, &size)) < 0 ) {
|
|
Packit |
427e91 |
error("unable to dump (ld10k1 error:%s)", liblo10k1_error_str(err));
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dump_file = fopen(file_name, "w");
|
|
Packit |
427e91 |
if (!dump_file) {
|
|
Packit |
427e91 |
free(dump);
|
|
Packit |
427e91 |
error("unable to open dump");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (fwrite(dump, 1, size, dump_file) < size) {
|
|
Packit |
427e91 |
free(dump);
|
|
Packit |
427e91 |
error("unable to write dump");
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
free(dump);
|
|
Packit |
427e91 |
fclose(dump_file);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static int store_dsp(char *file_name)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int err;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
liblo10k1_file_dsp_setup_t *setup;
|
|
Packit |
427e91 |
liblo10k1_file_info_t *fi;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
fi = liblo10k1lf_file_info_alloc();
|
|
Packit |
427e91 |
if (!fi) {
|
|
Packit |
427e91 |
error("no mem");
|
|
Packit |
427e91 |
goto err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((err = liblo10k1lf_get_dsp_config(&conn, &setup)) < 0) {
|
|
Packit |
427e91 |
error("unable to get dsp config (ld10k1 error:%s)", liblo10k1_error_str(err));
|
|
Packit |
427e91 |
goto err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
fi->creater = strdup("lo10k1 - emu10k1/emu10k2 effect loader for alsa");
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((err = liblo10k1lf_save_dsp_config(setup, file_name, fi)) < 0) {
|
|
Packit |
427e91 |
error("unable to store dsp config (ld10k1 error:%s)", liblo10k1_error_str(err));
|
|
Packit |
427e91 |
goto err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
liblo10k1lf_file_info_free(fi);
|
|
Packit |
427e91 |
liblo10k1lf_dsp_config_free(setup);
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
err:
|
|
Packit |
427e91 |
if (fi)
|
|
Packit |
427e91 |
liblo10k1lf_file_info_free(fi);
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static int restore_dsp(char *file_name)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int err;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
liblo10k1_file_dsp_setup_t *setup;
|
|
Packit |
427e91 |
liblo10k1_file_info_t *fi;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
fi = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((err = liblo10k1lf_load_dsp_config(&setup, file_name, &fi)) < 0) {
|
|
Packit |
427e91 |
error("unable to restore dsp config (ld10k1 error:%s)", liblo10k1_error_str(err));
|
|
Packit |
427e91 |
goto err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((err = liblo10k1lf_put_dsp_config(&conn, setup)) < 0) {
|
|
Packit |
427e91 |
error("unable to put dsp config (ld10k1 error:%s)", liblo10k1_error_str(err));
|
|
Packit |
427e91 |
goto err;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
liblo10k1lf_file_info_free(fi);
|
|
Packit |
427e91 |
liblo10k1lf_dsp_config_free(setup);
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
err:
|
|
Packit |
427e91 |
if (fi)
|
|
Packit |
427e91 |
liblo10k1lf_file_info_free(fi);
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
int main(int argc, char *argv[])
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int c;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int opt_list;
|
|
Packit |
427e91 |
int opt_setup;
|
|
Packit |
427e91 |
int opt_info;
|
|
Packit |
427e91 |
int opt_add;
|
|
Packit |
427e91 |
int opt_del;
|
|
Packit |
427e91 |
int opt_con_add;
|
|
Packit |
427e91 |
int opt_con_del;
|
|
Packit |
427e91 |
int opt_debug;
|
|
Packit |
427e91 |
char *opt_list_patch;
|
|
Packit |
427e91 |
int opt_use_default_io_names;
|
|
Packit |
427e91 |
char *opt_ctrl;
|
|
Packit |
427e91 |
char *opt_patch_name;
|
|
Packit |
427e91 |
char *opt_new_name;
|
|
Packit |
427e91 |
int opt_where;
|
|
Packit |
427e91 |
int option_index = 0;
|
|
Packit |
427e91 |
char *opt_dump_name;
|
|
Packit |
427e91 |
char *opt_host;
|
|
Packit |
427e91 |
char *tmp = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int opt_store;
|
|
Packit |
427e91 |
int opt_restore;
|
|
Packit |
427e91 |
char *opt_store_restore_file;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int opt_load_patch;
|
|
Packit |
427e91 |
int opt_save_patch;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
unsigned int opt_wait_for_conn;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
liblo10k1_param params;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int err = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static struct option long_options[] = {
|
|
Packit |
427e91 |
{"pipe_name", 1, 0, 'p'},
|
|
Packit |
427e91 |
{"list", 1, 0, 'l'},
|
|
Packit |
427e91 |
{"info", 0, 0, 'i'},
|
|
Packit |
427e91 |
{"add", 1, 0, 'a'},
|
|
Packit |
427e91 |
{"del", 1, 0, 'd'},
|
|
Packit |
427e91 |
{"conadd", 1, 0, 'q'},
|
|
Packit |
427e91 |
{"condel", 1, 0, 'w'},
|
|
Packit |
427e91 |
{"debug", 1, 0, 0},
|
|
Packit |
427e91 |
{"defionames", 0, 0, 'n'},
|
|
Packit |
427e91 |
{"ctrl", 1, 0, 0},
|
|
Packit |
427e91 |
{"patch_name", 1, 0, 0},
|
|
Packit |
427e91 |
{"where", 1, 0, 0},
|
|
Packit |
427e91 |
{"setup", 1, 0, 's'},
|
|
Packit |
427e91 |
{"renam", 1, 0, 0},
|
|
Packit |
427e91 |
{"dump", 1, 0, 0},
|
|
Packit |
427e91 |
{"host", 1, 0, 0},
|
|
Packit |
427e91 |
{"path", 1, 0, 'P'},
|
|
Packit |
427e91 |
{"store", 1, 0, 0},
|
|
Packit |
427e91 |
{"restore", 1, 0, 0},
|
|
Packit |
427e91 |
{"load_patch", 1, 0, 0},
|
|
Packit |
427e91 |
{"save_patch", 1, 0, 0},
|
|
Packit |
427e91 |
{"wait", 1, 0, 0},
|
|
Packit |
427e91 |
{0, 0, 0, 0}
|
|
Packit |
427e91 |
};
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
opt_list = 0;
|
|
Packit |
427e91 |
opt_add = 0;
|
|
Packit |
427e91 |
opt_del = 0;
|
|
Packit |
427e91 |
opt_list_patch = NULL;
|
|
Packit |
427e91 |
opt_info = 0;
|
|
Packit |
427e91 |
opt_con_add = 0;
|
|
Packit |
427e91 |
opt_con_del = 0;
|
|
Packit |
427e91 |
opt_debug = 0;
|
|
Packit |
427e91 |
opt_use_default_io_names = 0;
|
|
Packit |
427e91 |
opt_ctrl = NULL;
|
|
Packit |
427e91 |
opt_patch_name = NULL;
|
|
Packit |
427e91 |
opt_new_name = NULL;
|
|
Packit |
427e91 |
opt_where = -1;
|
|
Packit |
427e91 |
opt_setup = 0;
|
|
Packit |
427e91 |
opt_dump_name = NULL;
|
|
Packit |
427e91 |
opt_host = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
opt_store = 0;
|
|
Packit |
427e91 |
opt_restore = 0;
|
|
Packit |
427e91 |
opt_store_restore_file = NULL;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
opt_load_patch = 0;
|
|
Packit |
427e91 |
opt_save_patch = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
opt_wait_for_conn = 500;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
strcpy(comm_pipe,"/tmp/.ld10k1_port");
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (argc > 1 && !strcmp(argv[1], "--help")) {
|
|
Packit |
427e91 |
help(argv[0]);
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
first_path = NULL;
|
|
Packit |
427e91 |
#ifdef EFFECTSDIR
|
|
Packit |
427e91 |
add_paths(EFFECTSDIR);
|
|
Packit |
427e91 |
#endif
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
while ((c = getopt_long(argc, argv, "hil:p:a:d:q:w:nsh:P:",
|
|
Packit |
427e91 |
long_options, &option_index)) != EOF) {
|
|
Packit |
427e91 |
switch (c) {
|
|
Packit |
427e91 |
case 0:
|
|
Packit |
427e91 |
if (strcmp(long_options[option_index].name, "debug") == 0)
|
|
Packit |
427e91 |
opt_debug = atoi(optarg);
|
|
Packit |
427e91 |
else if (strcmp(long_options[option_index].name, "ctrl") == 0)
|
|
Packit |
427e91 |
opt_ctrl = optarg;
|
|
Packit |
427e91 |
else if (strcmp(long_options[option_index].name, "patch_name") == 0)
|
|
Packit |
427e91 |
opt_patch_name = optarg;
|
|
Packit |
427e91 |
else if (strcmp(long_options[option_index].name, "where") == 0)
|
|
Packit |
427e91 |
opt_where = atoi(optarg);
|
|
Packit |
427e91 |
else if (strcmp(long_options[option_index].name, "renam") == 0)
|
|
Packit |
427e91 |
opt_new_name = optarg;
|
|
Packit |
427e91 |
else if (strcmp(long_options[option_index].name, "dump") == 0)
|
|
Packit |
427e91 |
opt_dump_name = optarg;
|
|
Packit |
427e91 |
else if (strcmp(long_options[option_index].name, "host") == 0)
|
|
Packit |
427e91 |
opt_host = optarg;
|
|
Packit |
427e91 |
else if (strcmp(long_options[option_index].name, "wait") == 0) {
|
|
Packit |
427e91 |
opt_wait_for_conn = atoi(optarg);
|
|
Packit |
427e91 |
if (opt_wait_for_conn < 0)
|
|
Packit |
427e91 |
opt_wait_for_conn = 0;
|
|
Packit |
427e91 |
else if (opt_wait_for_conn > 500)
|
|
Packit |
427e91 |
opt_wait_for_conn = 500;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
else if (strcmp(long_options[option_index].name, "store") == 0) {
|
|
Packit |
427e91 |
opt_store = 1;
|
|
Packit |
427e91 |
opt_store_restore_file = optarg;
|
|
Packit |
427e91 |
} else if (strcmp(long_options[option_index].name, "restore") == 0) {
|
|
Packit |
427e91 |
opt_restore = 1;
|
|
Packit |
427e91 |
opt_store_restore_file = optarg;
|
|
Packit |
427e91 |
} else if (strcmp(long_options[option_index].name, "load_patch") == 0) {
|
|
Packit |
427e91 |
opt_load_patch = 1;
|
|
Packit |
427e91 |
opt_store_restore_file = optarg;
|
|
Packit |
427e91 |
} else if (strcmp(long_options[option_index].name, "save_patch") == 0) {
|
|
Packit |
427e91 |
opt_save_patch = 1;
|
|
Packit |
427e91 |
opt_store_restore_file = optarg;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'h':
|
|
Packit |
427e91 |
help(argv[0]);
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
case 'l':
|
|
Packit |
427e91 |
opt_list = 1;
|
|
Packit |
427e91 |
opt_list_patch = optarg;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'p':
|
|
Packit |
427e91 |
strcpy(comm_pipe, optarg);
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'a':
|
|
Packit |
427e91 |
opt_add = 1;
|
|
Packit |
427e91 |
opt_list_patch = optarg;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'd':
|
|
Packit |
427e91 |
opt_del = 1;
|
|
Packit |
427e91 |
opt_list_patch = optarg;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'i':
|
|
Packit |
427e91 |
opt_info = 1;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'q':
|
|
Packit |
427e91 |
opt_con_add = 1;
|
|
Packit |
427e91 |
opt_list_patch = optarg;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'w':
|
|
Packit |
427e91 |
opt_con_del = 1;
|
|
Packit |
427e91 |
opt_list_patch = optarg;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'n':
|
|
Packit |
427e91 |
opt_use_default_io_names = 1;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 's':
|
|
Packit |
427e91 |
opt_setup = 1;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 'P':
|
|
Packit |
427e91 |
add_path(optarg);
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case '?':
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
default:
|
|
Packit |
427e91 |
error("unknown option %c", c);
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
params.wfc = opt_wait_for_conn;
|
|
Packit |
427e91 |
if (opt_host) {
|
|
Packit |
427e91 |
params.type = COMM_TYPE_IP;
|
|
Packit |
427e91 |
params.name = strtok(opt_host, ":");
|
|
Packit |
427e91 |
if (!params.name)
|
|
Packit |
427e91 |
error("wrong hostname");
|
|
Packit |
427e91 |
tmp = strtok(NULL, ":");
|
|
Packit |
427e91 |
if (!tmp)
|
|
Packit |
427e91 |
error("wrong port");
|
|
Packit |
427e91 |
params.port = atoi(tmp);
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
params.type = COMM_TYPE_LOCAL;
|
|
Packit |
427e91 |
params.name = comm_pipe;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
params.server = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
while (1) {
|
|
Packit |
427e91 |
if ((err = liblo10k1_connect(¶ms, &conn))) {
|
|
Packit |
427e91 |
error("unable to connect ld10k1");
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((err = liblo10k1_check_version(&conn))) {
|
|
Packit |
427e91 |
error("Wrong ld10k1 version");
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (opt_store || opt_restore) {
|
|
Packit |
427e91 |
if (opt_store) {
|
|
Packit |
427e91 |
if ((err = store_dsp(opt_store_restore_file)))
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
if ((err = restore_dsp(opt_store_restore_file)))
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
if (opt_setup)
|
|
Packit |
427e91 |
if ((err = setup_dsp()))
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
if (opt_list)
|
|
Packit |
427e91 |
if ((err = list_patch(opt_list_patch)))
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (opt_add)
|
|
Packit |
427e91 |
if ((err = add_patch(opt_list_patch, opt_use_default_io_names, opt_ctrl, opt_patch_name, opt_where)))
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (opt_load_patch)
|
|
Packit |
427e91 |
if ((err = load_dsp_patch(opt_store_restore_file, opt_ctrl, opt_patch_name, opt_where)))
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (opt_save_patch)
|
|
Packit |
427e91 |
if ((err = save_dsp_patch(opt_store_restore_file, opt_where)))
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (opt_del)
|
|
Packit |
427e91 |
if ((err = del_patch(opt_list_patch)))
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (opt_con_add)
|
|
Packit |
427e91 |
if ((err = con_add(opt_list_patch)))
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (opt_con_del)
|
|
Packit |
427e91 |
if ((err = con_del(opt_list_patch)))
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (opt_debug)
|
|
Packit |
427e91 |
if ((err = debug(opt_debug)))
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (opt_new_name)
|
|
Packit |
427e91 |
if ((err = rename_arg(opt_new_name)))
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (opt_dump_name)
|
|
Packit |
427e91 |
if ((err = dump(opt_dump_name)))
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (liblo10k1_is_open(&conn)) {
|
|
Packit |
427e91 |
/*send_msg(conn_num, FNC_CLOSE_CONN, NULL, 0);
|
|
Packit |
427e91 |
free_comm(conn_num);*/
|
|
Packit |
427e91 |
liblo10k1_disconnect(&conn;;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
free_all_paths();
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
return err;
|
|
Packit |
427e91 |
}
|