1 /*****************************************************************************
2 * player_aout.c: Player aout implementation
3 *****************************************************************************
4 * Copyright © 2018-2019 VLC authors and VideoLAN
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published by
8 * the Free Software Foundation; either version 2.1 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19 *****************************************************************************/
27 #include <vlc_common.h>
28 #include <vlc_decoder.h>
30 #include "input/resource.h"
32 #define vlc_player_aout_SendEvent(player, event, ...) do { \
33 vlc_mutex_lock(&player->aout_listeners_lock); \
34 vlc_player_aout_listener_id *listener; \
35 vlc_list_foreach(listener, &player->aout_listeners, node) \
37 if (listener->cbs->event) \
38 listener->cbs->event(__VA_ARGS__, listener->cbs_data); \
40 vlc_mutex_unlock(&player->aout_listeners_lock); \
44 vlc_player_aout_Hold(vlc_player_t
*player
)
46 return input_resource_HoldAout(player
->resource
);
49 vlc_player_aout_listener_id
*
50 vlc_player_aout_AddListener(vlc_player_t
*player
,
51 const struct vlc_player_aout_cbs
*cbs
,
56 vlc_player_aout_listener_id
*listener
= malloc(sizeof(*listener
));
61 listener
->cbs_data
= cbs_data
;
63 vlc_mutex_lock(&player
->aout_listeners_lock
);
64 vlc_list_append(&listener
->node
, &player
->aout_listeners
);
65 vlc_mutex_unlock(&player
->aout_listeners_lock
);
71 vlc_player_aout_RemoveListener(vlc_player_t
*player
,
72 vlc_player_aout_listener_id
*id
)
76 vlc_mutex_lock(&player
->aout_listeners_lock
);
77 vlc_list_remove(&id
->node
);
78 vlc_mutex_unlock(&player
->aout_listeners_lock
);
83 vlc_player_AoutCallback(vlc_object_t
*this, const char *var
,
84 vlc_value_t oldval
, vlc_value_t newval
, void *data
)
86 vlc_player_t
*player
= data
;
88 if (strcmp(var
, "volume") == 0)
90 if (oldval
.f_float
!= newval
.f_float
)
92 vlc_player_aout_SendEvent(player
, on_volume_changed
,
93 (audio_output_t
*)this, newval
.f_float
);
94 vlc_player_osd_Volume(player
, false);
97 else if (strcmp(var
, "mute") == 0)
99 if (oldval
.b_bool
!= newval
.b_bool
)
101 vlc_player_aout_SendEvent(player
, on_mute_changed
,
102 (audio_output_t
*)this, newval
.b_bool
);
103 vlc_player_osd_Volume(player
, true);
106 else if (strcmp(var
, "device") == 0)
108 const char *old
= oldval
.psz_string
;
109 const char *new = newval
.psz_string
;
110 /* support NULL values for string comparison */
111 if (old
!= new && (!old
|| !new || strcmp(old
, new)))
112 vlc_player_aout_SendEvent(player
, on_device_changed
,
113 (audio_output_t
*)this, newval
.psz_string
);
116 vlc_assert_unreachable();
123 vlc_player_aout_GetVolume(vlc_player_t
*player
)
125 audio_output_t
*aout
= vlc_player_aout_Hold(player
);
128 float vol
= aout_VolumeGet(aout
);
135 vlc_player_aout_SetVolume(vlc_player_t
*player
, float volume
)
137 audio_output_t
*aout
= vlc_player_aout_Hold(player
);
140 int ret
= aout_VolumeSet(aout
, volume
);
147 vlc_player_aout_IncrementVolume(vlc_player_t
*player
, int steps
, float *result
)
149 audio_output_t
*aout
= vlc_player_aout_Hold(player
);
152 int ret
= aout_VolumeUpdate(aout
, steps
, result
);
159 vlc_player_aout_IsMuted(vlc_player_t
*player
)
161 audio_output_t
*aout
= vlc_player_aout_Hold(player
);
164 int ret
= aout_MuteGet(aout
);
171 vlc_player_aout_Mute(vlc_player_t
*player
, bool mute
)
173 audio_output_t
*aout
= vlc_player_aout_Hold(player
);
176 int ret
= aout_MuteSet (aout
, mute
);
183 vlc_player_aout_EnableFilter(vlc_player_t
*player
, const char *name
, bool add
)
185 audio_output_t
*aout
= vlc_player_aout_Hold(player
);
188 aout_EnableFilter(aout
, name
, add
);
196 vlc_player_aout_AddCallbacks(vlc_player_t
*player
)
198 audio_output_t
*aout
= vlc_player_aout_Hold(player
);
202 var_AddCallback(aout
, "volume", vlc_player_AoutCallback
, player
);
203 var_AddCallback(aout
, "mute", vlc_player_AoutCallback
, player
);
204 var_AddCallback(aout
, "device", vlc_player_AoutCallback
, player
);
210 vlc_player_aout_DelCallbacks(vlc_player_t
*player
)
212 audio_output_t
*aout
= vlc_player_aout_Hold(player
);
216 var_DelCallback(aout
, "volume", vlc_player_AoutCallback
, player
);
217 var_DelCallback(aout
, "mute", vlc_player_AoutCallback
, player
);
218 var_DelCallback(aout
, "device", vlc_player_AoutCallback
, player
);
224 vlc_player_aout_Init(vlc_player_t
*player
)
226 audio_output_t
*aout
= input_resource_GetAout(player
->resource
);
229 vlc_player_aout_AddCallbacks(player
);
230 input_resource_PutAout(player
->resource
, aout
);
236 vlc_player_aout_Deinit(vlc_player_t
*player
)
238 vlc_player_aout_DelCallbacks(player
);
242 vlc_player_aout_Reset(vlc_player_t
*player
)
244 vlc_player_aout_Deinit(player
);
246 input_resource_ResetAout(player
->resource
);
248 vlc_player_aout_Init(player
);