~ubuntu-branches/ubuntu/trusty/jack-audio-connection-kit/trusty

« back to all changes in this revision

Viewing changes to jack/port.h

  • Committer: Bazaar Package Importer
  • Author(s): Luca Falavigna
  • Date: 2008-12-06 11:05:15 UTC
  • mfrom: (4.1.3 sid)
  • Revision ID: james.westby@ubuntu.com-20081206110515-xa9v9pajr9jqvfvg
Tags: 0.115.6-1ubuntu1
* Merge from Debian unstable, remaining Ubuntu changes:
  - Redirect stderr in bash completion (Debian #504488).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
    Copyright (C) 2001 Paul Davis
 
3
    
 
4
    This program is free software; you can redistribute it and/or modify
 
5
    it under the terms of the GNU Lesser General Public License as published by
 
6
    the Free Software Foundation; either version 2.1 of the License, or
 
7
    (at your option) any later version.
 
8
    
 
9
    This program is distributed in the hope that it will be useful,
 
10
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
12
    GNU Lesser General Public License for more details.
 
13
    
 
14
    You should have received a copy of the GNU Lesser General Public License
 
15
    along with this program; if not, write to the Free Software 
 
16
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
17
 
 
18
*/
 
19
 
 
20
#ifndef __jack_port_h__
 
21
#define __jack_port_h__
 
22
 
 
23
#include <pthread.h>
 
24
#include <jack/types.h>
 
25
#include <jack/jslist.h>
 
26
#include <jack/shm.h>
 
27
 
 
28
#define JACK_PORT_NAME_SIZE 256
 
29
#define JACK_PORT_TYPE_SIZE 32
 
30
 
 
31
/* The relatively low value of this constant reflects the fact that
 
32
 * JACK currently only knows about *2* port types.  (May 2006)
 
33
 *
 
34
 * Further, the 4 covers:
 
35
 *   - a single non-negotiated audio format
 
36
 *   - music data (ie. MIDI)
 
37
 *   - video
 
38
 *   - one other
 
39
 *
 
40
 * which is probably enough for more than just the foreseeable future.
 
41
 */              
 
42
#define JACK_MAX_PORT_TYPES 4
 
43
#define JACK_AUDIO_PORT_TYPE 0
 
44
#define JACK_MIDI_PORT_TYPE 1
 
45
 
 
46
/* these should probably go somewhere else, but not in <jack/types.h> */
 
47
#define JACK_CLIENT_NAME_SIZE 33
 
48
typedef uint32_t jack_client_id_t;
 
49
 
 
50
/* JACK shared memory segments are limited to MAX_INT32, they can be
 
51
 * shared between 32-bit and 64-bit clients. 
 
52
 */
 
53
#define JACK_SHM_MAX (MAX_INT32)
 
54
typedef int32_t jack_port_type_id_t;
 
55
 
 
56
#define JACK_BACKEND_ALIAS "system"
 
57
 
 
58
/* Port type structure.  
 
59
 *
 
60
 *  (1) One for each port type is part of the engine's jack_control_t
 
61
 *  shared memory structure.
 
62
 *
 
63
 *  (2) One for each port type is appended to the engine's
 
64
 *  jack_client_connect_result_t response.  The client reads them into
 
65
 *  its local memory, using them to attach the corresponding shared
 
66
 *  memory segments.
 
67
 */
 
68
typedef struct _jack_port_type_info {
 
69
 
 
70
    jack_port_type_id_t ptype_id;
 
71
    const char     type_name[JACK_PORT_TYPE_SIZE];      
 
72
 
 
73
    /* If == 1, then a buffer to handle nframes worth of data has
 
74
     * sizeof(jack_default_audio_sample_t) * nframes bytes.  
 
75
     *
 
76
     * If > 1, the buffer allocated for input mixing will be
 
77
     * this value times sizeof(jack_default_audio_sample_t)
 
78
     * * nframes bytes in size.  For non-audio data types,
 
79
     * it may have a different value.
 
80
     *
 
81
     * If < 0, the value should be ignored, and buffer_size
 
82
     * should be used.
 
83
     */
 
84
    int32_t buffer_scale_factor;
 
85
 
 
86
    /* ignored unless buffer_scale_factor is < 0. see above */
 
87
    jack_shmsize_t buffer_size;
 
88
 
 
89
    jack_shm_registry_index_t shm_registry_index;
 
90
 
 
91
    jack_shmsize_t zero_buffer_offset;
 
92
 
 
93
} jack_port_type_info_t;
 
94
 
 
95
/* Allocated by the engine in shared memory. */
 
96
typedef struct _jack_port_shared {
 
97
 
 
98
    jack_port_type_id_t      ptype_id;  /* index into port type array */
 
99
    jack_shmsize_t           offset;    /* buffer offset in shm segment */
 
100
    jack_port_id_t           id;        /* index into engine port array */
 
101
    enum JackPortFlags       flags;    
 
102
    char                     name[JACK_CLIENT_NAME_SIZE+JACK_PORT_NAME_SIZE];
 
103
    char                     alias1[JACK_CLIENT_NAME_SIZE+JACK_PORT_NAME_SIZE];
 
104
    char                     alias2[JACK_CLIENT_NAME_SIZE+JACK_PORT_NAME_SIZE];
 
105
    jack_client_id_t         client_id; /* who owns me */
 
106
 
 
107
    volatile jack_nframes_t  latency;
 
108
    volatile jack_nframes_t  total_latency;
 
109
    volatile uint8_t         monitor_requests;
 
110
 
 
111
    char                     has_mixdown; /* port has a mixdown function */
 
112
    char                     in_use;
 
113
    char                     unused; /* legacy locked field */
 
114
 
 
115
} jack_port_shared_t;
 
116
 
 
117
typedef struct _jack_port_functions {
 
118
 
 
119
    /* Function to initialize port buffer. Cannot be NULL.
 
120
     * NOTE: This must take a buffer rather than jack_port_t as it is called
 
121
     * in jack_engine_place_buffers() before any port creation.
 
122
     * A better solution is to make jack_engine_place_buffers to be type-specific,
 
123
     * but this works.
 
124
     */
 
125
    void (*buffer_init)(void *buffer, size_t size, jack_nframes_t);
 
126
 
 
127
    /* Function to mixdown multiple inputs to a buffer.  Can be NULL,
 
128
     * indicating that multiple input connections are not legal for
 
129
     * this data type. 
 
130
     */
 
131
    void (*mixdown)(jack_port_t *, jack_nframes_t);
 
132
 
 
133
} jack_port_functions_t;
 
134
 
 
135
/**
 
136
 * Get port functions.
 
137
 * @param ptid port type id.
 
138
 *
 
139
 * @return pointer to port type functions or NULL if port type is unknown.
 
140
 */
 
141
/*const*/ jack_port_functions_t *
 
142
jack_get_port_functions(jack_port_type_id_t ptid);
 
143
 
 
144
 
 
145
/* Allocated by the client in local memory. */
 
146
struct _jack_port {
 
147
    void                    **client_segment_base;
 
148
    void                     *mix_buffer;
 
149
    jack_port_type_info_t    *type_info; /* shared memory type info */
 
150
    struct _jack_port_shared *shared;    /* corresponding shm struct */
 
151
    struct _jack_port        *tied;      /* locally tied source port */
 
152
    jack_port_functions_t    fptr;
 
153
    pthread_mutex_t          connection_lock;
 
154
    JSList                   *connections;
 
155
};
 
156
 
 
157
/*  Inline would be cleaner, but it needs to be fast even in
 
158
 *  non-optimized code.  jack_output_port_buffer() only handles output
 
159
 *  ports.  jack_port_buffer() works for both input and output ports.
 
160
 */
 
161
#define jack_port_buffer(p) \
 
162
  ((void *) ((p)->mix_buffer? (p)->mix_buffer: \
 
163
   *(p)->client_segment_base + (p)->shared->offset))
 
164
#define jack_output_port_buffer(p) \
 
165
  ((void *) (*(p)->client_segment_base + (p)->shared->offset))
 
166
 
 
167
#endif /* __jack_port_h__ */
 
168