4a3fe6ca0d69a7ddd3fce8e07b1c1b9fa6a4c943
[vlc.git] / modules / audio_output / adummy.c
1 /*****************************************************************************
2  * adummy.c : dummy audio output plugin
3  *****************************************************************************
4  * Copyright (C) 2002 VLC authors and VideoLAN
5  *
6  * Authors: Christophe Massiot <massiot@via.ecp.fr>
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU Lesser General Public License as published by
10  * the Free Software Foundation; either version 2.1 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
21  *****************************************************************************/
22
23 #ifdef HAVE_CONFIG_H
24 # include "config.h"
25 #endif
26
27 #include <vlc_common.h>
28 #include <vlc_plugin.h>
29 #include <vlc_aout.h>
30 #include <vlc_cpu.h>
31
32 static int Open(vlc_object_t *);
33 static void Close(vlc_object_t *);
34
35 vlc_module_begin ()
36     set_shortname( N_("Dummy") )
37     set_description( N_("Dummy audio output") )
38     set_capability( "audio output", 0 )
39     set_callbacks( Open, Close )
40     add_shortcut( "dummy" )
41 vlc_module_end ()
42
43 #define A52_FRAME_NB 1536
44
45 struct aout_sys
46 {
47     vlc_tick_t first_play_date;
48     vlc_tick_t length;
49 };
50
51 static int TimeGet(audio_output_t *aout, vlc_tick_t *restrict delay)
52 {
53     struct aout_sys *sys = aout->sys;
54
55     if (unlikely(sys->first_play_date == VLC_TICK_INVALID))
56     {
57         *delay = 0;
58         return 0;
59     }
60
61     vlc_tick_t time_since_first_play = vlc_tick_now() - sys->first_play_date;
62     assert(time_since_first_play >= 0);
63
64     if (likely(sys->length > time_since_first_play))
65     {
66         *delay = sys->length - time_since_first_play;
67         return 0;
68     }
69
70     msg_Warn(aout, "underflow");
71     return -1;
72 }
73
74 static void Play(audio_output_t *aout, block_t *block, vlc_tick_t date)
75 {
76     struct aout_sys *sys = aout->sys;
77
78     if (unlikely(sys->first_play_date == VLC_TICK_INVALID))
79         sys->first_play_date = vlc_tick_now();
80     sys->length += block->i_length;
81
82     block_Release( block );
83     (void) date;
84 }
85
86 static void Pause(audio_output_t *aout, bool paused, vlc_tick_t date)
87 {
88     (void) aout; (void) paused; (void) date;
89 }
90
91 static void Flush(audio_output_t *aout)
92 {
93     struct aout_sys *sys = aout->sys;
94
95     sys->first_play_date = VLC_TICK_INVALID;
96     sys->length = 0;
97 }
98
99 static int Start(audio_output_t *aout, audio_sample_format_t *restrict fmt)
100 {
101     (void) aout;
102
103     switch (fmt->i_format)
104     {
105         case VLC_CODEC_A52:
106         case VLC_CODEC_EAC3:
107             fmt->i_format = VLC_CODEC_SPDIFL;
108             fmt->i_bytes_per_frame = 4;
109             fmt->i_frame_length = 1;
110             break;
111         case VLC_CODEC_DTS:
112         case VLC_CODEC_TRUEHD:
113         case VLC_CODEC_MLP:
114             fmt->i_format = VLC_CODEC_SPDIFL;
115             fmt->i_rate = 768000;
116             fmt->i_bytes_per_frame = 16;
117             fmt->i_frame_length = 1;
118             break;
119         default:
120             assert(AOUT_FMT_LINEAR(fmt));
121             assert(aout_FormatNbChannels(fmt) > 0);
122             fmt->i_format = HAVE_FPU ? VLC_CODEC_FL32 : VLC_CODEC_S16N;
123             fmt->channel_type = AUDIO_CHANNEL_TYPE_BITMAP;
124             break;
125     }
126
127     return VLC_SUCCESS;
128 }
129
130 static void Stop(audio_output_t *aout)
131 {
132     (void) aout;
133 }
134
135 static void Close(vlc_object_t *obj)
136 {
137     audio_output_t *aout = (audio_output_t *)obj;
138     free(aout->sys);
139 }
140
141 static int Open(vlc_object_t *obj)
142 {
143     audio_output_t *aout = (audio_output_t *)obj;
144
145     struct aout_sys *sys = aout->sys = malloc(sizeof(*sys));
146     if (!sys)
147         return VLC_ENOMEM;
148     sys->first_play_date = VLC_TICK_INVALID;
149     sys->length = 0;
150
151     aout->start = Start;
152     aout->time_get = TimeGet;
153     aout->play = Play;
154     aout->pause = Pause;
155     aout->flush = Flush;
156     aout->stop = Stop;
157     aout->volume_set = NULL;
158     aout->mute_set = NULL;
159     return VLC_SUCCESS;
160 }