annotate libaf/af_export.c @ 35418:cedb0ba2b5c6

Move the code to set guiInfo's Track, Chapter and Angle start values. Set them before checking whether there is any media opened, because with no media opened we clear the counters.
author ib
date Thu, 29 Nov 2012 14:11:03 +0000
parents 7077d1aed027
children 4eedc654175d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28229
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
1 /*
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
2 * This audio filter exports the incoming signal to other processes
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
3 * using memory mapping. The memory mapped area contains a header:
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
4 * int nch,
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
5 * int size,
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
6 * unsigned long long counter (updated every time the contents of
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
7 * the area changes),
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
8 * the rest is payload (non-interleaved).
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
9 *
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
10 * This file is part of MPlayer.
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
11 *
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
12 * MPlayer is free software; you can redistribute it and/or modify
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
13 * it under the terms of the GNU General Public License as published by
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
14 * the Free Software Foundation; either version 2 of the License, or
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
15 * (at your option) any later version.
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
16 *
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
17 * MPlayer is distributed in the hope that it will be useful,
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
20 * GNU General Public License for more details.
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
21 *
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
22 * You should have received a copy of the GNU General Public License along
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
23 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
72d0b1444141 Replace informal license notices by standard license header
diego
parents: 26181
diff changeset
25 */
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
26
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
27 #include <stdio.h>
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
28 #include <stdlib.h>
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
29 #include <string.h>
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
30 #include <inttypes.h>
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
31 #include <unistd.h>
16982
a9da2db9eb16 Unify include paths by adding -I.. to CFLAGS.
diego
parents: 14245
diff changeset
32 #include "config.h"
10908
dcca52fe32bd disable af export for systems without mmap
faust3
parents: 10892
diff changeset
33
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
34 #include <sys/types.h>
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
35 #include <sys/mman.h>
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
36 #include <sys/types.h>
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
37 #include <sys/stat.h>
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
38 #include <fcntl.h>
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
39
34174
a93891202051 Add missing mp_msg.h #includes, remove some unnecessary ones.
diego
parents: 32537
diff changeset
40 #include "mp_msg.h"
a93891202051 Add missing mp_msg.h #includes, remove some unnecessary ones.
diego
parents: 32537
diff changeset
41 #include "path.h"
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
42 #include "af.h"
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
43
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
44 #define DEF_SZ 512 // default buffer size (in samples)
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
45 #define SHARED_FILE "mplayer-af_export" /* default file name
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
46 (relative to ~/.mplayer/ */
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 #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
49
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
50 // Data for specific instances of this filter
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
51 typedef struct af_export_s
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 unsigned long long count; // Used for sync
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
54 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
55 int sz; // Size of buffer in samples
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
56 int wi; // Write index
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
57 int fd; // File descriptor to shared memory area
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
58 char* filename; // File to export data
31542
683818e5430d Avoid void *-arithmentic warnings.
reimar
parents: 30901
diff changeset
59 uint8_t *mmap_area; // MMap shared area
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
60 } af_export_t;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
61
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
62
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
63 /* Initialization and runtime control
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
64 af audio filter instance
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
65 cmd control command
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
66 arg argument
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
67 */
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
68 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
69 {
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
70 af_export_t* s = af->setup;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
71 switch (cmd){
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
72 case AF_CONTROL_REINIT:{
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
73 int i=0;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
74 int mapsize;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
75
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
76 // Free previous buffers
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 31542
diff changeset
77 if (s->buf)
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
78 free(s->buf[0]);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
79
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
80 // unmap previous area
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
81 if(s->mmap_area)
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
82 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
83 // close previous file descriptor
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
84 if(s->fd)
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
85 close(s->fd);
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
86
11529
2f30dad6f490 minor fixes by ed@catmur.co.uk
alex
parents: 10908
diff changeset
87 // Accept only int16_t as input format (which sucks)
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
88 af->data->rate = ((af_data_t*)arg)->rate;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
89 af->data->nch = ((af_data_t*)arg)->nch;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 11529
diff changeset
90 af->data->format = AF_FORMAT_S16_NE;
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
91 af->data->bps = 2;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
92
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
93 // 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
94 if(s->sz == 0)
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
95 s->sz = DEF_SZ;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
96
11529
2f30dad6f490 minor fixes by ed@catmur.co.uk
alex
parents: 10908
diff changeset
97 // Allocate new buffers (as one continuous block)
2f30dad6f490 minor fixes by ed@catmur.co.uk
alex
parents: 10908
diff changeset
98 s->buf[0] = calloc(s->sz*af->data->nch, af->data->bps);
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
99 if(NULL == s->buf[0])
29049
8c706ce21c6f Remove af_msg special-casing API in libaf.
bircoph
parents: 28229
diff changeset
100 mp_msg(MSGT_AFILTER, MSGL_FATAL, "[export] Out of memory\n");
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
101 for(i = 1; i < af->data->nch; i++)
31542
683818e5430d Avoid void *-arithmentic warnings.
reimar
parents: 30901
diff changeset
102 s->buf[i] = (uint8_t *)s->buf[0] + i*s->sz*af->data->bps;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
103
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
104 // Init memory mapping
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
105 s->fd = open(s->filename, O_RDWR | O_CREAT | O_TRUNC, 0640);
29049
8c706ce21c6f Remove af_msg special-casing API in libaf.
bircoph
parents: 28229
diff changeset
106 mp_msg(MSGT_AFILTER, MSGL_INFO, "[export] Exporting to file: %s\n", s->filename);
35310
7077d1aed027 Abort when opening the file failed instead of calling
reimar
parents: 34174
diff changeset
107 if(s->fd < 0) {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
108 mp_msg(MSGT_AFILTER, MSGL_FATAL, "[export] Could not open/create file: %s\n",
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
109 s->filename);
35310
7077d1aed027 Abort when opening the file failed instead of calling
reimar
parents: 34174
diff changeset
110 return AF_ERROR;
7077d1aed027 Abort when opening the file failed instead of calling
reimar
parents: 34174
diff changeset
111 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
112
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
113 // header + buffer
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
114 mapsize = (SIZE_HEADER + (af->data->bps * s->sz * af->data->nch));
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
115
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
116 // grow file to needed size
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
117 for(i = 0; i < mapsize; i++){
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
118 char null = 0;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
119 write(s->fd, (void*) &null, 1);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
120 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
121
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
122 // mmap size
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
123 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
124 if(s->mmap_area == NULL)
29049
8c706ce21c6f Remove af_msg special-casing API in libaf.
bircoph
parents: 28229
diff changeset
125 mp_msg(MSGT_AFILTER, MSGL_FATAL, "[export] Could not mmap file %s\n", s->filename);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
126 mp_msg(MSGT_AFILTER, MSGL_INFO, "[export] Memory mapped to file: %s (%p)\n",
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
127 s->filename, s->mmap_area);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
128
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
129 // Initialize header
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
130 *((int*)s->mmap_area) = af->data->nch;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
131 *((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
132 msync(s->mmap_area, mapsize, MS_ASYNC);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
133
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
134 // Use test_output to return FALSE if necessary
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
135 return af_test_output(af, (af_data_t*)arg);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
136 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
137 case AF_CONTROL_COMMAND_LINE:{
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
138 int i=0;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
139 char *str = arg;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
140
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
141 if (!str){
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 31542
diff changeset
142 free(s->filename);
10892
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 s->filename = get_path(SHARED_FILE);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
145 return AF_OK;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
146 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
147
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
148 while((str[i]) && (str[i] != ':'))
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
149 i++;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
150
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 31542
diff changeset
151 free(s->filename);
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
152
18858
ac17673b640d gets ride of a few more sizeof(char)s
reynaldo
parents: 16982
diff changeset
153 s->filename = calloc(i + 1, 1);
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
154 memcpy(s->filename, str, i);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
155 s->filename[i] = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
156
11529
2f30dad6f490 minor fixes by ed@catmur.co.uk
alex
parents: 10908
diff changeset
157 sscanf(str + i + 1, "%d", &(s->sz));
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
158
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
159 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
160 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
161 case AF_CONTROL_EXPORT_SZ | AF_CONTROL_SET:
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
162 s->sz = * (int *) arg;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
163 if((s->sz <= 0) || (s->sz > 2048))
29049
8c706ce21c6f Remove af_msg special-casing API in libaf.
bircoph
parents: 28229
diff changeset
164 mp_msg(MSGT_AFILTER, MSGL_ERR, "[export] Buffer size must be between"
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
165 " 1 and 2048\n" );
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
166
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
167 return AF_OK;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
168 case AF_CONTROL_EXPORT_SZ | AF_CONTROL_GET:
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
169 *(int*) arg = s->sz;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
170 return AF_OK;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
171
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
172 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
173 return AF_UNKNOWN;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
174 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
175
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
176 /* Free allocated memory and clean up other stuff too.
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
177 af audio filter instance
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
178 */
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
179 static void uninit( struct af_instance_s* af )
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
180 {
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 31542
diff changeset
181 free(af->data);
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 31542
diff changeset
182 af->data = NULL;
10892
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(af->setup){
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
185 af_export_t* s = af->setup;
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 31542
diff changeset
186 if (s->buf)
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
187 free(s->buf[0]);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
188
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
189 // Free mmaped area
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
190 if(s->mmap_area)
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
191 munmap(s->mmap_area, sizeof(af_export_t));
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
192
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
193 if(s->fd > -1)
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
194 close(s->fd);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
195
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 31542
diff changeset
196 free(s->filename);
10892
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 free(af->setup);
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
199 af->setup = NULL;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
200 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
201 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
202
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
203 /* Filter data through filter
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
204 af audio filter instance
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
205 data audio data
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
206 */
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
207 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
208 {
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
209 af_data_t* c = data; // Current working data
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
210 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
211 int16_t* a = c->audio; // Incomming sound
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
212 int nch = c->nch; // Number of channels
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
213 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
214 int sz = s->sz; // buffer size (in samples)
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
215 int flag = 0; // Set to 1 if buffer is filled
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
216
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
217 int ch, i;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
218
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
219 // Fill all buffers
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
220 for(ch = 0; ch < nch; ch++){
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
221 int wi = s->wi; // Reset write index
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
222 int16_t* b = s->buf[ch]; // Current buffer
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
223
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
224 // Copy data to export buffers
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
225 for(i = ch; i < len; i += nch){
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
226 b[wi++] = a[i];
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
227 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
228 flag = 1;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
229 break;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
230 }
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 s->wi = wi % s->sz;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
233 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
234
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
235 // Export buffer to mmaped area
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
236 if(flag){
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
237 // update buffer in mapped area
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
238 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
239 s->count++; // increment counter (to sync)
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
240 memcpy(s->mmap_area + SIZE_HEADER - sizeof(s->count),
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
241 &(s->count), sizeof(s->count));
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
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
244 // We don't modify data, just export it
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
245 return data;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
246 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
247
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
248 /* Allocate memory and set function pointers
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
249 af audio filter instance
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
250 returns AF_OK or AF_ERROR
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
251 */
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
252 static int af_open( af_instance_t* af )
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
253 {
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
254 af->control = control;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
255 af->uninit = uninit;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
256 af->play = play;
24888
b2402b4f0afa libaf: change filter input/output ratio calculations
uau
parents: 24242
diff changeset
257 af->mul=1;
10892
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
258 af->data = calloc(1, sizeof(af_data_t));
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
259 af->setup = calloc(1, sizeof(af_export_t));
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
260 if((af->data == NULL) || (af->setup == NULL))
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
261 return AF_ERROR;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
262
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
263 ((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
264
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
265 return AF_OK;
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
266 }
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
267
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
268 // Description of this filter
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
269 af_info_t af_info_export = {
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
270 "Sound export filter",
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
271 "export",
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
272 "Anders; Gustavo Sverzut Barbieri <gustavo.barbieri@ic.unicamp.br>",
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
273 "",
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
274 AF_FLAGS_REENTRANT,
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
275 af_open
2167ac4c1d72 Adding filter for exporting audio data to visual effect applications
anders
parents:
diff changeset
276 };