コード例 #1
0
/* Write to the audio queue. */
int audio_queue_write(audio_queue_t *queue, void *data, apr_size_t *data_len)
{
	int status = 0;

	if ((queue == NULL) || (data == NULL) || (data_len == NULL))
		return -1;

	if (queue->mutex != NULL)
		apr_thread_mutex_lock(queue->mutex);

	if (audio_buffer_write(queue->buffer, data, *data_len) > 0) {
		queue->write_bytes = queue->write_bytes + *data_len;

		if (queue->waiting <= audio_buffer_inuse(queue->buffer)) {
			if (queue->cond != NULL)
				apr_thread_cond_signal(queue->cond);
		}
	} else {
		ast_log(LOG_WARNING, "(%s) Audio queue overflow!\n", queue->name);
		*data_len = 0;
		status = -1;
	}

	if (queue->mutex != NULL)
		apr_thread_mutex_unlock(queue->mutex);

	return status;
}
コード例 #2
0
ファイル: music.c プロジェクト: halflings/process-scheduler
void
play_music()
{
    uint32_t counter=0;
    LV2_Atom_Forge_Frame midi_seq_frame;
    int buffer_processed = 0;
    const Lv2Plugin *plugin;
    plugin = lv2_world->plugin_list;

    DISABLE_IRQ();

    lv2_port *output_left = new_lv2_port(lv2_audio_port, 1);
    lv2_port *output_right = new_lv2_port(lv2_audio_port, 2);
    lv2_port *midi_in = new_lv2_port(lv2_atom_port, 3);

    plugin->descriptor->connect_port(plugin->handle, midi_in->id, midi_in->buffer);
    plugin->descriptor->connect_port(plugin->handle, output_left->id, output_left->buffer);
    plugin->descriptor->connect_port(plugin->handle, output_right->id, output_right->buffer);

    lv2_atom_forge_set_buffer(&forge,
                              midi_in->buffer,
                              LV2_ATOM_BUFFER_SIZE);
    lv2_atom_forge_sequence_head(&forge, &midi_seq_frame, 0);
    
    init_midi_source(&forge);
    
    while (1) {

    DISABLE_IRQ();

        if (!buffer_processed) {
	  forge_midi_input();


            lv2_atom_forge_pop(&forge, &midi_seq_frame);

            plugin->descriptor->run(plugin->handle, LV2_AUDIO_BUFFER_SIZE);

            lv2_atom_forge_set_buffer(&forge,
                                      midi_in->buffer,
                                      sizeof(uint8_t) * midi_in->buffer_sz);
            lv2_atom_forge_sequence_head(&forge, &midi_seq_frame, 0);
            buffer_processed = 1;
        }

        if (buffer_processed && audio_buffer_free_space() > LV2_AUDIO_BUFFER_SIZE * 2) {
            audio_buffer_write(output_left->buffer, output_right->buffer, output_left->buffer_sz);
            buffer_processed = 0;
            counter++;
        }
	ENABLE_IRQ();
    }
}
コード例 #3
0
ファイル: pitracker.c プロジェクト: svrnuke/pixperiments
int32_t notmain (uint32_t earlypc) {
    hardware_init();
    int32_t samplerate = audio_init();
    Lv2World *lv2_world = lv2_init(samplerate);
    led_init();
    switch_init();

    printf("\r\nPiTracker console\r\n");
    printf("Samplerate: %d\r\n", samplerate);

    uint32_t inkey;
    uint32_t counter=0;
    LV2_Atom_Forge_Frame midi_seq_frame;
    int buffer_processed = 0;
    const Lv2Plugin *plugin;
    plugin = lv2_world->plugin_list;

    lv2_port *output_left = new_lv2_port(lv2_audio_port, 1);
    lv2_port *output_right = new_lv2_port(lv2_audio_port, 2);
    lv2_port *midi_in = new_lv2_port(lv2_atom_port, 3);

    plugin->descriptor->connect_port(plugin->handle, midi_in->id, midi_in->buffer);
    plugin->descriptor->connect_port(plugin->handle, output_left->id, output_left->buffer);
    plugin->descriptor->connect_port(plugin->handle, output_right->id, output_right->buffer);

    lv2_atom_forge_set_buffer(&forge,
                              midi_in->buffer,
                              LV2_ATOM_BUFFER_SIZE);
    lv2_atom_forge_sequence_head(&forge, &midi_seq_frame, 0);
    
    init_midi_source(&forge);
    
    while (1) {
#ifdef DEBUG
        if(kbhit()) {
            inkey = readch();
            //printf("%x", inkey);
            switch(inkey) {
                case 0x03:
#ifdef RASPBERRY_PI
                    printf("Rebooting\r\n");
                    usleep(2);
                    reboot();
#else
                    printf("Exiting\r\n");
                    close_keyboard();
                    exit(0);
#endif
                    break;
                case 0x31:
                    if (plugin->next) plugin = plugin->next;
                    else plugin = lv2_world->plugin_list;
                    plugin->descriptor->connect_port(plugin->handle, midi_in->id, midi_in->buffer);
                    plugin->descriptor->connect_port(plugin->handle, output_left->id, output_left->buffer);
                    plugin->descriptor->connect_port(plugin->handle, output_right->id, output_right->buffer);
                    break;
                case 0x0d:
                    printf("\r\n");
                    break;
                default:
                    putc(inkey, stdout);
#ifdef LINUX
                    fflush(stdout);
#endif
                    break;
            }
        }
#endif

        if (!buffer_processed) {
            forge_midi_input();

            lv2_atom_forge_pop(&forge, &midi_seq_frame);
            plugin->descriptor->run(plugin->handle, LV2_AUDIO_BUFFER_SIZE);
            lv2_atom_forge_set_buffer(&forge,
                                      midi_in->buffer,
                                      sizeof(uint8_t) * midi_in->buffer_sz);
            lv2_atom_forge_sequence_head(&forge, &midi_seq_frame, 0);
            buffer_processed = 1;
        }

        if (buffer_processed && audio_buffer_free_space() > LV2_AUDIO_BUFFER_SIZE * 2) {
            audio_buffer_write(output_left->buffer, output_right->buffer, output_left->buffer_sz);
            buffer_processed = 0;
            counter++;
        }
    }
}