annotate libaf/af_export.c @ 11330:a974c00c779d

Removed temporary .cpp file used during the Matroska test. Updated the libebml and libmatroska requirements to at least v0.6.0 for both. There have been changes in the lacing code, and users WILL come and complain why mplayer, linked against older versions, will have issues playing newer files.
author mosu
date Thu, 30 Oct 2003 14:57:06 +0000
parents dcca52fe32bd
children 2f30dad6f490
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
1 /* This audio filter exports the incomming signal to other processes
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
2 using memory mapping. Memory mapped area contains a header:
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
3 int nch,
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
4 int size,
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
5 unsigned long long counter (updated every time the contents of
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
6 the area changes),
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
7 the rest is payload (non-interleaved).
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
8 */
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
9
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
10 #include <stdio.h>
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
11 #include <stdlib.h>
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
12 #include <string.h>
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
13 #include <inttypes.h>
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
14 #include <unistd.h>
10908
dcca52fe32bd disable af export for systems without mmap
faust3
parents: 10892
diff changeset
15 #include "../config.h"
dcca52fe32bd disable af export for systems without mmap
faust3
parents: 10892
diff changeset
16
dcca52fe32bd disable af export for systems without mmap
faust3
parents: 10892
diff changeset
17 #ifdef HAVE_SYS_MMAN_H
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
18 #include <sys/types.h>
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
19 #include <sys/mman.h>
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
20 #include <sys/types.h>
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
21 #include <sys/stat.h>
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
22 #include <fcntl.h>
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
23
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
24 #include "af.h"
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
25
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
26 extern char * get_path( char * filename );
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
27
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
28
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
29 #define DEF_SZ 512 // default buffer size (in samples)
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
30 #define SHARED_FILE "mplayer-af_export" /* default file name
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
31 (relative to ~/.mplayer/ */
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
32
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
33 #define SIZE_HEADER (2 * sizeof(int) + sizeof(unsigned long long))
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
34
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
35 // Data for specific instances of this filter
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
36 typedef struct af_export_s
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
37 {
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
38 unsigned long long count; // Used for sync
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
39 void* buf[AF_NCH]; // Buffers for storing the data before it is exported
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
40 int sz; // Size of buffer in samples
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
41 int wi; // Write index
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
42 int fd; // File descriptor to shared memory area
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
43 char* filename; // File to export data
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
44 void* mmap_area; // MMap shared area
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
45 } af_export_t;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
46
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
47
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
48 /* Initialization and runtime control
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
49 af audio filter instance
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
50 cmd control command
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
51 arg argument
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
52 */
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
53 static int control(struct af_instance_s* af, int cmd, void* arg)
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
54 {
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
55 af_export_t* s = af->setup;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
56 switch (cmd){
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
57 case AF_CONTROL_REINIT:{
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
58 int i=0;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
59 int mapsize;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
60
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
61 // Free previous buffers
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
62 if (s->buf && s->buf[0])
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
63 free(s->buf[0]);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
64
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
65 // unmap previous area
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
66 if(s->mmap_area)
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
67 munmap(s->mmap_area, SIZE_HEADER + (af->data->bps*s->sz*af->data->nch));
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
68 // close previous file descriptor
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
69 if(s->fd)
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
70 close(s->fd);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
71
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
72 // Accept only int16_t as input fomat (which sucks)
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
73 af->data->rate = ((af_data_t*)arg)->rate;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
74 af->data->nch = ((af_data_t*)arg)->nch;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
75 af->data->format = AF_FORMAT_SI | AF_FORMAT_NE;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
76 af->data->bps = 2;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
77
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
78 // If buffer length isn't set, set it to the default value
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
79 if(s->sz == 0)
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
80 s->sz = DEF_SZ;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
81
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
82 // Allocate new buffers (as one continous block)
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
83 s->buf[0] = calloc(DEF_SZ*af->data->nch, af->data->bps);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
84 if(NULL == s->buf[0])
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
85 af_msg(AF_MSG_FATAL, "[export] Out of memory\n");
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
86 for(i = 1; i < af->data->nch; i++)
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
87 s->buf[i] = s->buf[0] + i*DEF_SZ*af->data->bps;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
88
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
89 // Init memory mapping
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
90 s->fd = open(s->filename, O_RDWR | O_CREAT | O_TRUNC, 0640);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
91 af_msg(AF_MSG_INFO, "[export] Exporting to file: %s\n", s->filename);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
92 if(s->fd < 0)
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
93 af_msg(AF_MSG_FATAL, "[export] Could not open/create file: %s\n",
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
94 s->filename);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
95
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
96 // header + buffer
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
97 mapsize = (SIZE_HEADER + (af->data->bps * s->sz * af->data->nch));
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
98
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
99 // grow file to needed size
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
100 for(i = 0; i < mapsize; i++){
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
101 char null = 0;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
102 write(s->fd, (void*) &null, 1);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
103 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
104
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
105 // mmap size
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
106 s->mmap_area = mmap(0, mapsize, PROT_READ|PROT_WRITE,MAP_SHARED, s->fd, 0);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
107 if(s->mmap_area == NULL)
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
108 af_msg(AF_MSG_FATAL, "[export] Could not mmap file %s\n", s->filename);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
109 af_msg(AF_MSG_INFO, "[export] Memory mapped to file: %s (%p)\n",
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
110 s->filename, s->mmap_area);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
111
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
112 // Initialize header
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
113 *((int*)s->mmap_area) = af->data->nch;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
114 *((int*)s->mmap_area + 1) = s->sz * af->data->bps * af->data->nch;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
115 msync(s->mmap_area, mapsize, MS_ASYNC);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
116
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
117 // Use test_output to return FALSE if necessary
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
118 return af_test_output(af, (af_data_t*)arg);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
119 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
120 case AF_CONTROL_COMMAND_LINE:{
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
121 int i=0;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
122 char *str = arg;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
123
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
124 if (!str){
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
125 if(s->filename)
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
126 free(s->filename);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
127
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
128 s->filename = get_path(SHARED_FILE);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
129 return AF_OK;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
130 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
131
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
132 while((str[i]) && (str[i] != ':'))
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
133 i++;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
134
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
135 if(s->filename)
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
136 free(s->filename);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
137
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
138 s->filename = calloc(i + 1, sizeof(char));
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
139 memcpy(s->filename, str, i);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
140 s->filename[i] = 0;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
141
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
142 sscanf(str + i, "%d", &(s->sz));
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
143
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
144 return af->control(af, AF_CONTROL_EXPORT_SZ | AF_CONTROL_SET, &s->sz);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
145 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
146 case AF_CONTROL_EXPORT_SZ | AF_CONTROL_SET:
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
147 s->sz = * (int *) arg;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
148 if((s->sz <= 0) || (s->sz > 2048))
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
149 af_msg( AF_MSG_ERROR, "[export] Buffer size must be between"
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
150 " 1 and 2048\n" );
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
151
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
152 return AF_OK;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
153 case AF_CONTROL_EXPORT_SZ | AF_CONTROL_GET:
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
154 *(int*) arg = s->sz;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
155 return AF_OK;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
156
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
157 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
158 return AF_UNKNOWN;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
159 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
160
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
161 /* Free allocated memory and clean up other stuff too.
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
162 af audio filter instance
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
163 */
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
164 static void uninit( struct af_instance_s* af )
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
165 {
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
166 int i;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
167 if (af->data){
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
168 free(af->data);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
169 af->data = NULL;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
170 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
171
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
172 if(af->setup){
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
173 af_export_t* s = af->setup;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
174 if (s->buf && s->buf[0])
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
175 free(s->buf[0]);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
176
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
177 // Free mmaped area
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
178 if(s->mmap_area)
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
179 munmap(s->mmap_area, sizeof(af_export_t));
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
180
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
181 if(s->fd > -1)
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
182 close(s->fd);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
183
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
184 if(s->filename)
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
185 free(s->filename);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
186
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
187 free(af->setup);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
188 af->setup = NULL;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
189 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
190 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
191
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
192 /* Filter data through filter
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
193 af audio filter instance
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
194 data audio data
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
195 */
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
196 static af_data_t* play( struct af_instance_s* af, af_data_t* data )
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
197 {
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
198 af_data_t* c = data; // Current working data
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
199 af_export_t* s = af->setup; // Setup for this instance
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
200 int16_t* a = c->audio; // Incomming sound
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
201 int nch = c->nch; // Number of channels
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
202 int len = c->len/c->bps; // Number of sample in data chunk
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
203 int sz = s->sz; // buffer size (in samples)
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
204 int flag = 0; // Set to 1 if buffer is filled
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
205
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
206 int ch, i;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
207
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
208 // Fill all buffers
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
209 for(ch = 0; ch < nch; ch++){
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
210 int wi = s->wi; // Reset write index
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
211 int16_t* b = s->buf[ch]; // Current buffer
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
212
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
213 // Copy data to export buffers
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
214 for(i = ch; i < len; i += nch){
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
215 b[wi++] = a[i];
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
216 if(wi >= sz){ // Don't write outside the end of the buffer
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
217 flag = 1;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
218 break;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
219 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
220 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
221 s->wi = wi % s->sz;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
222 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
223
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
224 // Export buffer to mmaped area
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
225 if(flag){
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
226 // update buffer in mapped area
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
227 memcpy(s->mmap_area + SIZE_HEADER, s->buf[0], sz * c->bps * nch);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
228 s->count++; // increment counter (to sync)
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
229 memcpy(s->mmap_area + SIZE_HEADER - sizeof(s->count),
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
230 &(s->count), sizeof(s->count));
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
231 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
232
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
233 // We don't modify data, just export it
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
234 return data;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
235 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
236
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
237 /* Allocate memory and set function pointers
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
238 af audio filter instance
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
239 returns AF_OK or AF_ERROR
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
240 */
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
241 static int af_open( af_instance_t* af )
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
242 {
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
243 af->control = control;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
244 af->uninit = uninit;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
245 af->play = play;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
246 af->mul.n = 1;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
247 af->mul.d = 1;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
248 af->data = calloc(1, sizeof(af_data_t));
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
249 af->setup = calloc(1, sizeof(af_export_t));
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
250 if((af->data == NULL) || (af->setup == NULL))
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
251 return AF_ERROR;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
252
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
253 ((af_export_t *)af->setup)->filename = get_path(SHARED_FILE);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
254
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
255 return AF_OK;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
256 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
257
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
258 // Description of this filter
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
259 af_info_t af_info_export = {
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
260 "Sound export filter",
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
261 "export",
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
262 "Anders; Gustavo Sverzut Barbieri <gustavo.barbieri@ic.unicamp.br>",
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
263 "",
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
264 AF_FLAGS_REENTRANT,
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
265 af_open
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
266 };
10908
dcca52fe32bd disable af export for systems without mmap
faust3
parents: 10892
diff changeset
267
dcca52fe32bd disable af export for systems without mmap
faust3
parents: 10892
diff changeset
268 #endif /*HAVE_SYS_MMAN_H*/