Mercurial > mplayer.hg
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 |
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 | 15 #include "../config.h" |
16 | |
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 | 267 |
268 #endif /*HAVE_SYS_MMAN_H*/ |