/[svn]/linuxsampler/tags/start/midiin.cpp
ViewVC logotype

Annotation of /linuxsampler/tags/start/midiin.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6 - (hide annotations) (download)
Sat Oct 25 20:24:32 2003 UTC (20 years, 6 months ago) by (unknown author)
File size: 4826 byte(s)
This commit was manufactured by cvs2svn to create tag 'start'.
1 schoenebeck 5 /***************************************************************************
2     * *
3     * LinuxSampler - modular, streaming capable sampler *
4     * *
5     * Copyright (C) 2003 by Benno Senoner and Christian Schoenebeck *
6     * *
7     * This program 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 2 of the License, or *
10     * (at your option) any later version. *
11     * *
12     * This program 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. *
16     * *
17     * You should have received a copy of the GNU General Public License *
18     * along with this program; if not, write to the Free Software *
19     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
20     * MA 02111-1307 USA *
21     ***************************************************************************/
22    
23     #include "midiin.h"
24    
25     MidiIn::MidiIn(AudioThread* pAudioThread) : Thread(true, 1, -1) {
26     this->pAudioThread = pAudioThread;
27     memset(MIDIControllerTable, 0x00, 128); // set all controller values to zero
28     }
29    
30     MidiIn::~MidiIn() {
31     close_alsa_midi_seq();
32     }
33    
34     int MidiIn::open_alsa_midi_seq(void) {
35    
36     int portid;
37    
38     if (snd_seq_open(&seq_handle, "default", SND_SEQ_OPEN_INPUT, 0) < 0) {
39     fprintf(stderr, "Error opening ALSA sequencer.\n");
40     exit(1);
41     }
42     snd_seq_set_client_name(seq_handle, "LinuxSampler");
43     if ((portid = snd_seq_create_simple_port(seq_handle, "LinuxSampler",
44     SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE,
45     SND_SEQ_PORT_TYPE_APPLICATION)) < 0) {
46     fprintf(stderr, "Error creating sequencer port.\n");
47     exit(1);
48     }
49     return 0;
50     }
51    
52     void MidiIn::close_alsa_midi_seq(void) {
53     }
54    
55     int MidiIn::Main() {
56    
57     int res = open_alsa_midi_seq();
58     if (res < 0) {
59     fprintf(stderr,"opening of MIDI in device failed, exiting.\n");
60     exit(1);
61     }
62    
63     int npfd;
64     struct pollfd *pfd;
65     snd_seq_event_t *ev;
66    
67     npfd = snd_seq_poll_descriptors_count(seq_handle, POLLIN);
68     pfd = (struct pollfd *)alloca(npfd * sizeof(struct pollfd));
69     snd_seq_poll_descriptors(seq_handle, pfd, npfd, POLLIN);
70     while (true) {
71     if (poll(pfd, npfd, 100000) > 0) {
72    
73     do {
74     snd_seq_event_input(seq_handle, &ev);
75    
76     switch (ev->type) {
77     case SND_SEQ_EVENT_CONTROLLER:
78     fprintf(stderr, "Control event on Channel %2d: %5d \n",
79     ev->data.control.channel, ev->data.control.value);
80     break;
81    
82     case SND_SEQ_EVENT_PITCHBEND:
83     fprintf(stderr, "Pitchbender event on Channel %2d: %5d \n",
84     ev->data.control.channel, ev->data.control.value);
85     break;
86    
87     case SND_SEQ_EVENT_NOTEON:
88     fprintf(stderr, "Note On event on Channel %2d: note=%5d velocity=%d \n",
89     ev->data.control.channel, ev->data.note.note, ev->data.note.velocity);
90     if (ev->data.note.velocity != 0) {
91     pAudioThread->ProcessNoteOn(ev->data.note.note, ev->data.note.velocity);
92     }
93     else {
94     pAudioThread->ProcessNoteOff(ev->data.note.note, 0);
95     }
96     break;
97    
98     case SND_SEQ_EVENT_NOTEOFF:
99     fprintf(stderr, "Note Off event on Channel %2d: note=%5d velocity=%d \n",
100     ev->data.control.channel, ev->data.note.note, ev->data.note.velocity);
101     pAudioThread->ProcessNoteOff(ev->data.note.note, ev->data.note.velocity);
102     break;
103     }
104     snd_seq_free_event(ev);
105     } while (snd_seq_event_input_pending(seq_handle, 0) > 0);
106     } // end of if(poll...)
107     } // end of while
108     }

  ViewVC Help
Powered by ViewVC