aboutsummaryrefslogtreecommitdiff
path: root/dssi/src/dssi~.h
blob: 6aadb8585219acbda1692bd170f234d9a5345b8b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
/* dssi~ - A DSSI host for PD 
 * 
 * Copyright 2006 Jamie Bullock and others 
 *
 * This file incorporates code from the following sources:
 * 
 * jack-dssi-host (BSD-style license): Copyright 2004 Chris Cannam, Steve Harris and Sean Bolton.
 *		   
 * Hexter (GPL license): Copyright (C) 2004 Sean Bolton and others.
 * 
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

#include "m_pd.h"
#include "dssi.h"
#include <dlfcn.h>
#include <lo/lo.h> 
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h> /*for exit()*/
#include <sys/types.h> /* for fork() */
#include <signal.h> /* for kill() */
#include <sys/wait.h> /* for wait() */
#include <dirent.h> /* for readdir() */

#define DX7_VOICE_SIZE_PACKED 	128 /*From hexter_types.h by Sean Bolton */
#define DX7_DUMP_SIZE_BULK 	4096+8


#define VERSION 0.99
#define EVENT_BUFSIZE 1024
#define OSC_BASE_MAX 1024
#define TYPE_STRING_SIZE 20 /* Max size of event type string (must be two more bytes than needed) */
#define DIR_STRING_SIZE 1024 /* Max size of directory string */
#define ASCII_n 110
#define ASCII_p 112
#define ASCII_c 99
#define ASCII_b 98
#define ASCII_t 116
#define ASCII_a 97

#define LOADGUI 0 /* FIX: depracate this */
#ifdef DEBUG
#define CHECKSUM_PATCH_FILES_ON_LOAD 1
#endif

#ifndef MIN
#define MIN(a,b) ((a)<(b)?(a):(b))
#endif


/*From dx7_voice.h by Sean Bolton */

typedef struct _dx7_patch_t {
    uint8_t data[128];
} dx7_patch_t;

typedef struct _dssi_instance {

    long             currentBank;
    long             currentProgram;
    int              pendingBankLSB;
    int              pendingBankMSB;
    int              pendingProgramChange;

    int plugin_ProgramCount;
    DSSI_Program_Descriptor *pluginPrograms;

    lo_address       uiTarget; /*osc stuff */
    int              ui_hidden;
    int              ui_show;
    int              uiNeedsProgramUpdate;
    char            *ui_osc_control_path;
    char            *ui_osc_configure_path;
    char            *ui_osc_program_path;
    char            *ui_osc_show_path;
    char            *ui_osc_hide_path;
    char            *ui_osc_quit_path;

    int *plugin_PortControlInNumbers; /*not sure if this should go here?*/

    char *osc_url_path;
    pid_t	gui_pid;

} t_dssi_instance;

struct dssi_configure_pair {
    t_int instance;
    char *key,
         *value;
    struct dssi_configure_pair *next;
}; 

typedef struct dssi_configure_pair t_dssi_configure_pair;

typedef struct _port_info {
    t_atom type,
           data_type,
           name,
           lower_bound,
           upper_bound,
           p_default;
} t_port_info;

typedef struct _dssi_tilde {
    t_object  x_obj;
    t_int is_DSSI;
    char *plugin_label;
    char	     *plugin_full_path; /*absolute path to plugin */
    t_canvas *x_canvas; /* pointer to the canvas the object is instantiated on */
    void *plugin_handle;
    char *project_dir; /* project dircetory */
    LADSPA_Handle *instanceHandles; /*was handle*/
    t_dssi_instance *instances; 
    int n_instances;
    unsigned long *instanceEventCounts;
    unsigned char channelMap[128];
    snd_seq_event_t **instanceEventBuffers;

    snd_seq_event_t midiEventBuf[EVENT_BUFSIZE];
    /*static snd_seq_event_t **instanceEventBuffers;*/
    int bufWriteIndex, bufReadIndex;
    pthread_mutex_t midiEventBufferMutex;
    /*static pthread_mutex_t listHandlerMutex = PTHREAD_MUTEX_INITIALIZER;*/

    DSSI_Descriptor_Function desc_func;
    DSSI_Descriptor *descriptor;

    t_port_info *port_info;

    t_int	ports_in, ports_out, ports_controlIn, ports_controlOut;
    t_int plugin_ins;/* total audio input ports for plugin*/
    t_int plugin_outs;/* total audio output ports plugin*/
    t_int plugin_controlIns;/* total control input ports*/
    t_int plugin_controlOuts;/* total control output ports */

    unsigned long *plugin_ControlInPortNumbers; /*Array of input port numbers for the plugin */

    t_float **plugin_InputBuffers, **plugin_OutputBuffers; /* arrays of arrays for buffering audio for each audio port */
    t_float *plugin_ControlDataInput, *plugin_ControlDataOutput; /*arrays for control data for each port (1 item per 'run')*/
    lo_server_thread osc_thread;
    char *osc_url_base;
    char *plugin_basename;

    t_int time_ref; /*logical time reference */
    t_int sr;
    t_float sr_inv;
    t_int blksize;
    t_float f;

    t_outlet **outlets; 
    t_inlet **inlets;
    t_outlet *control_outlet;

    t_dssi_configure_pair *configure_buffer_head;

    t_int dsp; /* boolean dsp setting */
    t_int dsp_loop;

} t_dssi_tilde;

static char *dssi_tilde_send_configure(t_dssi_tilde *x, char *key, 
        char *value, t_int instance);
static int osc_message_handler(const char *path, const char *types, 
        lo_arg **argv, int argc, void *data, void *user_data);
static LADSPA_Data get_port_default(t_dssi_tilde *x, int port);
static void MIDIbuf(int type, int chan, int param, int val, t_dssi_tilde *x);