|
Packit Service |
b98cfc |
/*
|
|
Packit Service |
b98cfc |
* EMU10k1 loader
|
|
Packit Service |
b98cfc |
*
|
|
Packit Service |
b98cfc |
* Copyright (c) 2003,2004 by Peter Zubaj
|
|
Packit Service |
b98cfc |
*
|
|
Packit Service |
b98cfc |
* This program is free software; you can redistribute it and/or modify
|
|
Packit Service |
b98cfc |
* it under the terms of the GNU General Public License as published by
|
|
Packit Service |
b98cfc |
* the Free Software Foundation; either version 2 of the License, or
|
|
Packit Service |
b98cfc |
* (at your option) any later version.
|
|
Packit Service |
b98cfc |
*
|
|
Packit Service |
b98cfc |
* This program is distributed in the hope that it will be useful,
|
|
Packit Service |
b98cfc |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
b98cfc |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit Service |
b98cfc |
* GNU General Public License for more details.
|
|
Packit Service |
b98cfc |
*
|
|
Packit Service |
b98cfc |
* You should have received a copy of the GNU General Public License
|
|
Packit Service |
b98cfc |
* along with this program; if not, write to the Free Software
|
|
Packit Service |
b98cfc |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit Service |
b98cfc |
*
|
|
Packit Service |
b98cfc |
*/
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
#ifdef HAVE_CONFIG_H
|
|
Packit Service |
b98cfc |
#include "config.h"
|
|
Packit Service |
b98cfc |
#endif
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
#include <alsa/asoundlib.h>
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
#include <signal.h>
|
|
Packit Service |
b98cfc |
#include "ld10k1.h"
|
|
Packit Service |
b98cfc |
#include "ld10k1_fnc.h"
|
|
Packit Service |
b98cfc |
#include "ld10k1_fnc_int.h"
|
|
Packit Service |
b98cfc |
#include "ld10k1_debug.h"
|
|
Packit Service |
b98cfc |
#include "ld10k1_error.h"
|
|
Packit Service |
b98cfc |
#include "ld10k1_dump.h"
|
|
Packit Service |
b98cfc |
#include "ld10k1_driver.h"
|
|
Packit Service |
b98cfc |
#include "ld10k1_mixer.h"
|
|
Packit Service |
b98cfc |
#include "comm.h"
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
void ld10k1_fnc_prepare_free();
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_patch_add(int data_conn, int op, int size);
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_patch_del(int data_conn, int op, int size);
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_patch_conn(int data_conn, int op, int size);
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_name_find(int data_conn, int op, int size);
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_name_rename(int data_conn, int op, int size);
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_dsp_init(int data_conn, int op, int size);
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_get_io_count(int data_conn, int op, int size);
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_get_io(int data_conn, int op, int size);
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_get_pio_count(int data_conn, int op, int size);
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_get_pio(int data_conn, int op, int size);
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_get_patches_info(int data_conn, int op, int size);
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_get_patch(int data_conn, int op, int size);
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_dump(int data_conn, int op, int size);
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_version(int data_conn, int op, int size);
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_get_points_info(int data_conn, int op, int size);
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_get_point_info(int data_conn, int op, int size);
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_get_dsp_info(int data_conn, int op, int size);
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
ld10k1_dsp_mgr_t dsp_mgr;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
struct fnc_table_t
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int fnc;
|
|
Packit Service |
b98cfc |
int min_size;
|
|
Packit Service |
b98cfc |
int max_size;
|
|
Packit Service |
b98cfc |
int (*fnc_code)(int data_conn, int op, int size);
|
|
Packit Service |
b98cfc |
};
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
struct fnc_table_t fnc_table[] =
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
{FNC_PATCH_ADD, sizeof(ld10k1_fnc_patch_add_t), sizeof(ld10k1_fnc_patch_add_t), ld10k1_fnc_patch_add},
|
|
Packit Service |
b98cfc |
{FNC_PATCH_DEL, sizeof(ld10k1_fnc_patch_del_t), sizeof(ld10k1_fnc_patch_del_t), ld10k1_fnc_patch_del},
|
|
Packit Service |
b98cfc |
{FNC_CONNECTION_ADD, sizeof(ld10k1_fnc_connection_t), sizeof(ld10k1_fnc_connection_t), ld10k1_fnc_patch_conn},
|
|
Packit Service |
b98cfc |
{FNC_CONNECTION_DEL, sizeof(ld10k1_fnc_connection_t), sizeof(ld10k1_fnc_connection_t), ld10k1_fnc_patch_conn},
|
|
Packit Service |
b98cfc |
{FNC_DEBUG, sizeof(ld10k1_fnc_debug_t), sizeof(ld10k1_fnc_debug_t), ld10k1_fnc_debug},
|
|
Packit Service |
b98cfc |
{FNC_PATCH_RENAME, sizeof(ld10k1_fnc_name_t), sizeof(ld10k1_fnc_name_t), ld10k1_fnc_name_rename},
|
|
Packit Service |
b98cfc |
{FNC_PATCH_FIND, sizeof(ld10k1_fnc_name_t), sizeof(ld10k1_fnc_name_t), ld10k1_fnc_name_find},
|
|
Packit Service |
b98cfc |
{FNC_FX_FIND, sizeof(ld10k1_fnc_name_t), sizeof(ld10k1_fnc_name_t), ld10k1_fnc_name_find},
|
|
Packit Service |
b98cfc |
{FNC_IN_FIND, sizeof(ld10k1_fnc_name_t), sizeof(ld10k1_fnc_name_t), ld10k1_fnc_name_find},
|
|
Packit Service |
b98cfc |
{FNC_OUT_FIND, sizeof(ld10k1_fnc_name_t), sizeof(ld10k1_fnc_name_t), ld10k1_fnc_name_find},
|
|
Packit Service |
b98cfc |
{FNC_PATCH_IN_FIND, sizeof(ld10k1_fnc_name_t), sizeof(ld10k1_fnc_name_t), ld10k1_fnc_name_find},
|
|
Packit Service |
b98cfc |
{FNC_PATCH_OUT_FIND, sizeof(ld10k1_fnc_name_t), sizeof(ld10k1_fnc_name_t), ld10k1_fnc_name_find},
|
|
Packit Service |
b98cfc |
{FNC_FX_RENAME, sizeof(ld10k1_fnc_name_t), sizeof(ld10k1_fnc_name_t), ld10k1_fnc_name_rename},
|
|
Packit Service |
b98cfc |
{FNC_IN_RENAME, sizeof(ld10k1_fnc_name_t), sizeof(ld10k1_fnc_name_t), ld10k1_fnc_name_rename},
|
|
Packit Service |
b98cfc |
{FNC_OUT_RENAME, sizeof(ld10k1_fnc_name_t), sizeof(ld10k1_fnc_name_t), ld10k1_fnc_name_rename},
|
|
Packit Service |
b98cfc |
{FNC_PATCH_IN_RENAME, sizeof(ld10k1_fnc_name_t), sizeof(ld10k1_fnc_name_t), ld10k1_fnc_name_rename},
|
|
Packit Service |
b98cfc |
{FNC_PATCH_OUT_RENAME, sizeof(ld10k1_fnc_name_t), sizeof(ld10k1_fnc_name_t), ld10k1_fnc_name_rename},
|
|
Packit Service |
b98cfc |
{FNC_GET_FX_COUNT, 0, 0, ld10k1_fnc_get_io_count},
|
|
Packit Service |
b98cfc |
{FNC_GET_IN_COUNT, 0, 0, ld10k1_fnc_get_io_count},
|
|
Packit Service |
b98cfc |
{FNC_GET_OUT_COUNT, 0, 0, ld10k1_fnc_get_io_count},
|
|
Packit Service |
b98cfc |
{FNC_GET_PIN_COUNT, sizeof(int), sizeof(int), ld10k1_fnc_get_pio_count},
|
|
Packit Service |
b98cfc |
{FNC_GET_POUT_COUNT, sizeof(int), sizeof(int), ld10k1_fnc_get_pio_count},
|
|
Packit Service |
b98cfc |
{FNC_GET_FX, sizeof(int), sizeof(int), ld10k1_fnc_get_io},
|
|
Packit Service |
b98cfc |
{FNC_GET_IN, sizeof(int), sizeof(int), ld10k1_fnc_get_io},
|
|
Packit Service |
b98cfc |
{FNC_GET_OUT, sizeof(int), sizeof(int), ld10k1_fnc_get_io},
|
|
Packit Service |
b98cfc |
{FNC_GET_PIN, sizeof(int) * 2, sizeof(int) * 2, ld10k1_fnc_get_pio},
|
|
Packit Service |
b98cfc |
{FNC_GET_POUT, sizeof(int) * 2, sizeof(int) * 2, ld10k1_fnc_get_pio},
|
|
Packit Service |
b98cfc |
{FNC_GET_PATCHES_INFO, 0, 0, ld10k1_fnc_get_patches_info},
|
|
Packit Service |
b98cfc |
{FNC_GET_PATCH, sizeof(int), sizeof(int), ld10k1_fnc_get_patch},
|
|
Packit Service |
b98cfc |
{FNC_DSP_INIT, 0, 0, ld10k1_fnc_dsp_init},
|
|
Packit Service |
b98cfc |
{FNC_DUMP, 0, 0, ld10k1_fnc_dump},
|
|
Packit Service |
b98cfc |
{FNC_VERSION, 0, 0, ld10k1_fnc_version},
|
|
Packit Service |
b98cfc |
{FNC_GET_POINTS_INFO, 0, 0, ld10k1_fnc_get_points_info},
|
|
Packit Service |
b98cfc |
{FNC_GET_POINT_INFO, sizeof(int), sizeof(int), ld10k1_fnc_get_point_info},
|
|
Packit Service |
b98cfc |
{FNC_GET_DSP_INFO, 0, 0, ld10k1_fnc_get_dsp_info},
|
|
Packit Service |
b98cfc |
{-1, 0, 0, NULL}
|
|
Packit Service |
b98cfc |
};
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
ld10k1_dsp_mgr_t dsp_mgr;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int send_response_ok(int conn_num)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
return send_response(conn_num, FNC_OK, 0, NULL, 0);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int send_response_err(int conn_num, int err)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
return send_response(conn_num, FNC_ERR, err, NULL, 0);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int send_response_wd(int conn_num, void *data, int data_size)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
return send_response(conn_num, FNC_OK, 0, data, data_size);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
struct ClientDefTag
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int used;
|
|
Packit Service |
b98cfc |
int socket;
|
|
Packit Service |
b98cfc |
};
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
typedef struct ClientDefTag ClientDef;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
#define MAX_CLIENTS 10
|
|
Packit Service |
b98cfc |
ClientDef clients[MAX_CLIENTS];
|
|
Packit Service |
b98cfc |
int clients_count = 0;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
static void client_init()
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
for (i = 0; i < MAX_CLIENTS; i++)
|
|
Packit Service |
b98cfc |
clients[i].used = 0;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
clients_count = 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
static int client_add()
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
for (i = 0; i < MAX_CLIENTS; i++)
|
|
Packit Service |
b98cfc |
if (clients[i].used == 0) {
|
|
Packit Service |
b98cfc |
clients[i].used = 1;
|
|
Packit Service |
b98cfc |
clients_count++;
|
|
Packit Service |
b98cfc |
return i;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
return -1;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
static void client_del(int client)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
if (client >= 0 && client < MAX_CLIENTS && clients[client].used == 1) {
|
|
Packit Service |
b98cfc |
clients[client].used = 0;
|
|
Packit Service |
b98cfc |
clients_count--;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
static int client_find_by_socket(int socket)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
for (i = 0; i < MAX_CLIENTS; i++)
|
|
Packit Service |
b98cfc |
if (clients[i].socket == socket)
|
|
Packit Service |
b98cfc |
return i;
|
|
Packit Service |
b98cfc |
return -1;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int main_loop(comm_param *param, int audigy, const char *card_id, int tram_size, snd_ctl_t *ctlp)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
fd_set active_fd_set/*, read_fd_set*/;
|
|
Packit Service |
b98cfc |
int i, j, res = 0;
|
|
Packit Service |
b98cfc |
__sighandler_t old_sig_pipe;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int main_sock = 0;
|
|
Packit Service |
b98cfc |
int data_sock = 0;
|
|
Packit Service |
b98cfc |
int new_client = 0;
|
|
Packit Service |
b98cfc |
int op = 0;
|
|
Packit Service |
b98cfc |
int data_size = 0;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int retval = 0;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
dsp_mgr.audigy = audigy;
|
|
Packit Service |
b98cfc |
dsp_mgr.card_id = card_id;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (ld10k1_dsp_mgr_init(&dsp_mgr))
|
|
Packit Service |
b98cfc |
return -1;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* initialize id generators */
|
|
Packit Service |
b98cfc |
ld10k1_dsp_mgr_init_id_gen(&dsp_mgr);
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (ld10k1_init_driver(&dsp_mgr, tram_size) < 0) {
|
|
Packit Service |
b98cfc |
ld10k1_dsp_mgr_free(&dsp_mgr);
|
|
Packit Service |
b98cfc |
return -1;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (ld10k1_init_reserved_ctls(&dsp_mgr, ctlp) < 0) {
|
|
Packit Service |
b98cfc |
ld10k1_dsp_mgr_free(&dsp_mgr);
|
|
Packit Service |
b98cfc |
return -1;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
old_sig_pipe = signal(SIGPIPE, SIG_IGN);
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
param->server = 1;
|
|
Packit Service |
b98cfc |
if ((main_sock = setup_comm(param)) < 0)
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (listen_comm(main_sock))
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* Initialize the set of active sockets. */
|
|
Packit Service |
b98cfc |
client_init();
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
while (1) {
|
|
Packit Service |
b98cfc |
/* Block until input arrives on one or more active sockets. */
|
|
Packit Service |
b98cfc |
FD_ZERO (&active_fd_set);
|
|
Packit Service |
b98cfc |
FD_SET (main_sock, &active_fd_set);
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
for (i = 0; i < MAX_CLIENTS; i++)
|
|
Packit Service |
b98cfc |
if (clients[i].used)
|
|
Packit Service |
b98cfc |
FD_SET(clients[i].socket, &active_fd_set);
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (select(FD_SETSIZE, &active_fd_set, NULL, NULL, NULL) < 0)
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
for (i = 0; i < FD_SETSIZE; i++)
|
|
Packit Service |
b98cfc |
if (FD_ISSET (i, &active_fd_set)) {
|
|
Packit Service |
b98cfc |
if (i == main_sock) {
|
|
Packit Service |
b98cfc |
/* Connection request on original socket. */
|
|
Packit Service |
b98cfc |
if ((data_sock = accept_comm(main_sock)) < 0)
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
new_client = client_add();
|
|
Packit Service |
b98cfc |
if (new_client < 0)
|
|
Packit Service |
b98cfc |
free_comm(data_sock);
|
|
Packit Service |
b98cfc |
else
|
|
Packit Service |
b98cfc |
clients[new_client].socket = data_sock;
|
|
Packit Service |
b98cfc |
/*FD_SET(data_sock, &active_fd_set);*/
|
|
Packit Service |
b98cfc |
} else {
|
|
Packit Service |
b98cfc |
/* Data arriving on an already-connected socket. */
|
|
Packit Service |
b98cfc |
if (receive_request(i, &op, &data_size))
|
|
Packit Service |
b98cfc |
/*goto error;*/
|
|
Packit Service |
b98cfc |
op = -1; /* probably client closes */
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (op == FNC_CLOSE_CONN) {
|
|
Packit Service |
b98cfc |
/* wait some time */
|
|
Packit Service |
b98cfc |
usleep(10000);
|
|
Packit Service |
b98cfc |
goto e_close;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (op >= 0) {
|
|
Packit Service |
b98cfc |
/* search in function table */
|
|
Packit Service |
b98cfc |
res = 1;
|
|
Packit Service |
b98cfc |
for (j = 0; fnc_table[j].fnc >= 0; j++) {
|
|
Packit Service |
b98cfc |
if ((fnc_table[j].fnc == op) &&
|
|
Packit Service |
b98cfc |
(data_size >= fnc_table[j].min_size) &&
|
|
Packit Service |
b98cfc |
(data_size <= fnc_table[j].max_size)) {
|
|
Packit Service |
b98cfc |
res = (*fnc_table[j].fnc_code)(i, op, data_size);
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
if (!res) {
|
|
Packit Service |
b98cfc |
if (send_response(i, FNC_OK, 0, NULL, 0) < 0)
|
|
Packit Service |
b98cfc |
goto e_close;
|
|
Packit Service |
b98cfc |
} else {
|
|
Packit Service |
b98cfc |
if (send_response(i, FNC_ERR, res, NULL, 0) < 0)
|
|
Packit Service |
b98cfc |
goto e_close;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
} else {
|
|
Packit Service |
b98cfc |
e_close:
|
|
Packit Service |
b98cfc |
if (op != FNC_CLOSE_CONN)
|
|
Packit Service |
b98cfc |
printf("error protocol fnc:%d - %d\n", op, res);
|
|
Packit Service |
b98cfc |
client_del(client_find_by_socket(i));
|
|
Packit Service |
b98cfc |
/*FD_CLR (i, &active_fd_set);*/
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* close connection */
|
|
Packit Service |
b98cfc |
if (free_comm(i))
|
|
Packit Service |
b98cfc |
data_sock = 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
end:
|
|
Packit Service |
b98cfc |
signal(SIGPIPE, old_sig_pipe);
|
|
Packit Service |
b98cfc |
for (i = 0; i < MAX_CLIENTS; i++)
|
|
Packit Service |
b98cfc |
if (clients[i].used) {
|
|
Packit Service |
b98cfc |
client_del(i);
|
|
Packit Service |
b98cfc |
free_comm(clients[i].socket);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
free_comm(main_sock);
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
ld10k1_free_reserved_ctls(&dsp_mgr);
|
|
Packit Service |
b98cfc |
ld10k1_dsp_mgr_free(&dsp_mgr);
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return retval;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
error:
|
|
Packit Service |
b98cfc |
retval = -1;
|
|
Packit Service |
b98cfc |
goto end;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_receive_patch_info(int data_conn, ld10k1_dsp_patch_t *new_patch, int *where)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
ld10k1_fnc_patch_add_t tmp_info;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (receive_msg_data(data_conn, &tmp_info, sizeof(ld10k1_fnc_patch_add_t)) < 0)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PROTOCOL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
memcpy(new_patch, &(tmp_info.patch), sizeof(ld10k1_dsp_patch_t));
|
|
Packit Service |
b98cfc |
*where = tmp_info.where;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
new_patch->patch_name[MAX_NAME_LEN - 1] = '\n';
|
|
Packit Service |
b98cfc |
if (new_patch->in_count < 0 || new_patch->in_count > 32)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PROTOCOL_IN_COUNT;
|
|
Packit Service |
b98cfc |
if (new_patch->out_count < 0 || new_patch->out_count > 32)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PROTOCOL_OUT_COUNT;
|
|
Packit Service |
b98cfc |
if (new_patch->const_count < 0 || new_patch->const_count > 255)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PROTOCOL_CONST_COUNT;
|
|
Packit Service |
b98cfc |
if (new_patch->static_count < 0 || new_patch->static_count > 255)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PROTOCOL_STATIC_COUNT;
|
|
Packit Service |
b98cfc |
if (new_patch->dynamic_count < 0 || new_patch->dynamic_count > 255)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PROTOCOL_DYNAMIC_COUNT;
|
|
Packit Service |
b98cfc |
if (new_patch->hw_count < 0 || new_patch->hw_count > 255)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PROTOCOL_HW_COUNT;
|
|
Packit Service |
b98cfc |
if (new_patch->tram_count < 0 || new_patch->tram_count > 255)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PROTOCOL_TRAM_COUNT;
|
|
Packit Service |
b98cfc |
if (new_patch->tram_acc_count < 0 || new_patch->tram_acc_count > 255)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PROTOCOL_TRAM_ACC_COUNT;
|
|
Packit Service |
b98cfc |
if (new_patch->ctl_count < 0 || new_patch->ctl_count > 255)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PROTOCOL_CTL_COUNT;
|
|
Packit Service |
b98cfc |
if (new_patch->instr_count < 0 || new_patch->instr_count > 512)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PROTOCOL_INSTR_COUNT;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return send_response_ok(data_conn);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_receive_patch_in(int data_conn, ld10k1_patch_t *new_patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
ld10k1_dsp_p_in_out_t *new_in = NULL;
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
int err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!new_patch->in_count)
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!(new_in = (ld10k1_dsp_p_in_out_t *)receive_msg_data_malloc(data_conn, sizeof(ld10k1_dsp_p_in_out_t) * new_patch->in_count)))
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PROTOCOL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* copy values */
|
|
Packit Service |
b98cfc |
for (i = 0; i < new_patch->in_count; i++) {
|
|
Packit Service |
b98cfc |
if (!ld10k1_dsp_mgr_name_new(&(new_patch->ins[i].name), new_in[i].name)) {
|
|
Packit Service |
b98cfc |
err = LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return send_response_ok(data_conn);
|
|
Packit Service |
b98cfc |
error:
|
|
Packit Service |
b98cfc |
free(new_in);
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_receive_patch_out(int data_conn, ld10k1_patch_t *new_patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
ld10k1_dsp_p_in_out_t *new_out = NULL;
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
int err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!new_patch->out_count)
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!(new_out = (ld10k1_dsp_p_in_out_t *)receive_msg_data_malloc(data_conn, sizeof(ld10k1_dsp_p_in_out_t) * new_patch->out_count)))
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PROTOCOL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* copy values */
|
|
Packit Service |
b98cfc |
for (i = 0; i < new_patch->out_count; i++) {
|
|
Packit Service |
b98cfc |
if (!ld10k1_dsp_mgr_name_new(&(new_patch->outs[i].name), new_out[i].name)) {
|
|
Packit Service |
b98cfc |
err = LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return send_response_ok(data_conn);
|
|
Packit Service |
b98cfc |
error:
|
|
Packit Service |
b98cfc |
free(new_out);
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_receive_patch_const(int data_conn, ld10k1_patch_t *new_patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
ld10k1_dsp_p_const_static_t *new_const = NULL;
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!new_patch->const_count)
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!(new_const = (ld10k1_dsp_p_const_static_t *)receive_msg_data_malloc(data_conn, sizeof(ld10k1_dsp_p_const_static_t) * new_patch->const_count)))
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PROTOCOL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* copy values */
|
|
Packit Service |
b98cfc |
for (i = 0; i < new_patch->const_count; i++)
|
|
Packit Service |
b98cfc |
new_patch->consts[i].const_val = new_const[i].const_val;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return send_response_ok(data_conn);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_receive_patch_sta(int data_conn, ld10k1_patch_t *new_patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
ld10k1_dsp_p_const_static_t *new_sta = NULL;
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!new_patch->sta_count)
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!(new_sta = (ld10k1_dsp_p_const_static_t *)receive_msg_data_malloc(data_conn, sizeof(ld10k1_dsp_p_const_static_t) * new_patch->sta_count)))
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PROTOCOL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* copy values */
|
|
Packit Service |
b98cfc |
for (i = 0; i < new_patch->sta_count; i++)
|
|
Packit Service |
b98cfc |
new_patch->stas[i].const_val = new_sta[i].const_val;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return send_response_ok(data_conn);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_receive_patch_hw(int data_conn, ld10k1_patch_t *new_patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
ld10k1_dsp_p_hw_t *new_hw = NULL;
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!new_patch->hw_count)
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!(new_hw = (ld10k1_dsp_p_hw_t *)receive_msg_data_malloc(data_conn, sizeof(ld10k1_dsp_p_hw_t) * new_patch->hw_count)))
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PROTOCOL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* copy values */
|
|
Packit Service |
b98cfc |
for (i = 0; i < new_patch->hw_count; i++)
|
|
Packit Service |
b98cfc |
new_patch->hws[i].reg_idx = new_hw[i].hw_val;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return send_response_ok(data_conn);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_receive_patch_tram_grp(int data_conn, ld10k1_patch_t *new_patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
ld10k1_dsp_tram_grp_t *new_tram_grp = NULL;
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!new_patch->tram_count)
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!(new_tram_grp = (ld10k1_dsp_tram_grp_t *)receive_msg_data_malloc(data_conn, sizeof(ld10k1_dsp_tram_grp_t) * new_patch->tram_count)))
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PROTOCOL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* copy values */
|
|
Packit Service |
b98cfc |
for (i = 0; i < new_patch->tram_count; i++) {
|
|
Packit Service |
b98cfc |
new_patch->tram_grp[i].grp_type = new_tram_grp[i].grp_type;
|
|
Packit Service |
b98cfc |
new_patch->tram_grp[i].grp_size = new_tram_grp[i].grp_size;
|
|
Packit Service |
b98cfc |
new_patch->tram_grp[i].grp_pos = new_tram_grp[i].grp_pos;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return send_response_ok(data_conn);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_receive_patch_tram_acc(int data_conn, ld10k1_patch_t *new_patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
ld10k1_dsp_tram_acc_t *new_tram_acc = NULL;
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!new_patch->tram_acc_count)
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!(new_tram_acc = (ld10k1_dsp_tram_acc_t *)receive_msg_data_malloc(data_conn, sizeof(ld10k1_dsp_tram_acc_t) * new_patch->tram_acc_count)))
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PROTOCOL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* copy values */
|
|
Packit Service |
b98cfc |
for (i = 0; i < new_patch->tram_acc_count; i++) {
|
|
Packit Service |
b98cfc |
new_patch->tram_acc[i].acc_type = new_tram_acc[i].acc_type;
|
|
Packit Service |
b98cfc |
new_patch->tram_acc[i].acc_offset = new_tram_acc[i].acc_offset;
|
|
Packit Service |
b98cfc |
new_patch->tram_acc[i].grp = new_tram_acc[i].grp;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return send_response_ok(data_conn);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_receive_patch_ctl(int data_conn, ld10k1_patch_t *new_patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
ld10k1_dsp_ctl_t *new_ctl = NULL;
|
|
Packit Service |
b98cfc |
int i, j;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!new_patch->ctl_count)
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!(new_ctl = (ld10k1_dsp_ctl_t *)receive_msg_data_malloc(data_conn, sizeof(ld10k1_dsp_ctl_t) * new_patch->ctl_count)))
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PROTOCOL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* copy values */
|
|
Packit Service |
b98cfc |
for (i = 0; i < new_patch->ctl_count; i++) {
|
|
Packit Service |
b98cfc |
strncpy(new_patch->ctl[i].name, new_ctl[i].name, 43);
|
|
Packit Service |
b98cfc |
new_patch->ctl[i].name[43] = '\0';
|
|
Packit Service |
b98cfc |
new_patch->ctl[i].index = -1;
|
|
Packit Service |
b98cfc |
new_patch->ctl[i].want_index = new_ctl[i].index;
|
|
Packit Service |
b98cfc |
new_patch->ctl[i].count = new_ctl[i].count;
|
|
Packit Service |
b98cfc |
new_patch->ctl[i].vcount = new_ctl[i].vcount;
|
|
Packit Service |
b98cfc |
new_patch->ctl[i].min = new_ctl[i].min;
|
|
Packit Service |
b98cfc |
new_patch->ctl[i].max = new_ctl[i].max;
|
|
Packit Service |
b98cfc |
new_patch->ctl[i].translation = new_ctl[i].translation;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
for (j = 0; j < new_patch->ctl[i].count; j++)
|
|
Packit Service |
b98cfc |
new_patch->ctl[i].value[j] = new_ctl[i].value[j];
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return send_response_ok(data_conn);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_receive_patch_instr(int data_conn, ld10k1_patch_t *new_patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
ld10k1_dsp_instr_t *new_instr = NULL;
|
|
Packit Service |
b98cfc |
int i, j;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!new_patch->instr_count)
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!(new_instr = (ld10k1_dsp_instr_t *)receive_msg_data_malloc(data_conn, sizeof(ld10k1_dsp_instr_t) * new_patch->instr_count)))
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PROTOCOL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* copy values */
|
|
Packit Service |
b98cfc |
for (i = 0; i < new_patch->instr_count; i++) {
|
|
Packit Service |
b98cfc |
new_patch->instr[i].op_code = new_instr[i].op_code;
|
|
Packit Service |
b98cfc |
for (j = 0; j < 4; j++)
|
|
Packit Service |
b98cfc |
new_patch->instr[i].arg[j] = new_instr[i].arg[j];
|
|
Packit Service |
b98cfc |
new_patch->instr[i].used = 1;
|
|
Packit Service |
b98cfc |
new_patch->instr[i].modified = 1;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return send_response_ok(data_conn);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_patch_add(int data_conn, int op, int size)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int err;
|
|
Packit Service |
b98cfc |
int loaded[2];
|
|
Packit Service |
b98cfc |
int where;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
ld10k1_dsp_patch_t new_patch_info;
|
|
Packit Service |
b98cfc |
/* allocate new patch */
|
|
Packit Service |
b98cfc |
ld10k1_patch_t *new_patch = NULL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_fnc_receive_patch_info(data_conn, &new_patch_info, &where)) < 0)
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!(new_patch = ld10k1_dsp_mgr_patch_new())) {
|
|
Packit Service |
b98cfc |
err = LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* name */
|
|
Packit Service |
b98cfc |
if (!ld10k1_dsp_mgr_name_new(&(new_patch->patch_name), new_patch_info.patch_name)) {
|
|
Packit Service |
b98cfc |
err = LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* set sizes */
|
|
Packit Service |
b98cfc |
if (new_patch_info.in_count)
|
|
Packit Service |
b98cfc |
if (!ld10k1_dsp_mgr_patch_in_new(new_patch, new_patch_info.in_count)) {
|
|
Packit Service |
b98cfc |
err = LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (new_patch_info.out_count)
|
|
Packit Service |
b98cfc |
if (!ld10k1_dsp_mgr_patch_out_new(new_patch, new_patch_info.out_count)) {
|
|
Packit Service |
b98cfc |
err = LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (new_patch_info.const_count)
|
|
Packit Service |
b98cfc |
if (!ld10k1_dsp_mgr_patch_const_new(new_patch, new_patch_info.const_count)) {
|
|
Packit Service |
b98cfc |
err = LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (new_patch_info.static_count)
|
|
Packit Service |
b98cfc |
if (!ld10k1_dsp_mgr_patch_sta_new(new_patch, new_patch_info.static_count)) {
|
|
Packit Service |
b98cfc |
err = LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (new_patch_info.dynamic_count)
|
|
Packit Service |
b98cfc |
if (!ld10k1_dsp_mgr_patch_dyn_new(new_patch, new_patch_info.dynamic_count)) {
|
|
Packit Service |
b98cfc |
err = LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (new_patch_info.hw_count)
|
|
Packit Service |
b98cfc |
if (!ld10k1_dsp_mgr_patch_hw_new(new_patch, new_patch_info.hw_count)) {
|
|
Packit Service |
b98cfc |
err = LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (new_patch_info.tram_count)
|
|
Packit Service |
b98cfc |
if (!ld10k1_dsp_mgr_patch_tram_new(new_patch, new_patch_info.tram_count)) {
|
|
Packit Service |
b98cfc |
err = LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (new_patch_info.tram_acc_count)
|
|
Packit Service |
b98cfc |
if (!ld10k1_dsp_mgr_patch_tram_acc_new(new_patch, new_patch_info.tram_acc_count)) {
|
|
Packit Service |
b98cfc |
err = LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (new_patch_info.ctl_count)
|
|
Packit Service |
b98cfc |
if (!ld10k1_dsp_mgr_patch_ctl_new(new_patch,new_patch_info.ctl_count)) {
|
|
Packit Service |
b98cfc |
err = LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!ld10k1_dsp_mgr_patch_instr_new(new_patch, new_patch_info.instr_count)) {
|
|
Packit Service |
b98cfc |
err = LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* receive next parts */
|
|
Packit Service |
b98cfc |
if (new_patch_info.in_count)
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_fnc_receive_patch_in(data_conn, new_patch)) < 0)
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (new_patch_info.out_count)
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_fnc_receive_patch_out(data_conn, new_patch)) < 0)
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (new_patch_info.const_count)
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_fnc_receive_patch_const(data_conn, new_patch)) < 0)
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (new_patch_info.static_count)
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_fnc_receive_patch_sta(data_conn, new_patch)) < 0)
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (new_patch_info.hw_count)
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_fnc_receive_patch_hw(data_conn, new_patch)) < 0)
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (new_patch_info.tram_count)
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_fnc_receive_patch_tram_grp(data_conn, new_patch)) < 0)
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (new_patch_info.tram_acc_count)
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_fnc_receive_patch_tram_acc(data_conn, new_patch)) < 0)
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (new_patch_info.ctl_count)
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_fnc_receive_patch_ctl(data_conn, new_patch)) < 0)
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_fnc_receive_patch_instr(data_conn, new_patch)) < 0)
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* check patch */
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_patch_fnc_check_patch(&dsp_mgr, new_patch)) < 0)
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* load patch */
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_dsp_mgr_patch_load(&dsp_mgr, new_patch, where, loaded)) < 0)
|
|
Packit Service |
b98cfc |
goto error;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = send_response_wd(data_conn, loaded, sizeof(loaded))) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
error:
|
|
Packit Service |
b98cfc |
if (new_patch)
|
|
Packit Service |
b98cfc |
ld10k1_dsp_mgr_patch_free(new_patch);
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_patch_del(int data_conn, int op, int size)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
ld10k1_fnc_patch_del_t patch_info;
|
|
Packit Service |
b98cfc |
int err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = receive_msg_data(data_conn, &patch_info, sizeof(ld10k1_fnc_patch_del_t))) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return ld10k1_patch_fnc_del(&dsp_mgr, &patch_info);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_patch_conn(int data_conn, int op, int size)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
ld10k1_fnc_connection_t connection_info;
|
|
Packit Service |
b98cfc |
int err;
|
|
Packit Service |
b98cfc |
int conn_id;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = receive_msg_data(data_conn, &connection_info, sizeof(ld10k1_fnc_connection_t))) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_connection_fnc(&dsp_mgr, &connection_info, &conn_id)) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return send_response_wd(data_conn, &conn_id, sizeof(conn_id));
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_name_find(int data_conn, int op, int size)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
ld10k1_fnc_name_t name_info;
|
|
Packit Service |
b98cfc |
int i;
|
|
Packit Service |
b98cfc |
static int ret;
|
|
Packit Service |
b98cfc |
int err;
|
|
Packit Service |
b98cfc |
ld10k1_patch_t *patch;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
ret = -1;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = receive_msg_data(data_conn, &name_info, sizeof(ld10k1_fnc_name_t))) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
name_info.name[MAX_NAME_LEN - 1] = '\0';
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
switch (op) {
|
|
Packit Service |
b98cfc |
case FNC_PATCH_FIND:
|
|
Packit Service |
b98cfc |
for (i = 0; i < EMU10K1_PATCH_MAX ; i++)
|
|
Packit Service |
b98cfc |
if (dsp_mgr.patch_ptr[i])
|
|
Packit Service |
b98cfc |
if (strcmp(dsp_mgr.patch_ptr[i]->patch_name, name_info.name) == 0) {
|
|
Packit Service |
b98cfc |
ret = i;
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case FNC_FX_FIND:
|
|
Packit Service |
b98cfc |
for (i = 0; i < dsp_mgr.fx_count ; i++)
|
|
Packit Service |
b98cfc |
if (dsp_mgr.fxs[i].name)
|
|
Packit Service |
b98cfc |
if (strcmp(dsp_mgr.fxs[i].name, name_info.name) == 0) {
|
|
Packit Service |
b98cfc |
ret = i;
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case FNC_IN_FIND:
|
|
Packit Service |
b98cfc |
for (i = 0; i < dsp_mgr.in_count ; i++)
|
|
Packit Service |
b98cfc |
if (dsp_mgr.ins[i].name)
|
|
Packit Service |
b98cfc |
if (strcmp(dsp_mgr.ins[i].name, name_info.name) == 0) {
|
|
Packit Service |
b98cfc |
ret = i;
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case FNC_OUT_FIND:
|
|
Packit Service |
b98cfc |
for (i = 0; i < dsp_mgr.out_count ; i++)
|
|
Packit Service |
b98cfc |
if (dsp_mgr.outs[i].name)
|
|
Packit Service |
b98cfc |
if (strcmp(dsp_mgr.outs[i].name, name_info.name) == 0) {
|
|
Packit Service |
b98cfc |
ret = i;
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case FNC_PATCH_IN_FIND :
|
|
Packit Service |
b98cfc |
if (name_info.patch_num >= 0 || name_info.patch_num < EMU10K1_PATCH_MAX) {
|
|
Packit Service |
b98cfc |
patch = dsp_mgr.patch_ptr[name_info.patch_num];
|
|
Packit Service |
b98cfc |
if (patch)
|
|
Packit Service |
b98cfc |
for (i = 0; i < patch->in_count ; i++)
|
|
Packit Service |
b98cfc |
if (patch->ins[i].name)
|
|
Packit Service |
b98cfc |
if (strcmp(patch->ins[i].name, name_info.name) == 0) {
|
|
Packit Service |
b98cfc |
ret = i;
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case FNC_PATCH_OUT_FIND :
|
|
Packit Service |
b98cfc |
if (name_info.patch_num >= 0 || name_info.patch_num < EMU10K1_PATCH_MAX) {
|
|
Packit Service |
b98cfc |
patch = dsp_mgr.patch_ptr[name_info.patch_num];
|
|
Packit Service |
b98cfc |
if (patch)
|
|
Packit Service |
b98cfc |
for (i = 0; i < patch->out_count ; i++)
|
|
Packit Service |
b98cfc |
if (patch->outs[i].name)
|
|
Packit Service |
b98cfc |
if (strcmp(patch->outs[i].name, name_info.name) == 0) {
|
|
Packit Service |
b98cfc |
ret = i;
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return send_response_wd(data_conn, &ret, sizeof(ret));
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_name_rename(int data_conn, int op, int size)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
ld10k1_fnc_name_t name_info;
|
|
Packit Service |
b98cfc |
int ret;
|
|
Packit Service |
b98cfc |
int err;
|
|
Packit Service |
b98cfc |
ld10k1_patch_t *patch;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
ret = -1;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = receive_msg_data(data_conn, &name_info, sizeof(ld10k1_fnc_name_t))) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
name_info.name[MAX_NAME_LEN - 1] = '\0';
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
switch (op) {
|
|
Packit Service |
b98cfc |
case FNC_PATCH_RENAME:
|
|
Packit Service |
b98cfc |
if (name_info.patch_num >= 0 || name_info.patch_num < EMU10K1_PATCH_MAX) {
|
|
Packit Service |
b98cfc |
patch = dsp_mgr.patch_ptr[name_info.patch_num];
|
|
Packit Service |
b98cfc |
if (patch) {
|
|
Packit Service |
b98cfc |
if (!ld10k1_dsp_mgr_name_new(&(patch->patch_name), name_info.name))
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PATCH_RENAME;
|
|
Packit Service |
b98cfc |
} else
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_UNKNOWN_PATCH_NUM;
|
|
Packit Service |
b98cfc |
} else
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_UNKNOWN_PATCH_NUM;
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case FNC_FX_RENAME:
|
|
Packit Service |
b98cfc |
if (name_info.gpr < 0 || name_info.gpr >= dsp_mgr.fx_count)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_UNKNOWN_REG_NUM;
|
|
Packit Service |
b98cfc |
if (!ld10k1_dsp_mgr_name_new(&(dsp_mgr.fxs[name_info.gpr].name), name_info.name))
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_REG_RENAME;
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case FNC_IN_RENAME:
|
|
Packit Service |
b98cfc |
if (name_info.gpr < 0 || name_info.gpr >= dsp_mgr.in_count)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_UNKNOWN_REG_NUM;
|
|
Packit Service |
b98cfc |
if (!ld10k1_dsp_mgr_name_new(&(dsp_mgr.ins[name_info.gpr].name), name_info.name))
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_REG_RENAME;
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case FNC_OUT_RENAME:
|
|
Packit Service |
b98cfc |
if (name_info.gpr < 0 || name_info.gpr >= dsp_mgr.out_count)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_UNKNOWN_REG_NUM;
|
|
Packit Service |
b98cfc |
if (!ld10k1_dsp_mgr_name_new(&(dsp_mgr.outs[name_info.gpr].name), name_info.name))
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_REG_RENAME;
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case FNC_PATCH_IN_RENAME:
|
|
Packit Service |
b98cfc |
if (name_info.patch_num >= 0 || name_info.patch_num < EMU10K1_PATCH_MAX) {
|
|
Packit Service |
b98cfc |
patch = dsp_mgr.patch_ptr[name_info.patch_num];
|
|
Packit Service |
b98cfc |
if (patch) {
|
|
Packit Service |
b98cfc |
if (name_info.gpr < 0 || name_info.gpr >= patch->in_count)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_UNKNOWN_PATCH_REG_NUM;
|
|
Packit Service |
b98cfc |
if (!ld10k1_dsp_mgr_name_new(&(patch->ins[name_info.gpr].name), name_info.name))
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PATCH_REG_RENAME;
|
|
Packit Service |
b98cfc |
} else
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_UNKNOWN_PATCH_NUM;
|
|
Packit Service |
b98cfc |
} else
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_UNKNOWN_PATCH_NUM;
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
case FNC_PATCH_OUT_RENAME:
|
|
Packit Service |
b98cfc |
if (name_info.patch_num >= 0 || name_info.patch_num < EMU10K1_PATCH_MAX) {
|
|
Packit Service |
b98cfc |
patch = dsp_mgr.patch_ptr[name_info.patch_num];
|
|
Packit Service |
b98cfc |
if (patch) {
|
|
Packit Service |
b98cfc |
if (name_info.gpr < 0 || name_info.gpr >= patch->out_count)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_UNKNOWN_PATCH_REG_NUM;
|
|
Packit Service |
b98cfc |
if (!ld10k1_dsp_mgr_name_new(&(patch->outs[name_info.gpr].name), name_info.name))
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_PATCH_REG_RENAME;
|
|
Packit Service |
b98cfc |
} else
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_UNKNOWN_PATCH_NUM;
|
|
Packit Service |
b98cfc |
} else
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_UNKNOWN_PATCH_NUM;
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_dsp_init(int data_conn, int op, int size)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int audigy;
|
|
Packit Service |
b98cfc |
int err, i;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
ld10k1_reserved_ctl_list_item_t *rlist;
|
|
Packit Service |
b98cfc |
int save_ids[EMU10K1_PATCH_MAX];
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
audigy = dsp_mgr.audigy;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
rlist = dsp_mgr.reserved_ctl_list; /* FIXME - hack to save reserved ctls and ids */
|
|
Packit Service |
b98cfc |
for (i = 0; i < EMU10K1_PATCH_MAX; i++)
|
|
Packit Service |
b98cfc |
save_ids[i] = dsp_mgr.patch_id_gens[i];
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
ld10k1_dsp_mgr_free(&dsp_mgr);
|
|
Packit Service |
b98cfc |
memset(&dsp_mgr, 0, sizeof(dsp_mgr));
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
dsp_mgr.audigy = audigy;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_dsp_mgr_init(&dsp_mgr)) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
dsp_mgr.reserved_ctl_list = rlist; /* hack to seve reserved ctls */
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
for (i = 0; i < EMU10K1_PATCH_MAX; i++)
|
|
Packit Service |
b98cfc |
dsp_mgr.patch_id_gens[i] = save_ids[i];
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return ld10k1_init_driver(&dsp_mgr, -1);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_get_io_count(int data_conn, int op, int size)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int reg_count;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
reg_count = 0;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (op == FNC_GET_FX_COUNT)
|
|
Packit Service |
b98cfc |
/* fxs */
|
|
Packit Service |
b98cfc |
reg_count = dsp_mgr.fx_count;
|
|
Packit Service |
b98cfc |
else if (op == FNC_GET_IN_COUNT)
|
|
Packit Service |
b98cfc |
/* ins */
|
|
Packit Service |
b98cfc |
reg_count = dsp_mgr.in_count;
|
|
Packit Service |
b98cfc |
else
|
|
Packit Service |
b98cfc |
/* outs */
|
|
Packit Service |
b98cfc |
reg_count = dsp_mgr.out_count;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return send_response_wd(data_conn, ®_count, sizeof(int));
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_get_io(int data_conn, int op, int size)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int reg_count;
|
|
Packit Service |
b98cfc |
int reg_num;
|
|
Packit Service |
b98cfc |
ld10k1_fnc_get_io_t io;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = receive_msg_data(data_conn, ®_num, sizeof(int))) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (op == FNC_GET_FX)
|
|
Packit Service |
b98cfc |
/* fx */
|
|
Packit Service |
b98cfc |
reg_count = dsp_mgr.fx_count;
|
|
Packit Service |
b98cfc |
else if (op == FNC_GET_IN)
|
|
Packit Service |
b98cfc |
/* in */
|
|
Packit Service |
b98cfc |
reg_count = dsp_mgr.in_count;
|
|
Packit Service |
b98cfc |
else
|
|
Packit Service |
b98cfc |
/* out */
|
|
Packit Service |
b98cfc |
reg_count = dsp_mgr.out_count;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (reg_num < 0 || reg_num >= reg_count)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_UNKNOWN_REG_NUM;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (op == FNC_GET_FX) {
|
|
Packit Service |
b98cfc |
/* fx */
|
|
Packit Service |
b98cfc |
memset(io.name, 0, sizeof(io.name));
|
|
Packit Service |
b98cfc |
if (dsp_mgr.fxs[reg_num].name)
|
|
Packit Service |
b98cfc |
strcpy(io.name, dsp_mgr.fxs[reg_num].name);
|
|
Packit Service |
b98cfc |
} else if (op == FNC_GET_IN) {
|
|
Packit Service |
b98cfc |
/* in */
|
|
Packit Service |
b98cfc |
memset(io.name, 0, sizeof(io.name));
|
|
Packit Service |
b98cfc |
if (dsp_mgr.ins[reg_num].name)
|
|
Packit Service |
b98cfc |
strcpy(io.name, dsp_mgr.ins[reg_num].name);
|
|
Packit Service |
b98cfc |
} else {
|
|
Packit Service |
b98cfc |
/* out */
|
|
Packit Service |
b98cfc |
memset(io.name, 0, sizeof(io.name));
|
|
Packit Service |
b98cfc |
if (dsp_mgr.outs[reg_num].name)
|
|
Packit Service |
b98cfc |
strcpy(io.name, dsp_mgr.outs[reg_num].name);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return send_response_wd(data_conn, &io, sizeof(ld10k1_fnc_get_io_t));
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_get_pio_count(int data_conn, int op, int size)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int patch_num;
|
|
Packit Service |
b98cfc |
int err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int reg_count;
|
|
Packit Service |
b98cfc |
ld10k1_patch_t *patch;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = receive_msg_data(data_conn, &patch_num, sizeof(int))) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
reg_count = 0;
|
|
Packit Service |
b98cfc |
/* patch */
|
|
Packit Service |
b98cfc |
if (patch_num >= 0 && patch_num < EMU10K1_PATCH_MAX) {
|
|
Packit Service |
b98cfc |
/* patch register */
|
|
Packit Service |
b98cfc |
patch = dsp_mgr.patch_ptr[patch_num];
|
|
Packit Service |
b98cfc |
if (!patch)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_UNKNOWN_PATCH_NUM;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (op == FNC_GET_PIN_COUNT)
|
|
Packit Service |
b98cfc |
/* pin */
|
|
Packit Service |
b98cfc |
reg_count = patch->in_count;
|
|
Packit Service |
b98cfc |
else
|
|
Packit Service |
b98cfc |
/* pout */
|
|
Packit Service |
b98cfc |
reg_count = patch->out_count;
|
|
Packit Service |
b98cfc |
} else
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_UNKNOWN_PATCH_NUM;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return send_response_wd(data_conn, ®_count, sizeof(int));
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_get_pio(int data_conn, int op, int size)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int patch_num;
|
|
Packit Service |
b98cfc |
int reg_num;
|
|
Packit Service |
b98cfc |
int err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int tmp_num[2];
|
|
Packit Service |
b98cfc |
int reg_count;
|
|
Packit Service |
b98cfc |
ld10k1_fnc_get_io_t io;
|
|
Packit Service |
b98cfc |
ld10k1_patch_t *patch;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = receive_msg_data(data_conn, tmp_num, sizeof(int) * 2)) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
patch_num = tmp_num[0];
|
|
Packit Service |
b98cfc |
reg_num = tmp_num[1];
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
reg_count = 0;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* patch */
|
|
Packit Service |
b98cfc |
if (patch_num >= 0 && patch_num < EMU10K1_PATCH_MAX) {
|
|
Packit Service |
b98cfc |
/* patch register */
|
|
Packit Service |
b98cfc |
patch = dsp_mgr.patch_ptr[patch_num];
|
|
Packit Service |
b98cfc |
if (!patch)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_UNKNOWN_PATCH_NUM;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (op == FNC_GET_PIN)
|
|
Packit Service |
b98cfc |
/* pin */
|
|
Packit Service |
b98cfc |
reg_count = patch->in_count;
|
|
Packit Service |
b98cfc |
else
|
|
Packit Service |
b98cfc |
/* pout */
|
|
Packit Service |
b98cfc |
reg_count = patch->out_count;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (reg_num < 0 || reg_num >= reg_count)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_UNKNOWN_PATCH_REG_NUM;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (op == FNC_GET_PIN) {
|
|
Packit Service |
b98cfc |
/* pin */
|
|
Packit Service |
b98cfc |
memset(io.name, 0, sizeof(io.name));
|
|
Packit Service |
b98cfc |
if (patch->ins[reg_num].name)
|
|
Packit Service |
b98cfc |
strcpy(io.name, patch->ins[reg_num].name);
|
|
Packit Service |
b98cfc |
} else {
|
|
Packit Service |
b98cfc |
/* pout */
|
|
Packit Service |
b98cfc |
memset(io.name, 0, sizeof(io.name));
|
|
Packit Service |
b98cfc |
if (patch->outs[reg_num].name)
|
|
Packit Service |
b98cfc |
strcpy(io.name, patch->outs[reg_num].name);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
} else
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_UNKNOWN_PATCH_NUM;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return send_response_wd(data_conn, &io, sizeof(ld10k1_fnc_get_io_t));
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_get_patches_info(int data_conn, int op, int size)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i, idx, j;
|
|
Packit Service |
b98cfc |
ld10k1_fnc_patches_info_t *info;
|
|
Packit Service |
b98cfc |
ld10k1_patch_t *patch;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
info = NULL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (dsp_mgr.patch_count >= 0) {
|
|
Packit Service |
b98cfc |
/* alloc space */
|
|
Packit Service |
b98cfc |
info = (ld10k1_fnc_patches_info_t *)malloc(sizeof(ld10k1_fnc_patches_info_t) * dsp_mgr.patch_count);
|
|
Packit Service |
b98cfc |
if (!info)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
memset(info, 0, sizeof(ld10k1_fnc_patches_info_t) * dsp_mgr.patch_count);
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* copy values */
|
|
Packit Service |
b98cfc |
for (i = 0, j = 0; i < dsp_mgr.patch_count; i++) {
|
|
Packit Service |
b98cfc |
idx = dsp_mgr.patch_order[i];
|
|
Packit Service |
b98cfc |
patch = dsp_mgr.patch_ptr[idx];
|
|
Packit Service |
b98cfc |
if (patch) {
|
|
Packit Service |
b98cfc |
info[j].patch_num = idx;
|
|
Packit Service |
b98cfc |
info[j].id = patch->id;
|
|
Packit Service |
b98cfc |
strcpy(info[j].patch_name, patch->patch_name);
|
|
Packit Service |
b98cfc |
j++;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return send_response_wd(data_conn, info, sizeof(ld10k1_fnc_patches_info_t) * dsp_mgr.patch_count);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_version(int data_conn, int op, int size)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
ld10k1_fnc_version_t version;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
strcpy(version.ld10k1_version, VERSION);
|
|
Packit Service |
b98cfc |
return send_response_wd(data_conn, &version, sizeof(ld10k1_fnc_version_t));
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_send_patch_in(int data_conn, ld10k1_patch_t *patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i, err;
|
|
Packit Service |
b98cfc |
ld10k1_dsp_p_in_out_t *ins = NULL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (patch->in_count) {
|
|
Packit Service |
b98cfc |
ins = (ld10k1_dsp_p_in_out_t *)malloc(sizeof(ld10k1_dsp_p_in_out_t) * patch->in_count);
|
|
Packit Service |
b98cfc |
if (!ins)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
memset(ins, 0, sizeof(ld10k1_dsp_p_in_out_t) * patch->in_count);
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
for (i = 0; i < patch->in_count; i++) {
|
|
Packit Service |
b98cfc |
if (patch->ins[i].name)
|
|
Packit Service |
b98cfc |
strcpy(ins[i].name, patch->ins[i].name);
|
|
Packit Service |
b98cfc |
else
|
|
Packit Service |
b98cfc |
ins[i].name[0] = '\0';
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = send_response(data_conn, FNC_CONTINUE, 0, ins, sizeof(ld10k1_dsp_p_in_out_t) * patch->in_count)) < 0) {
|
|
Packit Service |
b98cfc |
free(ins);
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
free(ins);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_send_patch_out(int data_conn, ld10k1_patch_t *patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i, err;
|
|
Packit Service |
b98cfc |
ld10k1_dsp_p_in_out_t *outs = NULL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (patch->out_count) {
|
|
Packit Service |
b98cfc |
outs = (ld10k1_dsp_p_in_out_t *)malloc(sizeof(ld10k1_dsp_p_in_out_t) * patch->out_count);
|
|
Packit Service |
b98cfc |
if (!outs)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
memset(outs, 0, sizeof(ld10k1_dsp_p_in_out_t) * patch->out_count);
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
for (i = 0; i < patch->out_count; i++) {
|
|
Packit Service |
b98cfc |
if (patch->outs[i].name)
|
|
Packit Service |
b98cfc |
strcpy(outs[i].name, patch->outs[i].name);
|
|
Packit Service |
b98cfc |
else
|
|
Packit Service |
b98cfc |
outs[i].name[0] = '\0';
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = send_response(data_conn, FNC_CONTINUE, 0, outs, sizeof(ld10k1_dsp_p_in_out_t) * patch->out_count)) < 0) {
|
|
Packit Service |
b98cfc |
free(outs);
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
free(outs);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_send_patch_const(int data_conn, ld10k1_patch_t *patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i, err;
|
|
Packit Service |
b98cfc |
ld10k1_dsp_p_const_static_t *consts = NULL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (patch->const_count) {
|
|
Packit Service |
b98cfc |
consts = (ld10k1_dsp_p_const_static_t *)malloc(sizeof(ld10k1_dsp_p_const_static_t) * patch->const_count);
|
|
Packit Service |
b98cfc |
if (!consts)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
for (i = 0; i < patch->const_count; i++)
|
|
Packit Service |
b98cfc |
consts[i].const_val = patch->consts[i].const_val;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = send_response(data_conn, FNC_CONTINUE, 0, consts, sizeof(ld10k1_dsp_p_const_static_t) * patch->const_count)) < 0) {
|
|
Packit Service |
b98cfc |
free(consts);
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
free(consts);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_send_patch_sta(int data_conn, ld10k1_patch_t *patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i, err;
|
|
Packit Service |
b98cfc |
ld10k1_dsp_p_const_static_t *stas = NULL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (patch->sta_count) {
|
|
Packit Service |
b98cfc |
stas = (ld10k1_dsp_p_const_static_t *)malloc(sizeof(ld10k1_dsp_p_const_static_t) * patch->sta_count);
|
|
Packit Service |
b98cfc |
if (!stas)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
for (i = 0; i < patch->sta_count; i++)
|
|
Packit Service |
b98cfc |
stas[i].const_val = patch->stas[i].const_val;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = send_response(data_conn, FNC_CONTINUE, 0, stas, sizeof(ld10k1_dsp_p_const_static_t) * patch->sta_count)) < 0) {
|
|
Packit Service |
b98cfc |
free(stas);
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
free(stas);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_send_patch_hw(int data_conn, ld10k1_patch_t *patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i, err;
|
|
Packit Service |
b98cfc |
ld10k1_dsp_p_hw_t *hws = NULL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (patch->hw_count) {
|
|
Packit Service |
b98cfc |
hws = (ld10k1_dsp_p_hw_t *)malloc(sizeof(ld10k1_dsp_p_hw_t) * patch->hw_count);
|
|
Packit Service |
b98cfc |
if (!hws)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
for (i = 0; i < patch->hw_count; i++)
|
|
Packit Service |
b98cfc |
hws[i].hw_val = patch->hws[i].reg_idx;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = send_response(data_conn, FNC_CONTINUE, 0, hws, sizeof(ld10k1_dsp_p_hw_t) * patch->hw_count)) < 0) {
|
|
Packit Service |
b98cfc |
free(hws);
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
free(hws);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_send_patch_tram_grp(int data_conn, ld10k1_patch_t *patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i, err;
|
|
Packit Service |
b98cfc |
ld10k1_dsp_tram_grp_t *grps = NULL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (patch->tram_count) {
|
|
Packit Service |
b98cfc |
grps = (ld10k1_dsp_tram_grp_t *)malloc(sizeof(ld10k1_dsp_tram_grp_t) * patch->tram_count);
|
|
Packit Service |
b98cfc |
if (!grps)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
for (i = 0; i < patch->tram_count; i++) {
|
|
Packit Service |
b98cfc |
grps[i].grp_type = patch->tram_grp[i].grp_type;
|
|
Packit Service |
b98cfc |
grps[i].grp_size = patch->tram_grp[i].grp_size;
|
|
Packit Service |
b98cfc |
grps[i].grp_pos = patch->tram_grp[i].grp_pos;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = send_response(data_conn, FNC_CONTINUE, 0, grps, sizeof(ld10k1_dsp_tram_grp_t) * patch->tram_count)) < 0) {
|
|
Packit Service |
b98cfc |
free(grps);
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
free(grps);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_send_patch_tram_acc(int data_conn, ld10k1_patch_t *patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i, err;
|
|
Packit Service |
b98cfc |
ld10k1_dsp_tram_acc_t *accs = NULL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (patch->tram_acc_count) {
|
|
Packit Service |
b98cfc |
accs = (ld10k1_dsp_tram_acc_t *)malloc(sizeof(ld10k1_dsp_tram_acc_t) * patch->tram_acc_count);
|
|
Packit Service |
b98cfc |
if (!accs)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
for (i = 0; i < patch->tram_acc_count; i++) {
|
|
Packit Service |
b98cfc |
accs[i].acc_type = patch->tram_acc[i].acc_type;
|
|
Packit Service |
b98cfc |
accs[i].acc_offset = patch->tram_acc[i].acc_offset;
|
|
Packit Service |
b98cfc |
accs[i].grp = patch->tram_acc[i].grp;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = send_response(data_conn, FNC_CONTINUE, 0, accs, sizeof(ld10k1_dsp_tram_acc_t) * patch->tram_acc_count)) < 0) {
|
|
Packit Service |
b98cfc |
free(accs);
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
free(accs);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_send_patch_ctl(int data_conn, ld10k1_patch_t *patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i, j, err;
|
|
Packit Service |
b98cfc |
ld10k1_dsp_ctl_t *ctls = NULL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (patch->ctl_count) {
|
|
Packit Service |
b98cfc |
ctls = (ld10k1_dsp_ctl_t *)malloc(sizeof(ld10k1_dsp_ctl_t) * patch->ctl_count);
|
|
Packit Service |
b98cfc |
if (!ctls)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
memset(ctls, 0, sizeof(ld10k1_dsp_ctl_t) * patch->ctl_count);
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
for (i = 0; i < patch->ctl_count; i++) {
|
|
Packit Service |
b98cfc |
strncpy(ctls[i].name, patch->ctl[i].name, 43);
|
|
Packit Service |
b98cfc |
ctls[i].name[43] = '\0';
|
|
Packit Service |
b98cfc |
ctls[i].index = patch->ctl[i].want_index;
|
|
Packit Service |
b98cfc |
ctls[i].count = patch->ctl[i].count;
|
|
Packit Service |
b98cfc |
ctls[i].vcount = patch->ctl[i].vcount;
|
|
Packit Service |
b98cfc |
ctls[i].min = patch->ctl[i].min;
|
|
Packit Service |
b98cfc |
ctls[i].max = patch->ctl[i].max;
|
|
Packit Service |
b98cfc |
ctls[i].translation = patch->ctl[i].translation;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
for (j = 0; j < ctls[i].count; j++)
|
|
Packit Service |
b98cfc |
ctls[i].value[j] = patch->ctl[i].value[j];
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = send_response(data_conn, FNC_CONTINUE, 0, ctls, sizeof(ld10k1_dsp_ctl_t) * patch->ctl_count)) < 0) {
|
|
Packit Service |
b98cfc |
free(ctls);
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
free(ctls);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_send_patch_instr(int data_conn, ld10k1_patch_t *patch)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int i, j, err;
|
|
Packit Service |
b98cfc |
ld10k1_dsp_instr_t *instrs = NULL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (patch->instr_count) {
|
|
Packit Service |
b98cfc |
instrs = (ld10k1_dsp_instr_t *)malloc(sizeof(ld10k1_dsp_instr_t) * patch->instr_count);
|
|
Packit Service |
b98cfc |
if (!instrs)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
for (i = 0; i < patch->instr_count; i++) {
|
|
Packit Service |
b98cfc |
instrs[i].op_code = patch->instr[i].op_code;
|
|
Packit Service |
b98cfc |
for (j = 0; j < 4; j++)
|
|
Packit Service |
b98cfc |
instrs[i].arg[j] = patch->instr[i].arg[j];
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = send_response(data_conn, FNC_CONTINUE, 0, instrs, sizeof(ld10k1_dsp_instr_t) * patch->instr_count)) < 0) {
|
|
Packit Service |
b98cfc |
free(instrs);
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
free(instrs);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_get_patch(int data_conn, int op, int size)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
ld10k1_dsp_patch_t patch_info;
|
|
Packit Service |
b98cfc |
int patch_num = -1;
|
|
Packit Service |
b98cfc |
ld10k1_patch_t *patch;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = receive_msg_data(data_conn, &patch_num, sizeof(patch_num))) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (dsp_mgr.patch_count >= 0) {
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (patch_num > EMU10K1_PATCH_MAX)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_UNKNOWN_PATCH_NUM;
|
|
Packit Service |
b98cfc |
patch = dsp_mgr.patch_ptr[patch_num];
|
|
Packit Service |
b98cfc |
if (!patch)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_UNKNOWN_PATCH_NUM;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
strcpy(patch_info.patch_name, patch->patch_name);
|
|
Packit Service |
b98cfc |
patch_info.id = patch->id;
|
|
Packit Service |
b98cfc |
patch_info.in_count = patch->in_count;
|
|
Packit Service |
b98cfc |
patch_info.out_count = patch->out_count;
|
|
Packit Service |
b98cfc |
patch_info.const_count = patch->const_count;
|
|
Packit Service |
b98cfc |
patch_info.static_count = patch->sta_count;
|
|
Packit Service |
b98cfc |
patch_info.dynamic_count = patch->dyn_count;
|
|
Packit Service |
b98cfc |
patch_info.hw_count = patch->hw_count;
|
|
Packit Service |
b98cfc |
patch_info.tram_count = patch->tram_count;
|
|
Packit Service |
b98cfc |
patch_info.tram_acc_count = patch->tram_acc_count;
|
|
Packit Service |
b98cfc |
patch_info.ctl_count = patch->ctl_count;
|
|
Packit Service |
b98cfc |
patch_info.instr_count = patch->instr_count;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = send_response(data_conn, FNC_CONTINUE, 0, &patch_info, sizeof(ld10k1_dsp_patch_t))) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/* send next parts */
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_fnc_send_patch_in(data_conn, patch)) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_fnc_send_patch_out(data_conn, patch)) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_fnc_send_patch_const(data_conn, patch)) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_fnc_send_patch_sta(data_conn, patch)) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_fnc_send_patch_hw(data_conn, patch)) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_fnc_send_patch_tram_grp(data_conn, patch)) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_fnc_send_patch_tram_acc(data_conn, patch)) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_fnc_send_patch_ctl(data_conn, patch)) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_fnc_send_patch_instr(data_conn, patch)) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_dump(int data_conn, int op, int size)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int err;
|
|
Packit Service |
b98cfc |
void *dump = NULL;
|
|
Packit Service |
b98cfc |
int dump_size = 0;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = ld10k1_make_dump(&dsp_mgr, &dump, &dump_size)) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = send_response(data_conn, FNC_CONTINUE, 0, dump, dump_size)) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
free(dump);
|
|
Packit Service |
b98cfc |
return 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_get_points_info(int data_conn, int op, int size)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int point_count;
|
|
Packit Service |
b98cfc |
int i, j = 0;
|
|
Packit Service |
b98cfc |
int *info = NULL;
|
|
Packit Service |
b98cfc |
ld10k1_conn_point_t *point;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
point_count = 0;
|
|
Packit Service |
b98cfc |
for (i = 0; i < 2; i++) {
|
|
Packit Service |
b98cfc |
if (i) {
|
|
Packit Service |
b98cfc |
if (!point_count)
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
info = (int *)malloc(sizeof(int) * point_count);
|
|
Packit Service |
b98cfc |
if (!info)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_NO_MEM;
|
|
Packit Service |
b98cfc |
j = 0;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
point = dsp_mgr.point_list;
|
|
Packit Service |
b98cfc |
while (point) {
|
|
Packit Service |
b98cfc |
if (!i)
|
|
Packit Service |
b98cfc |
point_count++;
|
|
Packit Service |
b98cfc |
else
|
|
Packit Service |
b98cfc |
info[j++] = point->id;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
point = point->next;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return send_response_wd(data_conn, info, sizeof(int) * point_count);
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_get_point_info(int data_conn, int op, int size)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
int err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int k, l;
|
|
Packit Service |
b98cfc |
ld10k1_dsp_point_t info;
|
|
Packit Service |
b98cfc |
ld10k1_conn_point_t *point;
|
|
Packit Service |
b98cfc |
ld10k1_conn_point_t *found_point;
|
|
Packit Service |
b98cfc |
int what_point_id;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
/*info = NULL;*/
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if ((err = receive_msg_data(data_conn, &what_point_id, sizeof(int))) < 0)
|
|
Packit Service |
b98cfc |
return err;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
found_point = NULL;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
point = dsp_mgr.point_list;
|
|
Packit Service |
b98cfc |
while (point) {
|
|
Packit Service |
b98cfc |
if (point->id == what_point_id) {
|
|
Packit Service |
b98cfc |
found_point = point;
|
|
Packit Service |
b98cfc |
break;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
point = point->next;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (!found_point)
|
|
Packit Service |
b98cfc |
return LD10K1_ERR_UNKNOWN_POINT;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
info.id = point->id;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
if (EMU10K1_REG_TYPE_B(point->con_gpr_idx) == EMU10K1_REG_TYPE_NORMAL)
|
|
Packit Service |
b98cfc |
info.type = CON_IO_NORMAL;
|
|
Packit Service |
b98cfc |
else if (EMU10K1_REG_TYPE_B(point->con_gpr_idx) == EMU10K1_REG_TYPE_INPUT)
|
|
Packit Service |
b98cfc |
info.type = CON_IO_IN;
|
|
Packit Service |
b98cfc |
else if (EMU10K1_REG_TYPE_B(point->con_gpr_idx) == EMU10K1_REG_TYPE_OUTPUT)
|
|
Packit Service |
b98cfc |
info.type = CON_IO_OUT;
|
|
Packit Service |
b98cfc |
else if (EMU10K1_REG_TYPE_B(point->con_gpr_idx) == EMU10K1_REG_TYPE_FX)
|
|
Packit Service |
b98cfc |
info.type = CON_IO_FX;
|
|
Packit Service |
b98cfc |
info.io_idx = point->con_gpr_idx & ~EMU10K1_REG_TYPE_MASK;
|
|
Packit Service |
b98cfc |
info.simple = point->simple;
|
|
Packit Service |
b98cfc |
info.conn_count = point->con_count;
|
|
Packit Service |
b98cfc |
if (info.conn_count > 2 && info.type == CON_IO_NORMAL)
|
|
Packit Service |
b98cfc |
info.multi = 1;
|
|
Packit Service |
b98cfc |
else if (info.conn_count > 1 && info.type != CON_IO_NORMAL)
|
|
Packit Service |
b98cfc |
info.multi = 1;
|
|
Packit Service |
b98cfc |
else
|
|
Packit Service |
b98cfc |
info.multi = 0;
|
|
Packit Service |
b98cfc |
for (k = 0, l = 0; k < POINT_MAX_CONN_PER_POINT; k++) {
|
|
Packit Service |
b98cfc |
if (point->type[k]) {
|
|
Packit Service |
b98cfc |
info.io_type[l] = point->type[k] == CON_IO_PIN ? 0 : 1;
|
|
Packit Service |
b98cfc |
info.patch[l] = point->patch[k] ? point->patch[k]->id : -1;
|
|
Packit Service |
b98cfc |
info.io[l] = point->io[k];
|
|
Packit Service |
b98cfc |
l++;
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return send_response_wd(data_conn, &info, sizeof(ld10k1_dsp_point_t));
|
|
Packit Service |
b98cfc |
}
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
int ld10k1_fnc_get_dsp_info(int data_conn, int op, int size)
|
|
Packit Service |
b98cfc |
{
|
|
Packit Service |
b98cfc |
ld10k1_fnc_dsp_info_t info;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
info.chip_type = dsp_mgr.audigy;
|
|
Packit Service |
b98cfc |
|
|
Packit Service |
b98cfc |
return send_response_wd(data_conn, &info, sizeof(ld10k1_fnc_dsp_info_t));
|
|
Packit Service |
b98cfc |
}
|