1
/*************************************************************************
2
* Copyright 2010 Olivier Belanger *
4
* This file is part of pyo, a python module to help digital signal *
5
* processing script creation. *
7
* pyo is free software: you can redistribute it and/or modify *
8
* it under the terms of the GNU General Public License as published by *
9
* the Free Software Foundation, either version 3 of the License, or *
10
* (at your option) any later version. *
12
* pyo is distributed in the hope that it will be useful, *
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15
* GNU General Public License for more details. *
17
* You should have received a copy of the GNU General Public License *
18
* along with pyo. If not, see <http://www.gnu.org/licenses/>. *
19
*************************************************************************/
28
#include "structmember.h"
29
#include "portaudio.h"
32
#include "streammodule.h"
33
#include "pyomodule.h"
34
#include "servermodule.h"
36
static Server *my_server = NULL;
37
static PyObject *Server_shut_down(Server *self);
38
static PyObject *Server_stop(Server *self);
39
static void Server_process_gui(Server *server);
40
static void Server_process_time(Server *server);
41
static inline void Server_process_buffers(Server *server);
42
static int Server_start_rec_internal(Server *self, char *filename);
44
/* random objects count and multiplier to assign different seed to each instance. */
45
#define num_rnd_objs 27
47
int rnd_objs_count[num_rnd_objs] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
48
int rnd_objs_mult[num_rnd_objs] = {1993,1997,1999,2003,2011,2017,2027,2029,2039,2053,2063,2069,
49
2081,2083,2087,2089,2099,2111,2113,2129,2131,2137,2141,2143,2153, 2161,2179};
52
static int coreaudio_stop_callback(Server *self);
56
Server_error(Server *self, char * format, ...)
58
// Errors should indicate failure to execute a request
59
if (self->verbosity & 1) {
62
va_start (args, format);
63
vsprintf (buffer,format, args);
71
Server_message(Server *self, char * format, ...)
73
// Messages should print useful or relevant information, or information requested by the user
74
if (self->verbosity & 2) {
77
va_start (args, format);
78
vsprintf (buffer,format, args);
86
Server_warning(Server *self, char * format, ...)
88
// Warnings should be used when an unexpected or unusual choice was made by pyo
89
if (self->verbosity & 4) {
92
va_start (args, format);
93
vsprintf (buffer,format, args);
100
Server_debug(Server *self, char * format, ...)
102
// Debug messages should print internal information which might be necessary for debugging internal conditions.
103
if (self->verbosity & 8) {
106
va_start (args, format);
107
vsprintf (buffer,format, args);
114
/* Portmidi get input events */
115
static void portmidiGetEvents(Server *self)
121
result = Pm_Poll(self->in);
123
if (Pm_Read(self->in, &buffer, 1) == pmBufferOverflow)
125
self->midiEvents[self->midi_count++] = buffer;
130
/* Portaudio stuff */
131
static void portaudio_assert(PaError ecode, const char* cmdName) {
132
if (ecode != paNoError) {
133
const char* eText = Pa_GetErrorText(ecode);
137
printf("portaudio error in %s: %s\n", cmdName, eText);
142
/* Portaudio callback function */
144
pa_callback_interleaved( const void *inputBuffer, void *outputBuffer,
145
unsigned long framesPerBuffer,
146
const PaStreamCallbackTimeInfo* timeInfo,
147
PaStreamCallbackFlags statusFlags,
150
float *out = (float *)outputBuffer;
151
Server *server = (Server *) arg;
153
assert(framesPerBuffer == server->bufferSize);
156
/* avoid unused variable warnings */
160
if (server->withPortMidi == 1) {
161
portmidiGetEvents(server);
164
if (server->duplex == 1) {
165
float *in = (float *)inputBuffer;
166
for (i=0; i<server->bufferSize*server->nchnls; i++) {
167
server->input_buffer[i] = (MYFLT)in[i];
171
Server_process_buffers(server);
172
for (i=0; i<server->bufferSize*server->nchnls; i++) {
173
out[i] = (float) server->output_buffer[i];
175
server->midi_count = 0;
177
if (server->server_started == 1) {
178
if (server->server_stopped == 1 && server->currentAmp < 0.0001)
179
server->server_started = 0;
188
pa_callback_nonInterleaved( const void *inputBuffer, void *outputBuffer,
189
unsigned long framesPerBuffer,
190
const PaStreamCallbackTimeInfo* timeInfo,
191
PaStreamCallbackFlags statusFlags,
194
float **out = (float **)outputBuffer;
195
Server *server = (Server *) arg;
197
assert(framesPerBuffer == server->bufferSize);
200
/* avoid unused variable warnings */
204
if (server->withPortMidi == 1) {
205
portmidiGetEvents(server);
208
if (server->duplex == 1) {
209
float **in = (float **)inputBuffer;
210
for (i=0; i<server->bufferSize; i++) {
211
for (j=0; j<server->nchnls; j++) {
212
server->input_buffer[(i*server->nchnls)+j] = (MYFLT)in[j][i];
217
Server_process_buffers(server);
218
for (i=0; i<server->bufferSize; i++) {
219
for (j=0; j<server->nchnls; j++) {
220
out[j][i] = (float) server->output_buffer[(i*server->nchnls)+j];
223
server->midi_count = 0;
225
if (server->server_started == 1) {
226
if (server->server_stopped == 1 && server->currentAmp < 0.0001)
227
server->server_started = 0;
239
jack_callback (jack_nframes_t nframes, void *arg)
242
Server *server = (Server *) arg;
243
assert(nframes == server->bufferSize);
244
jack_default_audio_sample_t *in_buffers[server->nchnls], *out_buffers[server->nchnls];
246
if (server->withPortMidi == 1) {
247
portmidiGetEvents(server);
249
PyoJackBackendData *be_data = (PyoJackBackendData *) server->audio_be_data;
250
for (i = 0; i < server->nchnls; i++) {
251
in_buffers[i] = jack_port_get_buffer (be_data->jack_in_ports[i], server->bufferSize);
253
for (i = 0; i < server->nchnls; i++) {
254
out_buffers[i] = jack_port_get_buffer (be_data->jack_out_ports[i], server->bufferSize);
257
/* jack audio data is not interleaved */
258
if (server->duplex == 1) {
259
for (i=0; i<server->bufferSize; i++) {
260
for (j=0; j<server->nchnls; j++) {
261
server->input_buffer[(i*server->nchnls)+j] = (MYFLT) in_buffers[j][i];
265
Server_process_buffers(server);
266
for (i=0; i<server->bufferSize; i++) {
267
for (j=0; j<server->nchnls; j++) {
268
out_buffers[j][i] = (jack_default_audio_sample_t) server->output_buffer[(i*server->nchnls)+j];
271
server->midi_count = 0;
276
jack_srate_cb (jack_nframes_t nframes, void *arg)
278
Server *s = (Server *) arg;
279
s->samplingRate = (double) nframes;
280
Server_debug(s, "the sample rate is now %lu/sec\n", (unsigned long) nframes);
285
jack_bufsize_cb (jack_nframes_t nframes, void *arg)
287
Server *s = (Server *) arg;
288
s->bufferSize = (int) nframes;
289
Server_debug(s, "the buffer size is now %lu/sec\n", (unsigned long) nframes);
294
jack_error_cb (const char *desc)
296
printf("JACK error: %s\n", desc);
300
jack_shutdown_cb (void *arg)
302
Server *s = (Server *) arg;
304
Server_warning(s, "JACK server shutdown. Pyo Server shut down.\n");
310
/* Coreaudio callbacks */
312
OSStatus coreaudio_input_callback(AudioDeviceID device, const AudioTimeStamp* inNow,
313
const AudioBufferList* inInputData,
314
const AudioTimeStamp* inInputTime,
315
AudioBufferList* outOutputData,
316
const AudioTimeStamp* inOutputTime,
319
int i, j, bufchnls, servchnls, off1chnls, off2chnls;
320
Server *server = (Server *) defptr;
321
(void) outOutputData;
322
const AudioBuffer* inputBuf = inInputData->mBuffers;
323
float *bufdata = (float*)inputBuf->mData;
324
bufchnls = inputBuf->mNumberChannels;
325
servchnls = server->nchnls < bufchnls ? server->nchnls : bufchnls;
326
for (i=0; i<server->bufferSize; i++) {
327
off1chnls = i*bufchnls;
328
off2chnls = i*servchnls;
329
for (j=0; j<servchnls; j++) {
330
server->input_buffer[off2chnls+j] = (MYFLT)bufdata[off1chnls+j];
333
return kAudioHardwareNoError;
336
OSStatus coreaudio_output_callback(AudioDeviceID device, const AudioTimeStamp* inNow,
337
const AudioBufferList* inInputData,
338
const AudioTimeStamp* inInputTime,
339
AudioBufferList* outOutputData,
340
const AudioTimeStamp* inOutputTime,
343
int i, j, bufchnls, servchnls, off1chnls, off2chnls;
344
Server *server = (Server *) defptr;
348
if (server->withPortMidi == 1) {
349
portmidiGetEvents(server);
352
Server_process_buffers(server);
353
AudioBuffer* outputBuf = outOutputData->mBuffers;
354
bufchnls = outputBuf->mNumberChannels;
355
servchnls = server->nchnls < bufchnls ? server->nchnls : bufchnls;
356
float *bufdata = (float*)outputBuf->mData;
357
for (i=0; i<server->bufferSize; i++) {
358
off1chnls = i*bufchnls;
359
off2chnls = i*servchnls;
360
for(j=0; j<servchnls; j++) {
361
bufdata[off1chnls+j] = server->output_buffer[off2chnls+j];
364
server->midi_count = 0;
366
if (server->server_started == 1) {
367
if (server->server_stopped == 1 && server->currentAmp < 0.0001)
368
coreaudio_stop_callback(server);
371
return kAudioHardwareNoError;
375
coreaudio_stop_callback(Server *self)
377
OSStatus err = kAudioHardwareNoError;
379
if (self->duplex == 1) {
380
err = AudioDeviceStop(self->input, coreaudio_input_callback);
381
if (err != kAudioHardwareNoError) {
382
Server_error(self, "Input AudioDeviceStop failed %d\n", (int)err);
387
err = AudioDeviceStop(self->output, coreaudio_output_callback);
388
if (err != kAudioHardwareNoError) {
389
Server_error(self, "Output AudioDeviceStop failed %d\n", (int)err);
392
self->server_started = 0;
399
offline_process_block(Server *arg)
401
Server *server = (Server *) arg;
402
Server_process_buffers(server);
406
/* Server audio backend init functions */
409
Server_pa_init(Server *self)
412
PaStreamParameters outputParameters;
413
PaStreamParameters inputParameters;
414
PaDeviceIndex n, inDevice, outDevice;
415
const PaDeviceInfo *deviceInfo;
416
PaHostApiIndex hostIndex;
417
const PaHostApiInfo *hostInfo;
418
PaHostApiTypeId hostId;
419
PaSampleFormat sampleFormat;
420
PaStreamCallback *streamCallback;
421
double deviceDefaultSamplingRate;
423
err = Pa_Initialize();
424
portaudio_assert(err, "Pa_Initialize");
426
n = Pa_GetDeviceCount();
428
portaudio_assert(n, "Pa_GetDeviceCount");
431
PyoPaBackendData *be_data = (PyoPaBackendData *) malloc(sizeof(PyoPaBackendData *));
432
self->audio_be_data = (void *) be_data;
434
if (self->output == -1)
435
outDevice = Pa_GetDefaultOutputDevice(); /* default output device */
437
outDevice = (PaDeviceIndex) self->output; /* selected output device */
438
if (self->input == -1)
439
inDevice = Pa_GetDefaultInputDevice(); /* default input device */
441
inDevice = (PaDeviceIndex) self->input; /* selected input device */
443
/* Retrieve host api id and define sample and callback format*/
444
deviceInfo = Pa_GetDeviceInfo(outDevice);
445
deviceDefaultSamplingRate = deviceInfo->defaultSampleRate;
446
hostIndex = deviceInfo->hostApi;
447
hostInfo = Pa_GetHostApiInfo(hostIndex);
448
hostId = hostInfo->type;
449
if (hostId == paASIO) {
450
Server_debug(self, "Portaudio uses non-interleaved callback.\n");
451
sampleFormat = paFloat32 | paNonInterleaved;
452
streamCallback = pa_callback_nonInterleaved;
454
else if (hostId == paALSA) {
455
Server_debug(self, "Portaudio uses interleaved callback.\n");
456
Server_debug(self, "Using ALSA, if no input/output devices are specified, force to devices 0.\n");
457
if (self->input == -1 && self->output == -1) {
458
self->input = self->output = 0;
459
inDevice = outDevice = (PaDeviceIndex) 0;
461
sampleFormat = paFloat32;
462
streamCallback = pa_callback_interleaved;
465
Server_debug(self, "Portaudio uses interleaved callback.\n");
466
sampleFormat = paFloat32;
467
streamCallback = pa_callback_interleaved;
471
/* setup output and input streams */
472
memset(&outputParameters, 0, sizeof(outputParameters));
473
outputParameters.device = outDevice;
474
outputParameters.channelCount = self->nchnls;
475
outputParameters.sampleFormat = sampleFormat;
476
outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultHighOutputLatency;
477
outputParameters.hostApiSpecificStreamInfo = NULL;
479
if (self->duplex == 1) {
480
memset(&inputParameters, 0, sizeof(inputParameters));
481
inputParameters.device = inDevice;
482
inputParameters.channelCount = self->nchnls;
483
inputParameters.sampleFormat = sampleFormat;
484
inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputParameters.device )->defaultHighInputLatency ;
485
inputParameters.hostApiSpecificStreamInfo = NULL;
488
if (self->input == -1 && self->output == -1) {
489
if (self->duplex == 1)
490
err = Pa_OpenDefaultStream(&be_data->stream, self->nchnls, self->nchnls, sampleFormat, self->samplingRate, self->bufferSize, streamCallback, (void *) self);
492
err = Pa_OpenDefaultStream(&be_data->stream, 0, self->nchnls, sampleFormat, self->samplingRate, self->bufferSize, streamCallback, (void *) self);
495
if (self->duplex == 1)
496
err = Pa_OpenStream(&be_data->stream, &inputParameters, &outputParameters, self->samplingRate, self->bufferSize, paNoFlag, streamCallback, (void *) self);
498
err = Pa_OpenStream(&be_data->stream, (PaStreamParameters *) NULL, &outputParameters, self->samplingRate, self->bufferSize, paNoFlag, streamCallback, (void *) self);
500
portaudio_assert(err, "Pa_OpenStream");
502
Server_error(self, "Portaudio error: %s", Pa_GetErrorText(err));
509
Server_pa_deinit(Server *self)
512
PyoPaBackendData *be_data = (PyoPaBackendData *) self->audio_be_data;
514
if (Pa_IsStreamActive(be_data->stream) || ! Pa_IsStreamStopped(be_data->stream)) {
515
err = Pa_StopStream(be_data->stream);
516
portaudio_assert(err, "Pa_StopStream");
519
err = Pa_CloseStream(be_data->stream);
520
portaudio_assert(err, "Pa_CloseStream");
522
err = Pa_Terminate();
523
portaudio_assert(err, "Pa_Terminate");
525
free(self->audio_be_data);
530
Server_pa_start(Server *self)
533
PyoPaBackendData *be_data = (PyoPaBackendData *) self->audio_be_data;
535
if (Pa_IsStreamActive(be_data->stream) || ! Pa_IsStreamStopped(be_data->stream)) {
536
err = Pa_StopStream(be_data->stream);
537
portaudio_assert(err, "Pa_StopStream");
539
err = Pa_StartStream(be_data->stream);
540
portaudio_assert(err, "Pa_StartStream");
545
Server_pa_stop(Server *self)
547
self->timeStep = (int)(0.1 * self->samplingRate);
549
self->server_stopped = 1;
556
Server_jack_autoconnect (Server *self)
560
PyoJackBackendData *be_data = (PyoJackBackendData *) self->audio_be_data;
561
if ((ports = jack_get_ports (be_data->jack_client, NULL, NULL,
562
JackPortIsPhysical|JackPortIsOutput)) == NULL) {
563
Server_error(self, "Jack: Cannot find any physical capture ports\n");
567
while(ports[i]!=NULL && be_data->jack_in_ports[i] != NULL){
568
if (jack_connect (be_data->jack_client, ports[i], jack_port_name(be_data->jack_in_ports[i]))) {
569
Server_warning(self, "Jack: cannot connect input ports\n");
576
if ((ports = jack_get_ports (be_data->jack_client, NULL, NULL,
577
JackPortIsPhysical|JackPortIsInput)) == NULL) {
578
Server_error(self, "Jack: Cannot find any physical playback ports\n");
583
while(ports[i]!=NULL && be_data->jack_out_ports[i] != NULL){
584
if (jack_connect (be_data->jack_client, jack_port_name (be_data->jack_out_ports[i]), ports[i])) {
585
Server_warning(self, "Jack: cannot connect output ports\n");
595
Server_jack_init (Server *self)
597
char client_name[32];
598
const char *server_name = "server";
599
jack_options_t options = JackNullOption;
600
jack_status_t status;
603
assert(self->audio_be_data == NULL);
604
PyoJackBackendData *be_data = (PyoJackBackendData *) malloc(sizeof(PyoJackBackendData *));
605
self->audio_be_data = (void *) be_data;
606
be_data->jack_in_ports = (jack_port_t **) calloc(self->nchnls, sizeof(jack_port_t *));
607
be_data->jack_out_ports = (jack_port_t **) calloc(self->nchnls, sizeof(jack_port_t *));
608
strncpy(client_name,self->serverName, 32);
609
be_data->jack_client = jack_client_open (client_name, options, &status, server_name);
610
if (be_data->jack_client == NULL) {
611
Server_error(self, "Jack error: Unable to create JACK client\n");
612
if (status & JackServerFailed) {
613
Server_debug(self, "Jack error: jack_client_open() failed, "
614
"status = 0x%2.0x\n", status);
618
if (status & JackServerStarted) {
619
Server_message(self, "JACK server started.\n");
621
if (strcmp(self->serverName, jack_get_client_name(be_data->jack_client)) ) {
622
strcpy(self->serverName, jack_get_client_name(be_data->jack_client));
623
Server_warning(self, "Jack name `%s' assigned\n", self->serverName);
626
sampleRate = jack_get_sample_rate (be_data->jack_client);
627
if (sampleRate != self->samplingRate) {
628
self->samplingRate = (double)sampleRate;
629
Server_warning(self, "Sample rate set to Jack engine sample rate: %" PRIu32 "\n", sampleRate);
632
Server_debug(self, "Jack engine sample rate: %" PRIu32 "\n", sampleRate);
634
if (sampleRate <= 0) {
635
Server_error(self, "Invalid Jack engine sample rate.");
636
jack_client_close (be_data->jack_client);
639
bufferSize = jack_get_buffer_size(be_data->jack_client);
640
if (bufferSize != self->bufferSize) {
641
self->bufferSize = bufferSize;
642
Server_warning(self, "Buffer size set to Jack engine buffer size: %" PRIu32 "\n", bufferSize);
645
Server_debug(self, "Jack engine buffer size: %" PRIu32 "\n", bufferSize);
647
int nchnls = self->nchnls;
649
while (nchnls-- > 0) {
652
int index = self->nchnls - nchnls - 1;
653
ret = sprintf(name, "input_%i", index + 1);
655
be_data->jack_in_ports[index]
656
= jack_port_register (be_data->jack_client, name,
657
JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
659
ret = sprintf(name, "output_%i", self->nchnls - nchnls);
661
be_data->jack_out_ports[index]
662
= jack_port_register (be_data->jack_client, name,
663
JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
665
if ((be_data->jack_in_ports[index] == NULL) || (be_data->jack_out_ports[index] == NULL)) {
666
Server_error(self, "Jack: no more JACK ports available\n");
670
jack_set_error_function (jack_error_cb);
671
jack_set_sample_rate_callback(be_data->jack_client, jack_srate_cb, (void *) self);
672
jack_on_shutdown (be_data->jack_client, jack_shutdown_cb, (void *) self);
673
jack_set_buffer_size_callback (be_data->jack_client, jack_bufsize_cb, (void *) self);
678
Server_jack_deinit (Server *self)
681
PyoJackBackendData *be_data = (PyoJackBackendData *) self->audio_be_data;
682
ret = jack_client_close(be_data->jack_client);
683
free(be_data->jack_in_ports);
684
free(be_data->jack_out_ports);
685
free(self->audio_be_data);
690
Server_jack_start (Server *self)
692
PyoJackBackendData *be_data = (PyoJackBackendData *) self->audio_be_data;
693
jack_set_process_callback(be_data->jack_client, jack_callback, (void *) self);
694
if (jack_activate (be_data->jack_client)) {
695
Server_error(self, "Jack error: cannot activate jack client.\n");
696
jack_client_close (be_data->jack_client);
697
Server_shut_down(self);
700
Server_jack_autoconnect(self);
705
Server_jack_stop (Server *self)
707
PyoJackBackendData *be_data = (PyoJackBackendData *) self->audio_be_data;
708
int ret = jack_deactivate(be_data->jack_client);
709
self->server_started = 0;
717
Server_coreaudio_init(Server *self)
719
OSStatus err = kAudioHardwareNoError;
720
UInt32 count, namelen, propertySize;
723
AudioDeviceID mOutputDevice = kAudioDeviceUnknown;
724
AudioDeviceID mInputDevice = kAudioDeviceUnknown;
728
now.mFlags = kAudioTimeStampHostTimeValid;
729
now.mHostTime = AudioGetCurrentHostTime();
731
/************************************/
732
/* List Coreaudio available devices */
733
/************************************/
734
err = AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDevices, &count, 0);
735
AudioDeviceID *devices = (AudioDeviceID*) malloc(count);
736
err = AudioHardwareGetProperty(kAudioHardwarePropertyDevices, &count, devices);
737
if (err != kAudioHardwareNoError) {
738
Server_error(self, "Get kAudioHardwarePropertyDevices error %s\n", (char*)&err);
742
numdevices = count / sizeof(AudioDeviceID);
743
Server_debug(self, "Coreaudio : Number of devices: %i\n", numdevices);
745
for (i=0; i<numdevices; ++i) {
746
err = AudioDeviceGetPropertyInfo(devices[i], 0, false, kAudioDevicePropertyDeviceName, &count, 0);
747
if (err != kAudioHardwareNoError) {
748
Server_error(self, "Info kAudioDevicePropertyDeviceName error %s A %d %08X\n", (char*)&err, i, devices[i]);
752
char *name = (char*)malloc(count);
753
err = AudioDeviceGetProperty(devices[i], 0, false, kAudioDevicePropertyDeviceName, &count, name);
754
if (err != kAudioHardwareNoError) {
755
Server_error(self, "Get kAudioDevicePropertyDeviceName error %s A %d %08X\n", (char*)&err, i, devices[i]);
759
Server_message(self, " %d : \"%s\"\n", i, name);
763
/************************************/
764
/* Acquire input and output devices */
765
/************************************/
766
/* Acquire input audio device */
767
if (self->duplex == 1) {
768
if (self->input != -1)
769
mInputDevice = devices[self->input];
771
if (mInputDevice==kAudioDeviceUnknown) {
772
count = sizeof(mInputDevice);
773
err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice, &count, (void *) &mInputDevice);
774
if (err != kAudioHardwareNoError) {
775
Server_error(self, "Get kAudioHardwarePropertyDefaultInputDevice error %s\n", (char*)&err);
780
err = AudioDeviceGetPropertyInfo(mInputDevice, 0, false, kAudioDevicePropertyDeviceName, &namelen, 0);
781
if (err != kAudioHardwareNoError) {
782
Server_error(self, "Info kAudioDevicePropertyDeviceName error %s A %08X\n", (char*)&err, mInputDevice);
784
name = (char*)malloc(namelen);
785
err = AudioDeviceGetProperty(mInputDevice, 0, false, kAudioDevicePropertyDeviceName, &namelen, name);
786
if (err != kAudioHardwareNoError) {
787
Server_error(self, "Get kAudioDevicePropertyDeviceName error %s A %08X\n", (char*)&err, mInputDevice);
789
Server_message(self, "Coreaudio : Uses input device : \"%s\"\n", name);
790
self->input = mInputDevice;
794
/* Acquire output audio device */
795
if (self->output != -1)
796
mOutputDevice = devices[self->output];
798
if (mOutputDevice==kAudioDeviceUnknown) {
799
count = sizeof(mOutputDevice);
800
err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &count, (void *) &mOutputDevice);
801
if (err != kAudioHardwareNoError) {
802
Server_error(self, "Get kAudioHardwarePropertyDefaultOutputDevice error %s\n", (char*)&err);
807
err = AudioDeviceGetPropertyInfo(mOutputDevice, 0, false, kAudioDevicePropertyDeviceName, &namelen, 0);
808
if (err != kAudioHardwareNoError) {
809
Server_error(self, "Info kAudioDevicePropertyDeviceName error %s A %08X\n", (char*)&err, mOutputDevice);
811
name = (char*)malloc(namelen);
812
err = AudioDeviceGetProperty(mOutputDevice, 0, false, kAudioDevicePropertyDeviceName, &namelen, name);
813
if (err != kAudioHardwareNoError) {
814
Server_error(self, "Get kAudioDevicePropertyDeviceName error %s A %08X\n", (char*)&err, mOutputDevice);
816
Server_message(self, "Coreaudio : Uses output device : \"%s\"\n", name);
817
self->output = mOutputDevice;
820
/*************************************************/
821
/* Get in/out buffer frame and buffer frame size */
822
/*************************************************/
824
AudioValueRange range;
827
/* Get input device buffer frame size and buffer frame size range */
828
if (self->duplex == 1) {
829
count = sizeof(UInt32);
830
err = AudioDeviceGetProperty(mInputDevice, 0, false, kAudioDevicePropertyBufferFrameSize, &count, &bufferSize);
831
if (err != kAudioHardwareNoError)
832
Server_error(self, "Get kAudioDevicePropertyBufferFrameSize error %s\n", (char*)&err);
833
Server_debug(self, "Coreaudio : Coreaudio input device buffer size = %ld\n", bufferSize);
835
count = sizeof(AudioValueRange);
836
err = AudioDeviceGetProperty(mInputDevice, 0, false, kAudioDevicePropertyBufferSizeRange, &count, &range);
837
if (err != kAudioHardwareNoError)
838
Server_error(self, "Get kAudioDevicePropertyBufferSizeRange error %s\n", (char*)&err);
839
Server_debug(self, "Coreaudio : Coreaudio input device buffer size range = %f -> %f\n", range.mMinimum, range.mMaximum);
841
/* Get input device sampling rate */
842
count = sizeof(Float64);
843
err = AudioDeviceGetProperty(mInputDevice, 0, false, kAudioDevicePropertyNominalSampleRate, &count, &sampleRate);
844
if (err != kAudioHardwareNoError)
845
Server_debug(self, "Get kAudioDevicePropertyNominalSampleRate error %s\n", (char*)&err);
846
Server_debug(self, "Coreaudio : Coreaudio input device sampling rate = %.2f\n", sampleRate);
849
/* Get output device buffer frame size and buffer frame size range */
850
count = sizeof(UInt32);
851
err = AudioDeviceGetProperty(mOutputDevice, 0, false, kAudioDevicePropertyBufferFrameSize, &count, &bufferSize);
852
if (err != kAudioHardwareNoError)
853
Server_error(self, "Get kAudioDevicePropertyBufferFrameSize error %s\n", (char*)&err);
854
Server_debug(self, "Coreaudio : Coreaudio output device buffer size = %ld\n", bufferSize);
856
count = sizeof(AudioValueRange);
857
err = AudioDeviceGetProperty(mOutputDevice, 0, false, kAudioDevicePropertyBufferSizeRange, &count, &range);
858
if (err != kAudioHardwareNoError)
859
Server_error(self, "Get kAudioDevicePropertyBufferSizeRange error %s\n", (char*)&err);
860
Server_debug(self, "Coreaudio : Coreaudio output device buffer size range = %.2f -> %.2f\n", range.mMinimum, range.mMaximum);
862
/* Get output device sampling rate */
863
count = sizeof(Float64);
864
err = AudioDeviceGetProperty(mOutputDevice, 0, false, kAudioDevicePropertyNominalSampleRate, &count, &sampleRate);
865
if (err != kAudioHardwareNoError)
866
Server_debug(self, "Get kAudioDevicePropertyNominalSampleRate error %s\n", (char*)&err);
867
Server_debug(self, "Coreaudio : Coreaudio output device sampling rate = %.2f\n", sampleRate);
870
/****************************************/
871
/********* Set audio properties *********/
872
/****************************************/
873
/* set/get the buffersize for the devices */
874
count = sizeof(UInt32);
875
err = AudioDeviceSetProperty(mOutputDevice, &now, 0, false, kAudioDevicePropertyBufferFrameSize, count, &self->bufferSize);
876
if (err != kAudioHardwareNoError) {
877
Server_error(self, "set kAudioDevicePropertyBufferFrameSize error %4.4s\n", (char*)&err);
878
self->bufferSize = bufferSize;
879
err = AudioDeviceSetProperty(mOutputDevice, &now, 0, false, kAudioDevicePropertyBufferFrameSize, count, &self->bufferSize);
880
if (err != kAudioHardwareNoError)
881
Server_error(self, "set kAudioDevicePropertyBufferFrameSize error %4.4s\n", (char*)&err);
883
Server_message(self, "pyo buffer size set to output device buffer size : %i\n", self->bufferSize);
886
Server_message(self, "Coreaudio : Changed output device buffer size successfully: %i\n", self->bufferSize);
888
if (self->duplex == 1) {
889
err = AudioDeviceSetProperty(mInputDevice, &now, 0, false, kAudioDevicePropertyBufferFrameSize, count, &self->bufferSize);
890
if (err != kAudioHardwareNoError) {
891
Server_error(self, "set kAudioDevicePropertyBufferFrameSize error %4.4s\n", (char*)&err);
895
/* set/get the sampling rate for the devices */
896
count = sizeof(double);
897
double pyoSamplingRate = self->samplingRate;
898
err = AudioDeviceSetProperty(mOutputDevice, &now, 0, false, kAudioDevicePropertyNominalSampleRate, count, &pyoSamplingRate);
899
if (err != kAudioHardwareNoError) {
900
Server_error(self, "set kAudioDevicePropertyNominalSampleRate error %s\n", (char*)&err);
901
self->samplingRate = (double)sampleRate;
902
err = AudioDeviceSetProperty(mOutputDevice, &now, 0, false, kAudioDevicePropertyNominalSampleRate, count, &sampleRate);
903
if (err != kAudioHardwareNoError)
904
Server_error(self, "set kAudioDevicePropertyNominalSampleRate error %s\n", (char*)&err);
906
Server_message(self, "pyo sampling rate set to output device sampling rate : %i\n", self->samplingRate);
909
Server_message(self, "Coreaudio : Changed output device sampling rate successfully: %.2f\n", self->samplingRate);
911
if (self->duplex ==1) {
912
pyoSamplingRate = self->samplingRate;
913
err = AudioDeviceSetProperty(mInputDevice, &now, 0, false, kAudioDevicePropertyNominalSampleRate, count, &pyoSamplingRate);
914
if (err != kAudioHardwareNoError) {
915
Server_error(self, "set kAudioDevicePropertyNominalSampleRate error %s\n", (char*)&err);
920
/****************************************/
921
/* Input and output stream descriptions */
922
/****************************************/
923
AudioStreamBasicDescription outputStreamDescription;
924
AudioStreamBasicDescription inputStreamDescription;
926
// Get input device stream configuration
927
if (self->duplex == 1) {
928
count = sizeof(AudioStreamBasicDescription);
929
err = AudioDeviceGetProperty(mInputDevice, 0, true, kAudioDevicePropertyStreamFormat, &count, &inputStreamDescription);
930
if (err != kAudioHardwareNoError)
931
Server_debug(self, "Get kAudioDevicePropertyStreamFormat error %s\n", (char*)&err);
934
inputStreamDescription.mSampleRate = (Float64)self->samplingRate;
936
err = AudioDeviceSetProperty(mInputDevice, &now, 0, false, kAudioDevicePropertyStreamFormat, count, &inputStreamDescription);
937
if (err != kAudioHardwareNoError)
938
Server_debug(self, "-- Set kAudioDevicePropertyStreamFormat error %s\n", (char*)&err);
940
// Print new input stream description
941
err = AudioDeviceGetProperty(mInputDevice, 0, true, kAudioDevicePropertyStreamFormat, &count, &inputStreamDescription);
942
if (err != kAudioHardwareNoError)
943
Server_debug(self, "Get kAudioDevicePropertyNominalSampleRate error %s\n", (char*)&err);
945
Server_debug(self, "Coreaudio : Coreaudio driver input stream sampling rate = %.2f\n", inputStreamDescription.mSampleRate);
946
Server_debug(self, "Coreaudio : Coreaudio driver input stream bytes per frame = %i\n", inputStreamDescription.mBytesPerFrame);
947
Server_debug(self, "Coreaudio : Coreaudio driver input stream number of channels = %i\n", inputStreamDescription.mChannelsPerFrame);
950
/* Get output device stream configuration */
951
count = sizeof(AudioStreamBasicDescription);
952
err = AudioDeviceGetProperty(mOutputDevice, 0, false, kAudioDevicePropertyStreamFormat, &count, &outputStreamDescription);
953
if (err != kAudioHardwareNoError)
954
Server_debug(self, "Get kAudioDevicePropertyStreamFormat error %s\n", (char*)&err);
957
outputStreamDescription.mSampleRate = (Float64)self->samplingRate;
959
err = AudioDeviceSetProperty(mOutputDevice, &now, 0, false, kAudioDevicePropertyStreamFormat, count, &outputStreamDescription);
960
if (err != kAudioHardwareNoError)
961
Server_debug(self, "Set kAudioDevicePropertyStreamFormat error %s\n", (char*)&err);
963
// Print new output stream description
964
err = AudioDeviceGetProperty(mOutputDevice, 0, false, kAudioDevicePropertyStreamFormat, &count, &outputStreamDescription);
965
if (err != kAudioHardwareNoError)
966
Server_debug(self, "Get kAudioDevicePropertyStreamFormat error %s\n", (char*)&err);
968
Server_debug(self, "Coreaudio : Coreaudio driver output stream sampling rate = %.2f\n", outputStreamDescription.mSampleRate);
969
Server_debug(self, "Coreaudio : Coreaudio driver output stream bytes per frame = %i\n", outputStreamDescription.mBytesPerFrame);
970
Server_debug(self, "Coreaudio : Coreaudio driver output stream number of channels = %i\n", outputStreamDescription.mChannelsPerFrame);
973
/**************************************************/
974
/********* Set input and output callbacks *********/
975
/**************************************************/
976
if (self->duplex == 1) {
977
err = AudioDeviceAddIOProc(self->input, coreaudio_input_callback, (void *) self); // setup our device with an IO proc
978
if (err != kAudioHardwareNoError) {
979
Server_error(self, "Input AudioDeviceAddIOProc failed %d\n", (int)err);
982
err = AudioDeviceGetPropertyInfo(self->input, 0, true, kAudioDevicePropertyIOProcStreamUsage, &propertySize, &writable);
983
AudioHardwareIOProcStreamUsage *input_su = (AudioHardwareIOProcStreamUsage*)malloc(propertySize);
984
input_su->mIOProc = (void*)coreaudio_input_callback;
985
err = AudioDeviceGetProperty(self->input, 0, true, kAudioDevicePropertyIOProcStreamUsage, &propertySize, input_su);
986
for (i=0; i<inputStreamDescription.mChannelsPerFrame; ++i) {
987
input_su->mStreamIsOn[i] = 1;
989
err = AudioDeviceSetProperty(self->input, &now, 0, true, kAudioDevicePropertyIOProcStreamUsage, propertySize, input_su);
992
err = AudioDeviceAddIOProc(self->output, coreaudio_output_callback, (void *) self); // setup our device with an IO proc
993
if (err != kAudioHardwareNoError) {
994
Server_error(self, "Output AudioDeviceAddIOProc failed %d\n", (int)err);
997
err = AudioDeviceGetPropertyInfo(self->output, 0, false, kAudioDevicePropertyIOProcStreamUsage, &propertySize, &writable);
998
AudioHardwareIOProcStreamUsage *output_su = (AudioHardwareIOProcStreamUsage*)malloc(propertySize);
999
output_su->mIOProc = (void*)coreaudio_output_callback;
1000
err = AudioDeviceGetProperty(self->output, 0, false, kAudioDevicePropertyIOProcStreamUsage, &propertySize, output_su);
1001
for (i=0; i<outputStreamDescription.mChannelsPerFrame; ++i) {
1002
output_su->mStreamIsOn[i] = 1;
1004
err = AudioDeviceSetProperty(self->output, &now, 0, false, kAudioDevicePropertyIOProcStreamUsage, propertySize, output_su);
1010
Server_coreaudio_deinit(Server *self)
1012
OSStatus err = kAudioHardwareNoError;
1014
if (self->duplex == 1) {
1015
err = AudioDeviceRemoveIOProc(self->input, coreaudio_input_callback);
1016
if (err != kAudioHardwareNoError) {
1017
Server_error(self, "Input AudioDeviceRemoveIOProc failed %d\n", (int)err);
1022
err = AudioDeviceRemoveIOProc(self->output, coreaudio_output_callback);
1023
if (err != kAudioHardwareNoError) {
1024
Server_error(self, "Output AudioDeviceRemoveIOProc failed %d\n", (int)err);
1032
Server_coreaudio_start(Server *self)
1034
OSStatus err = kAudioHardwareNoError;
1036
if (self->duplex == 1) {
1037
err = AudioDeviceStart(self->input, coreaudio_input_callback);
1038
if (err != kAudioHardwareNoError) {
1039
Server_error(self, "Input AudioDeviceStart failed %d\n", (int)err);
1044
err = AudioDeviceStart(self->output, coreaudio_output_callback);
1045
if (err != kAudioHardwareNoError) {
1046
Server_error(self, "Output AudioDeviceStart failed %d\n", (int)err);
1053
Server_coreaudio_stop(Server *self)
1055
self->timeStep = (int)(0.1 * self->samplingRate);
1057
self->server_stopped = 1;
1064
Server_offline_init (Server *self)
1070
Server_offline_deinit (Server *self)
1076
Server_offline_start (Server *self)
1078
if (self->recdur < 0) {
1079
Server_error(self,"Duration must be specified for Offline Server (see Server.recordOptions).");
1082
Server_message(self,"Offline Server rendering file %s dur=%f\n", self->recpath, self->recdur);
1083
int numBlocks = ceil(self->recdur * self->samplingRate/self->bufferSize);
1084
Server_debug(self,"Number of blocks: %i\n", numBlocks);
1085
Server_start_rec_internal(self, self->recpath);
1086
while (numBlocks-- > 0 && self->server_stopped == 0) {
1087
offline_process_block((Server *) self);
1089
self->server_started = 0;
1091
sf_close(self->recfile);
1092
Server_message(self,"Offline Server rendering finished.\n");
1097
Server_offline_stop (Server *self)
1099
self->server_stopped = 1;
1103
/***************************************************/
1104
/* Main Processing functions */
1107
Server_process_buffers(Server *server)
1109
float *out = server->output_buffer;
1110
MYFLT buffer[server->nchnls][server->bufferSize];
1112
int count = server->stream_count;
1113
int nchnls = server->nchnls;
1114
MYFLT amp = server->amp;
1118
memset(&buffer, 0, sizeof(buffer));
1119
PyGILState_STATE s = PyGILState_Ensure();
1120
for (i=0; i<count; i++) {
1121
stream_tmp = (Stream *)PyList_GET_ITEM(server->streams, i);
1122
if (Stream_getStreamActive(stream_tmp) == 1) {
1123
Stream_callFunction(stream_tmp);
1124
if (Stream_getStreamToDac(stream_tmp) != 0) {
1125
data = Stream_getData(stream_tmp);
1126
chnl = Stream_getStreamChnl(stream_tmp);
1127
for (j=0; j < server->bufferSize; j++) {
1128
buffer[chnl][j] += *data++;
1131
if (Stream_getDuration(stream_tmp) != 0) {
1132
Stream_IncrementDurationCount(stream_tmp);
1135
else if (Stream_getBufferCountWait(stream_tmp) != 0)
1136
Stream_IncrementBufferCount(stream_tmp);
1138
if (server->withGUI == 1 && nchnls <= 8) {
1139
Server_process_gui(server);
1141
if (server->withTIME == 1) {
1142
Server_process_time(server);
1144
server->elapsedSamples += server->bufferSize;
1145
PyGILState_Release(s);
1146
if (amp != server->lastAmp) {
1147
server->timeCount = 0;
1148
server->stepVal = (amp - server->currentAmp) / server->timeStep;
1149
server->lastAmp = amp;
1152
for (i=0; i < server->bufferSize; i++){
1153
if (server->timeCount < server->timeStep) {
1154
server->currentAmp += server->stepVal;
1155
server->timeCount++;
1157
for (j=0; j<server->nchnls; j++) {
1158
out[(i*server->nchnls)+j] = (float)buffer[j][i] * server->currentAmp;
1161
if (server->record == 1)
1162
sf_write_float(server->recfile, out, server->bufferSize * server->nchnls);
1167
Server_process_gui(Server *server)
1169
float rms[server->nchnls];
1170
float *out = server->output_buffer;
1173
for (j=0; j<server->nchnls; j++) {
1175
for (i=0; i<server->bufferSize; i++) {
1176
outAmp = out[(i*server->nchnls)+j];
1178
if (outAmp > rms[j])
1182
if (server->gcount <= server->numPass) {
1183
for (j=0; j<server->nchnls; j++) {
1184
server->lastRms[j] = (rms[j] + server->lastRms[j]) * 0.5;
1189
for (j=0; j<server->nchnls; j++) {
1190
server->lastRms[j] = (rms[j] + server->lastRms[j]) * 0.5;
1192
switch (server->nchnls) {
1194
PyObject_CallMethod((PyObject *)server->GUI, "setRms", "f", server->lastRms[0]);
1197
PyObject_CallMethod((PyObject *)server->GUI, "setRms", "ff", server->lastRms[0], server->lastRms[1]);
1200
PyObject_CallMethod((PyObject *)server->GUI, "setRms", "fff", server->lastRms[0], server->lastRms[1], server->lastRms[2]);
1203
PyObject_CallMethod((PyObject *)server->GUI, "setRms", "ffff", server->lastRms[0], server->lastRms[1], server->lastRms[2], server->lastRms[3]);
1206
PyObject_CallMethod((PyObject *)server->GUI, "setRms", "fffff", server->lastRms[0], server->lastRms[1], server->lastRms[2], server->lastRms[3], server->lastRms[4]);
1209
PyObject_CallMethod((PyObject *)server->GUI, "setRms", "ffffff", server->lastRms[0], server->lastRms[1], server->lastRms[2], server->lastRms[3], server->lastRms[4], server->lastRms[5]);
1212
PyObject_CallMethod((PyObject *)server->GUI, "setRms", "fffffff", server->lastRms[0], server->lastRms[1], server->lastRms[2], server->lastRms[3], server->lastRms[4], server->lastRms[5], server->lastRms[6]);
1215
PyObject_CallMethod((PyObject *)server->GUI, "setRms", "ffffffff", server->lastRms[0], server->lastRms[1], server->lastRms[2], server->lastRms[3], server->lastRms[4], server->lastRms[5], server->lastRms[6], server->lastRms[7]);
1223
Server_process_time(Server *server)
1225
int hours, minutes, seconds, milliseconds;
1226
float sr = server->samplingRate;
1229
if (server->tcount <= server->timePass) {
1233
sampsToSecs = (double)(server->elapsedSamples / sr);
1234
seconds = (int)sampsToSecs;
1235
milliseconds = (int)((sampsToSecs - seconds) * 1000);
1236
minutes = seconds / 60;
1237
hours = minutes / 60;
1238
minutes = minutes % 60;
1239
seconds = seconds % 60;
1240
PyObject_CallMethod((PyObject *)server->TIME, "setTime", "iiii", hours, minutes, seconds, milliseconds);
1245
/***************************************************/
1247
/* Global function called by any new audio object to
1248
get a pointer to the server */
1250
PyServer_get_server()
1252
return (PyObject *)my_server;
1256
Server_shut_down(Server *self)
1260
if (self->server_booted == 0) {
1261
Server_error(self, "The Server must be booted!");
1265
if (self->server_started == 1) {
1266
Server_stop((Server *)self);
1269
for (i=0; i<num_rnd_objs; i++) {
1270
rnd_objs_count[i] = 0;
1273
switch (self->audio_be_type) {
1275
ret = Server_pa_deinit(self);
1278
#ifdef USE_COREAUDIO
1279
ret = Server_coreaudio_deinit(self);
1284
ret = Server_jack_deinit(self);
1288
ret = Server_offline_deinit(self);
1291
self->server_booted = 0;
1293
Server_error(self, "Error closing audio backend.\n");
1296
if (self->withPortMidi == 1) {
1306
Server_traverse(Server *self, visitproc visit, void *arg)
1308
Py_VISIT(self->streams);
1313
Server_clear(Server *self)
1315
Py_CLEAR(self->streams);
1320
Server_dealloc(Server* self)
1322
Server_shut_down(self);
1324
free(self->input_buffer);
1325
free(self->serverName);
1326
self->ob_type->tp_free((PyObject*)self);
1330
Server_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1332
if (PyServer_get_server() != NULL) {
1333
Server_warning((Server *) PyServer_get_server(), "Warning: A Server is already created!\n"
1334
"If you put this Server in a new variable, please delete it!\n");
1335
return PyServer_get_server();
1338
self = (Server *)type->tp_alloc(type, 0);
1339
self->server_booted = 0;
1340
self->audio_be_data = NULL;
1341
self->serverName = (char *) calloc(32, sizeof(char));
1342
self->samplingRate = 44100.0;
1345
self->bufferSize = 256;
1349
self->midi_input = -1;
1350
self->amp = self->resetAmp = 1.;
1351
self->currentAmp = self->lastAmp = 0.;
1354
self->verbosity = 7;
1356
self->recformat = 0;
1358
self->startoffset = 0.0;
1359
self->globalSeed = 0;
1360
Py_XDECREF(my_server);
1362
my_server = (Server *)self;
1363
return (PyObject *)self;
1367
Server_init(Server *self, PyObject *args, PyObject *kwds)
1369
static char *kwlist[] = {"sr", "nchnls", "buffersize", "duplex", "audio", "jackname", NULL};
1371
char *audioType = "portaudio";
1372
char *serverName = "pyo";
1374
//Server_debug(self, "Server_init. Compiled " TIMESTAMP "\n"); // Only for debugging purposes
1375
if (! PyArg_ParseTupleAndKeywords(args, kwds, "|diiiss", kwlist,
1376
&self->samplingRate, &self->nchnls, &self->bufferSize, &self->duplex, &audioType, &serverName))
1378
if (strcmp(audioType, "jack") == 0) {
1379
self->audio_be_type = PyoJack;
1381
else if (strcmp(audioType, "portaudio") == 0 || strcmp(audioType, "pa") == 0 ) {
1382
self->audio_be_type = PyoPortaudio;
1384
else if (strcmp(audioType, "coreaudio") == 0) {
1385
self->audio_be_type = PyoCoreaudio;
1387
else if (strcmp(audioType, "offline") == 0) {
1388
self->audio_be_type = PyoOffline;
1391
Server_warning(self, "Unknown audio type. Using Portaudio\n");
1392
self->audio_be_type = PyoPortaudio;
1394
strncpy(self->serverName, serverName, 32);
1395
if (strlen(serverName) > 31) {
1396
self->serverName[31] = '\0';
1398
self->recpath = getenv("HOME");
1399
if (self->recpath != NULL)
1400
strncat(self->recpath, "/pyo_rec.wav", strlen("/pyo_rec.wav"));
1406
Server_setInputDevice(Server *self, PyObject *arg)
1409
if (PyInt_Check(arg))
1410
self->input = PyInt_AsLong(arg);
1417
Server_setInOutDevice(Server *self, PyObject *arg)
1420
if (PyInt_Check(arg))
1421
self->input = PyInt_AsLong(arg);
1422
self->output = PyInt_AsLong(arg);
1429
Server_setOutputDevice(Server *self, PyObject *arg)
1432
if (PyInt_Check(arg))
1433
self->output = PyInt_AsLong(arg);
1440
Server_setMidiInputDevice(Server *self, PyObject *arg)
1443
if (PyInt_Check(arg))
1444
self->midi_input = PyInt_AsLong(arg);
1451
Server_setSamplingRate(Server *self, PyObject *arg)
1453
if (self->server_booted) {
1454
Server_warning(self, "Can't change sampling rate for booted server.\n");
1458
if (arg != NULL && PyNumber_Check(arg)) {
1459
self->samplingRate = PyFloat_AsDouble(PyNumber_Float(arg));
1462
Server_error(self, "Sampling rate must be a number.\n");
1469
Server_setNchnls(Server *self, PyObject *arg)
1471
if (self->server_booted) {
1472
Server_warning(self, "Can't change number of channels for booted server.\n");
1476
if (arg != NULL && PyInt_Check(arg)) {
1477
self->nchnls = PyInt_AsLong(arg);
1480
Server_error(self, "Number of channels must be an integer.\n");
1487
Server_setBufferSize(Server *self, PyObject *arg)
1489
if (self->server_booted) {
1490
Server_warning(self, "Can't change buffer size for booted server.\n");
1494
if (arg != NULL && PyInt_Check(arg)) {
1495
self->bufferSize = PyInt_AsLong(arg);
1498
Server_error(self, "Buffer size must be an integer.\n");
1505
Server_setDuplex(Server *self, PyObject *arg)
1507
if (self->server_booted) {
1508
Server_warning(self,"Can't change duplex mode for booted server.\n");
1513
if (PyInt_Check(arg))
1514
self->duplex = PyInt_AsLong(arg);
1521
Server_setGlobalSeed(Server *self, PyObject *arg)
1526
if (PyInt_Check(arg)) {
1527
tmp = PyInt_AsLong(arg);
1529
self->globalSeed = 0;
1531
self->globalSeed = tmp;
1534
self->globalSeed = 0;
1537
self->globalSeed = 0;
1544
Server_generateSeed(Server *self, int oid)
1546
int curseed, seed, count, mult;
1549
count = ++rnd_objs_count[oid];
1550
mult = rnd_objs_mult[oid];
1552
if (self->globalSeed > 0) {
1553
curseed = self->globalSeed + ((count * mult) % 32768);
1557
seed = (unsigned) (ltime / 2) % 32768;
1558
curseed = seed + ((count * mult) % 32768);
1566
Server_setAmp(Server *self, PyObject *arg)
1569
int check = PyNumber_Check(arg);
1572
self->amp = PyFloat_AsDouble(PyNumber_Float(arg));
1573
if (self->amp != 0.0)
1574
self->resetAmp = self->amp;
1582
Server_setAmpCallable(Server *self, PyObject *arg)
1588
Server_error(self,"The amplitude callable attribute must be a method.\n");
1594
Py_XDECREF(self->GUI);
1598
self->lastRms = (float *)realloc(self->lastRms, self->nchnls * sizeof(float));
1599
for (i=0; i<self->nchnls; i++) {
1600
self->lastRms[i] = 0.0;
1603
for (i=1; i<100; i++) {
1604
if ((self->bufferSize * i / self->samplingRate) > 0.045) {
1617
Server_setTimeCallable(Server *self, PyObject *arg)
1623
Server_error(self,"The time callable attribute must be a method.\n");
1629
Py_XDECREF(self->TIME);
1633
for (i=1; i<100; i++) {
1634
if ((self->bufferSize * i / self->samplingRate) > 0.06) {
1647
Server_setVerbosity(Server *self, PyObject *arg)
1650
int check = PyInt_Check(arg);
1653
self->verbosity = PyInt_AsLong(arg);
1662
Server_setStartOffset(Server *self, PyObject *arg)
1665
int check = PyNumber_Check(arg);
1668
self->startoffset = PyFloat_AsDouble(PyNumber_Float(arg));
1677
Server_pm_init(Server *self)
1679
/* Initializing MIDI */
1682
pmerr = Pm_Initialize();
1684
Server_warning(self, "PortMidi warning: could not initialize PortMidi: %s\n", Pm_GetErrorText(pmerr));
1685
self->withPortMidi = 0;
1689
Server_debug(self, "PortMidi initialized.\n");
1690
self->withPortMidi = 1;
1693
if (self->withPortMidi == 1) {
1694
int num_devices = Pm_CountDevices();
1695
if (num_devices > 0) {
1696
if (self->midi_input == -1 || self->midi_input >= num_devices)
1697
self->midi_input = 0;
1698
const PmDeviceInfo *info = Pm_GetDeviceInfo(self->midi_input);
1700
pmerr = Pm_OpenInput(&self->in, self->midi_input, NULL, 100, NULL, NULL);
1702
Server_warning(self,
1703
"PortMidi warning: could not open midi input %d (%s): %s\nPortmidi closed\n",
1704
0, info->name, Pm_GetErrorText(pmerr));
1705
self->withPortMidi = 0;
1709
Server_debug(self, "Midi Input (%s) opened.\n", info->name);
1712
Server_warning(self, "PortMidi warning: Something wrong with midi device!\nPortmidi closed\n");
1713
self->withPortMidi = 0;
1718
Server_warning(self, "PortMidi warning: No midi device found!\nPortmidi closed\n");
1719
self->withPortMidi = 0;
1723
if (self->withPortMidi == 1) {
1724
self->midi_count = 0;
1725
Pm_SetFilter(self->in, PM_FILT_ACTIVE | PM_FILT_CLOCK);
1732
Server_boot(Server *self)
1734
int audioerr = 0, midierr = 0;
1736
if (self->server_booted == 1) {
1737
Server_error(self, "Server already booted!\n");
1741
self->server_started = 0;
1742
self->stream_count = 0;
1743
self->elapsedSamples = 0;
1745
midierr = Server_pm_init(self);
1746
Server_debug(self, "PortMidi initialization return code : %d.\n", midierr);
1748
self->streams = PyList_New(0);
1749
switch (self->audio_be_type) {
1751
audioerr = Server_pa_init(self);
1755
audioerr = Server_jack_init(self);
1757
Server_jack_deinit(self);
1761
Server_error(self, "Pyo built without Jack support\n");
1765
#ifdef USE_COREAUDIO
1766
audioerr = Server_coreaudio_init(self);
1768
Server_coreaudio_deinit(self);
1772
Server_error(self, "Pyo built without Coreaudio support\n");
1776
audioerr = Server_offline_init(self);
1778
Server_offline_deinit(self);
1782
// Must allocate buffer after initializing the audio backend in case parameters change there
1783
if (self->input_buffer) {
1784
free(self->input_buffer);
1786
self->input_buffer = (MYFLT *)calloc(self->bufferSize * self->nchnls, sizeof(MYFLT));
1787
if (self->output_buffer) {
1788
free(self->output_buffer);
1790
self->output_buffer = (float *)calloc(self->bufferSize * self->nchnls, sizeof(float));
1791
for (i=0; i<self->bufferSize*self->nchnls; i++) {
1792
self->input_buffer[i] = 0.0;
1793
self->output_buffer[i] = 0.0;
1795
if (audioerr == 0 && midierr == 0) {
1796
self->server_booted = 1;
1799
self->server_booted = 0;
1800
Server_error(self, "\nServer not booted.\n");
1808
Server_start(Server *self)
1810
if (self->server_started == 1) {
1811
Server_warning(self, "Server already started!\n");
1816
if (self->server_booted == 0) {
1817
Server_warning(self, "The Server must be booted!\n");
1823
/* Ensure Python is set up for threading */
1824
PyEval_InitThreads();
1826
self->server_stopped = 0;
1827
self->server_started = 1;
1828
self->timeStep = (int)(0.01 * self->samplingRate);
1830
if (self->startoffset > 0.0) {
1831
Server_message(self,"Rendering %.2f seconds offline...\n", self->startoffset);
1832
int numBlocks = ceil(self->startoffset * self->samplingRate/self->bufferSize);
1833
self->lastAmp = 1.0; self->amp = 0.0;
1834
while (numBlocks-- > 0) {
1835
offline_process_block((Server *) self);
1837
Server_message(self,"Offline rendering completed. Start realtime processing.\n");
1838
self->startoffset = 0.0;
1841
self->amp = self->resetAmp;
1843
switch (self->audio_be_type) {
1845
err = Server_pa_start(self);
1848
#ifdef USE_COREAUDIO
1849
err = Server_coreaudio_start(self);
1854
err = Server_jack_start(self);
1858
err = Server_offline_start(self);
1862
Server_error(self, "Error starting server.");
1870
Server_stop(Server *self)
1873
if (self->server_started == 0) {
1874
Server_warning(self, "The Server must be started!\n");
1878
switch (self->audio_be_type) {
1880
err = Server_pa_stop(self);
1883
#ifdef USE_COREAUDIO
1884
err = Server_coreaudio_stop(self);
1889
err = Server_jack_stop(self);
1893
err = Server_offline_stop(self);
1898
Server_error(self, "Error stopping server.\n");
1901
self->server_stopped = 1;
1908
Server_recordOptions(Server *self, PyObject *args, PyObject *kwds)
1910
static char *kwlist[] = {"dur", "filename", "fileformat", "sampletype", NULL};
1912
if (! PyArg_ParseTupleAndKeywords(args, kwds, "d|sii", kwlist, &self->recdur, &self->recpath, &self->recformat, &self->rectype)) {
1913
return PyInt_FromLong(-1);
1921
Server_start_rec(Server *self, PyObject *args, PyObject *kwds)
1923
char *filename=NULL;
1925
static char *kwlist[] = {"filename", NULL};
1927
if (! PyArg_ParseTupleAndKeywords(args, kwds, "|s", kwlist, &filename)) {
1928
return PyInt_FromLong(-1);
1930
Server_start_rec_internal(self, filename);
1937
Server_start_rec_internal(Server *self, char *filename)
1939
/* Prepare sfinfo */
1940
self->recinfo.samplerate = (int)self->samplingRate;
1941
self->recinfo.channels = self->nchnls;
1943
Server_debug(self, "recinfo.samplerate : %i\n", self->recinfo.samplerate);
1944
Server_debug(self, "recinfo.channels : %i\n", self->recinfo.channels);
1946
switch (self->recformat) {
1948
self->recinfo.format = SF_FORMAT_WAV;
1951
self->recinfo.format = SF_FORMAT_AIFF;
1954
switch (self->rectype) {
1956
self->recinfo.format = self->recinfo.format | SF_FORMAT_PCM_16;
1959
self->recinfo.format = self->recinfo.format | SF_FORMAT_PCM_24;
1962
self->recinfo.format = self->recinfo.format | SF_FORMAT_PCM_32;
1965
self->recinfo.format = self->recinfo.format | SF_FORMAT_FLOAT;
1968
self->recinfo.format = self->recinfo.format | SF_FORMAT_DOUBLE;
1971
Server_debug(self, "recinfo.format : %i\n", self->recinfo.format);
1973
/* Open the output file. */
1974
if (filename == NULL) {
1975
Server_debug(self, "recpath : %s\n", self->recpath);
1976
if (! (self->recfile = sf_open(self->recpath, SFM_WRITE, &self->recinfo))) {
1977
Server_error(self, "Not able to open output file %s.\n", self->recpath);
1978
Server_debug(self, "%s\n", sf_strerror(self->recfile));
1983
Server_debug(self, "filename : %s\n", filename);
1984
if (! (self->recfile = sf_open(filename, SFM_WRITE, &self->recinfo))) {
1985
Server_error(self, "Not able to open output file %s.\n", filename);
1986
Server_debug(self, "%s\n", sf_strerror(self->recfile));
1996
Server_stop_rec(Server *self, PyObject *args)
1999
sf_close(self->recfile);
2006
Server_addStream(Server *self, PyObject *args)
2010
if (! PyArg_ParseTuple(args, "O", &tmp))
2011
return PyInt_FromLong(-1);
2014
Server_error(self, "Need a pyo object as argument\n");
2015
return PyInt_FromLong(-1);
2019
PyList_Append(self->streams, tmp);
2021
self->stream_count++;
2028
Server_removeStream(Server *self, int id)
2033
for (i=0; i<self->stream_count; i++) {
2034
stream_tmp = (Stream *)PyList_GET_ITEM(self->streams, i);
2035
sid = Stream_getStreamId(stream_tmp);
2037
Server_debug(self, "Removed stream id %d\n", id);
2038
PySequence_DelItem(self->streams, i);
2039
self->stream_count--;
2047
Server_changeStreamPosition(Server *self, PyObject *args)
2049
int err, i, rsid, csid, sid;
2050
Stream *ref_stream_tmp, *cur_stream_tmp, *stream_tmp;
2052
if (! PyArg_ParseTuple(args, "OO", &ref_stream_tmp, &cur_stream_tmp))
2053
return PyInt_FromLong(-1);
2055
rsid = Stream_getStreamId(ref_stream_tmp);
2056
csid = Stream_getStreamId(cur_stream_tmp);
2058
for (i=0; i<self->stream_count; i++) {
2059
stream_tmp = (Stream *)PyList_GET_ITEM(self->streams, i);
2060
sid = Stream_getStreamId(stream_tmp);
2062
PySequence_DelItem(self->streams, i);
2063
self->stream_count--;
2068
for (i=0; i<self->stream_count; i++) {
2069
stream_tmp = (Stream *)PyList_GET_ITEM(self->streams, i);
2070
sid = Stream_getStreamId(stream_tmp);
2076
Py_INCREF(cur_stream_tmp);
2077
err = PyList_Insert(self->streams, i, (PyObject *)cur_stream_tmp);
2078
self->stream_count++;
2085
Server_getInputBuffer(Server *self) {
2086
return (MYFLT *)self->input_buffer;
2090
Server_getMidiEventBuffer(Server *self) {
2091
return (PmEvent *)self->midiEvents;
2095
Server_getMidiEventCount(Server *self) {
2096
return self->midi_count;
2100
Server_getSamplingRate(Server *self)
2102
return PyFloat_FromDouble(self->samplingRate);
2106
Server_getNchnls(Server *self)
2108
return PyInt_FromLong(self->nchnls);
2112
Server_getGlobalSeed(Server *self)
2114
return PyInt_FromLong(self->globalSeed);
2118
Server_getBufferSize(Server *self)
2120
return PyInt_FromLong(self->bufferSize);
2124
Server_getIsStarted(Server *self)
2126
return PyInt_FromLong(self->server_started);
2130
Server_getIsBooted(Server *self)
2132
return PyInt_FromLong(self->server_booted);
2136
Server_getMidiActive(Server *self)
2138
return PyInt_FromLong(self->withPortMidi);
2142
Server_getStreams(Server *self)
2144
Py_INCREF(self->streams);
2145
return self->streams;
2149
static PyMethodDef Server_methods[] = {
2150
{"setInputDevice", (PyCFunction)Server_setInputDevice, METH_O, "Sets audio input device."},
2151
{"setOutputDevice", (PyCFunction)Server_setOutputDevice, METH_O, "Sets audio output device."},
2152
{"setInOutDevice", (PyCFunction)Server_setInOutDevice, METH_O, "Sets both audio input and output device."},
2153
{"setMidiInputDevice", (PyCFunction)Server_setMidiInputDevice, METH_O, "Sets MIDI input device."},
2154
{"setSamplingRate", (PyCFunction)Server_setSamplingRate, METH_O, "Sets the server's sampling rate."},
2155
{"setBufferSize", (PyCFunction)Server_setBufferSize, METH_O, "Sets the server's buffer size."},
2156
{"setNchnls", (PyCFunction)Server_setNchnls, METH_O, "Sets the server's number of channels."},
2157
{"setDuplex", (PyCFunction)Server_setDuplex, METH_O, "Sets the server's duplex mode (0 = only out, 1 = in/out)."},
2158
{"setGlobalSeed", (PyCFunction)Server_setGlobalSeed, METH_O, "Sets the server's global seed for random objects."},
2159
{"setAmp", (PyCFunction)Server_setAmp, METH_O, "Sets the overall amplitude."},
2160
{"setAmpCallable", (PyCFunction)Server_setAmpCallable, METH_O, "Sets the Server's GUI object."},
2161
{"setTimeCallable", (PyCFunction)Server_setTimeCallable, METH_O, "Sets the Server's TIME object."},
2162
{"setVerbosity", (PyCFunction)Server_setVerbosity, METH_O, "Sets the verbosity."},
2163
{"setStartOffset", (PyCFunction)Server_setStartOffset, METH_O, "Sets starting time offset."},
2164
{"boot", (PyCFunction)Server_boot, METH_NOARGS, "Setup and boot the server."},
2165
{"shutdown", (PyCFunction)Server_shut_down, METH_NOARGS, "Shut down the server."},
2166
{"start", (PyCFunction)Server_start, METH_NOARGS, "Starts the server's callback loop."},
2167
{"stop", (PyCFunction)Server_stop, METH_NOARGS, "Stops the server's callback loop."},
2168
{"recordOptions", (PyCFunction)Server_recordOptions, METH_VARARGS|METH_KEYWORDS, "Sets format settings for offline rendering and global recording."},
2169
{"recstart", (PyCFunction)Server_start_rec, METH_VARARGS|METH_KEYWORDS, "Start automatic output recording."},
2170
{"recstop", (PyCFunction)Server_stop_rec, METH_NOARGS, "Stop automatic output recording."},
2171
{"addStream", (PyCFunction)Server_addStream, METH_VARARGS, "Adds an audio stream to the server. \
2172
This is for internal use and must never be called by the user."},
2173
{"removeStream", (PyCFunction)Server_removeStream, METH_VARARGS, "Adds an audio stream to the server. \
2174
This is for internal use and must never be called by the user."},
2175
{"changeStreamPosition", (PyCFunction)Server_changeStreamPosition, METH_VARARGS, "Puts an audio stream before another in the stack. \
2176
This is for internal use and must never be called by the user."},
2177
{"getStreams", (PyCFunction)Server_getStreams, METH_NOARGS, "Returns the list of streams added to the server."},
2178
{"getSamplingRate", (PyCFunction)Server_getSamplingRate, METH_NOARGS, "Returns the server's sampling rate."},
2179
{"getNchnls", (PyCFunction)Server_getNchnls, METH_NOARGS, "Returns the server's current number of channels."},
2180
{"getGlobalSeed", (PyCFunction)Server_getGlobalSeed, METH_NOARGS, "Returns the server's global seed."},
2181
{"getBufferSize", (PyCFunction)Server_getBufferSize, METH_NOARGS, "Returns the server's buffer size."},
2182
{"getIsBooted", (PyCFunction)Server_getIsBooted, METH_NOARGS, "Returns 1 if the server is booted, otherwise returns 0."},
2183
{"getIsStarted", (PyCFunction)Server_getIsStarted, METH_NOARGS, "Returns 1 if the server is started, otherwise returns 0."},
2184
{"getMidiActive", (PyCFunction)Server_getMidiActive, METH_NOARGS, "Returns 1 if midi callback is active, otherwise returns 0."},
2185
{NULL} /* Sentinel */
2188
static PyMemberDef Server_members[] = {
2189
{"streams", T_OBJECT_EX, offsetof(Server, streams), 0, "Server's streams list."},
2190
{NULL} /* Sentinel */
2193
PyTypeObject ServerType = {
2194
PyObject_HEAD_INIT(NULL)
2196
"_pyo.Server", /*tp_name*/
2197
sizeof(Server), /*tp_basicsize*/
2199
(destructor)Server_dealloc, /*tp_dealloc*/
2206
0, /*tp_as_sequence*/
2207
0, /*tp_as_mapping*/
2214
Py_TPFLAGS_DEFAULT, /*tp_flags*/
2215
"Pyo Server object. Handles communication with Portaudio and processing callback loop.", /* tp_doc */
2216
(traverseproc)Server_traverse, /* tp_traverse */
2217
(inquiry)Server_clear, /* tp_clear */
2218
0, /* tp_richcompare */
2219
0, /* tp_weaklistoffset */
2221
0, /* tp_iternext */
2222
Server_methods, /* tp_methods */
2223
Server_members, /* tp_members */
2227
0, /* tp_descr_get */
2228
0, /* tp_descr_set */
2229
0, /* tp_dictoffset */
2230
(initproc)Server_init, /* tp_init */
2232
Server_new, /* tp_new */