*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
int (*setup) (void **, char *, unsigned *, unsigned *);
union
{
- void (*cleanup) (void *opaque);
+ struct
+ {
+ void *setup_opaque;
+ void (*cleanup) (void *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;
}
{
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;
}
+ /* 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);
+
if (fmt->i_rate == 0 || fmt->i_rate > 192000
|| channels == 0 || channels > AOUT_CHAN_MAX)
return VLC_EGENERIC;
if (sys->cleanup != NULL)
sys->cleanup (sys->opaque);
+ sys->ready = false;
}
static int Open (vlc_object_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->setup_opaque = opaque;
sys->cleanup = var_InheritAddress (obj, "amem-cleanup");
+ }
else
{
+ 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;