change_private()
add_integer ("amem-rate", 44100,
N_("Sample rate"), N_("Sample rate"), false)
- change_integer_range (1, 192000)
+ change_integer_range (1, 352800)
change_private()
add_integer ("amem-channels", 2,
N_("Channels count"), N_("Channels count"), false)
{
void *opaque;
int (*setup) (void **, char *, unsigned *, unsigned *);
+ void (*cleanup) (void *opaque);
union
{
- void (*cleanup) (void *opaque);
+ struct
+ {
+ void *setup_opaque;
+ };
struct
{
unsigned rate:18;
int (*set_volume) (void *opaque, float vol, bool mute);
float volume;
bool mute;
+ bool ready;
};
static void Play (audio_output_t *aout, block_t *block)
aout_sys_t *sys = aout->sys;
sys->volume = vol;
+ if (sys->ready)
+ return 0; /* sys->opaque is not yet defined... */
return sys->set_volume (sys->opaque, vol, sys->mute) ? -1 : 0;
}
aout_sys_t *sys = aout->sys;
sys->mute = mute;
+ if (!sys->ready)
+ return 0; /* sys->opaque is not yet defined... */
return sys->set_volume (sys->opaque, sys->volume, mute) ? -1 : 0;
}
return 0;
}
+static void Stop (audio_output_t *aout)
+{
+ aout_sys_t *sys = aout->sys;
+
+ if (sys->cleanup != NULL)
+ sys->cleanup (sys->opaque);
+ sys->ready = false;
+}
+
static int Start (audio_output_t *aout, audio_sample_format_t *fmt)
{
aout_sys_t *sys = aout->sys;
{
channels = aout_FormatNbChannels(fmt);
+ sys->opaque = sys->setup_opaque;
if (sys->setup (&sys->opaque, format, &fmt->i_rate, &channels))
return VLC_EGENERIC;
}
channels = sys->channels;
}
- if (fmt->i_rate == 0 || fmt->i_rate > 192000
- || channels == 0 || channels > AOUT_CHAN_MAX)
- return VLC_EGENERIC;
+ /* Initialize volume (in case the UI changed volume before setup) */
+ sys->ready = true;
+ if (sys->set_volume != NULL)
+ sys->set_volume(sys->opaque, sys->volume, sys->mute);
- /* TODO: amem-format */
- if (strcmp(format, "S16N"))
+ /* Ensure that format is supported */
+ if (fmt->i_rate == 0 || fmt->i_rate > 192000
+ || channels == 0 || channels > AOUT_CHAN_MAX
+ || strcmp(format, "S16N") /* TODO: amem-format */)
{
- msg_Err (aout, "format not supported");
+ msg_Err (aout, "format not supported: %s, %u channel(s), %u Hz",
+ format, channels, fmt->i_rate);
+ Stop (aout);
return VLC_EGENERIC;
}
return VLC_SUCCESS;
}
-static void Stop (audio_output_t *aout)
-{
- aout_sys_t *sys = aout->sys;
-
- if (sys->cleanup != NULL)
- sys->cleanup (sys->opaque);
-}
-
static int Open (vlc_object_t *obj)
{
audio_output_t *aout = (audio_output_t *)obj;
if (unlikely(sys == NULL))
return VLC_ENOMEM;
- aout->sys = sys;
- sys->opaque = var_InheritAddress (obj, "amem-data");
+ void *opaque = var_InheritAddress (obj, "amem-data");
sys->setup = var_InheritAddress (obj, "amem-setup");
if (sys->setup != NULL)
+ {
sys->cleanup = var_InheritAddress (obj, "amem-cleanup");
+ sys->setup_opaque = opaque;
+ }
else
{
+ sys->cleanup = NULL;
+ sys->opaque = opaque;
sys->rate = var_InheritInteger (obj, "amem-rate");
sys->channels = var_InheritInteger (obj, "amem-channels");
}
sys->set_volume = var_InheritAddress (obj, "amem-set-volume");
sys->volume = 1.;
sys->mute = false;
+ sys->ready = false;
if (sys->play == NULL)
{
free (sys);
return VLC_EGENERIC;
}
+ aout->sys = sys;
aout->start = Start;
aout->stop = Stop;
aout->time_get = NULL;