Blame ld10k1/src/ld10k1_fnc1.c

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, &reg_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, &reg_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, &reg_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
}