X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Fvlc_aout.h;h=49c0ec6137dba3b8dba15d4b7e4b8557804db755;hb=0ad07a9d8772d38bb4a0a93e5c2b1ec0eeab5fb0;hp=21025ae4bba59d65c3d9d41856d7f3a6c279d960;hpb=939783abde8ef7ebfe738a7864e689c55181e6cf;p=vlc diff --git a/include/vlc_aout.h b/include/vlc_aout.h index 21025ae4bb..49c0ec6137 100644 --- a/include/vlc_aout.h +++ b/include/vlc_aout.h @@ -76,42 +76,7 @@ || ((p_format)->i_format == VLC_CODEC_A52) \ || ((p_format)->i_format == VLC_CODEC_DTS) ) -/* This is heavily borrowed from libmad, by Robert Leslie */ -/* - * Fixed-point format: 0xABBBBBBB - * A == whole part (sign + 3 bits) - * B == fractional part (28 bits) - * - * Values are signed two's complement, so the effective range is: - * 0x80000000 to 0x7fffffff - * -8.0 to +7.9999999962747097015380859375 - * - * The smallest representable value is: - * 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9) - * - * 28 bits of fractional accuracy represent about - * 8.6 digits of decimal accuracy. - * - * Fixed-point numbers can be added or subtracted as normal - * integers, but multiplication requires shifting the 64-bit result - * from 56 fractional bits back to 28 (and rounding.) - */ -typedef int32_t vlc_fixed_t; -#define FIXED32_FRACBITS 28 -#define FIXED32_MIN ((vlc_fixed_t) -0x80000000L) -#define FIXED32_MAX ((vlc_fixed_t) +0x7fffffffL) -#define FIXED32_ONE ((vlc_fixed_t) 0x10000000) - -/* Values used for the audio-device and audio-channels object variables */ -#define AOUT_VAR_MONO 1 -#define AOUT_VAR_STEREO 2 -#define AOUT_VAR_2F2R 4 -#define AOUT_VAR_3F2R 5 -#define AOUT_VAR_5_1 6 -#define AOUT_VAR_6_1 7 -#define AOUT_VAR_7_1 8 -#define AOUT_VAR_SPDIF 10 - +/* Values used for the audio-channels object variable */ #define AOUT_VAR_CHAN_UNSET 0 /* must be zero */ #define AOUT_VAR_CHAN_STEREO 1 #define AOUT_VAR_CHAN_RSTEREO 2 @@ -150,11 +115,10 @@ struct audio_output /**< Stops the existing stream (optional, may be NULL). * \note A stream must have been started when called. */ - int (*time_get)(audio_output_t *, mtime_t *write_pts); - /**< Estimates the date/time of the playback buffer write offset - * (optional, may be NULL). The read offset is not returned since it is - * always implicitly equal to the current time (mdate()). - * \param write_pts timestamp of the write offset [OUT] + int (*time_get)(audio_output_t *, mtime_t *delay); + /**< Estimates playback buffer latency (optional, may be NULL). + * \param delay pointer to the delay until the next sample to be written + * to the playback buffer is rendered [OUT] * \return 0 on success, non-zero on failure or lack of data * \note A stream must have been started when called. */ @@ -169,7 +133,7 @@ struct audio_output * \note A stream must have been started when called. */ void (*flush)( audio_output_t *, bool wait); - /**< Flushes or drains the playback buffers (optional, may be NULL). + /**< Flushes or drains the playback buffers (mandatory, cannot be NULL). * \param wait true to wait for playback of pending buffers (drain), * false to discard pending buffers (flush) * \note A stream must have been started when called. @@ -185,11 +149,20 @@ struct audio_output * \param mute true to mute, false to unmute * \warning A stream may or may not have been started when called. */ + int (*device_select)(audio_output_t *, const char *id); + /**< Selects an audio output device (optional, may be NULL). + * \param id nul-terminated device unique identifier. + * \return 0 on success, non-zero on failure. + * \warning A stream may or may not have been started when called. + */ struct { void (*volume_report)(audio_output_t *, float); void (*mute_report)(audio_output_t *, bool); void (*policy_report)(audio_output_t *, bool); + void (*device_report)(audio_output_t *, const char *); + void (*hotplug_report)(audio_output_t *, const char *, const char *); int (*gain_request)(audio_output_t *, float); + void (*restart_request)(audio_output_t *, unsigned); } event; }; @@ -204,6 +177,10 @@ static const uint32_t pi_vlc_chan_order_wg4[] = AOUT_CHAN_CENTER, AOUT_CHAN_LFE, 0 }; +#define AOUT_RESTART_FILTERS 1 +#define AOUT_RESTART_OUTPUT 2 +#define AOUT_RESTART_DECODER 4 + /***************************************************************************** * Prototypes *****************************************************************************/ @@ -216,10 +193,15 @@ static const uint32_t pi_vlc_chan_order_wg4[] = */ VLC_API unsigned aout_CheckChannelReorder( const uint32_t *, const uint32_t *, uint32_t mask, uint8_t *table ); -VLC_API void aout_ChannelReorder( void *, size_t, unsigned, const uint8_t *, unsigned ); +VLC_API void aout_ChannelReorder(void *, size_t, unsigned, const uint8_t *, vlc_fourcc_t); + +VLC_API void aout_Interleave(void *dst, const void *src, unsigned samples, + unsigned channels, vlc_fourcc_t fourcc); +VLC_API void aout_Deinterleave(void *dst, const void *src, unsigned samples, + unsigned channels, vlc_fourcc_t fourcc); /** - * This fonction will compute the extraction parameter into pi_selection to go + * This function will compute the extraction parameter into pi_selection to go * from i_channels with their type given by pi_order_src[] into the order * describe by pi_order_dst. * It will also set : @@ -262,6 +244,9 @@ VLC_API float aout_VolumeGet (audio_output_t *); VLC_API int aout_VolumeSet (audio_output_t *, float); VLC_API int aout_MuteGet (audio_output_t *); VLC_API int aout_MuteSet (audio_output_t *, bool); +VLC_API char *aout_DeviceGet (audio_output_t *); +VLC_API int aout_DeviceSet (audio_output_t *, const char *); +VLC_API int aout_DevicesList (audio_output_t *, char ***, char ***); /** * Report change of configured audio volume to the core and UI. @@ -288,6 +273,25 @@ static inline void aout_PolicyReport(audio_output_t *aout, bool cork) aout->event.policy_report(aout, cork); } +/** + * Report change of output device. + */ +static inline void aout_DeviceReport(audio_output_t *aout, const char *id) +{ + aout->event.device_report(aout, id); +} + +/** + * Report a device hot-plug event. + * @param id device ID + * @param name human-readable device name (NULL for hot unplug) + */ +static inline void aout_HotplugReport(audio_output_t *aout, + const char *id, const char *name) +{ + aout->event.hotplug_report(aout, id, name); +} + /** * Request a change of software audio amplification. * \param gain linear amplitude gain (must be positive) @@ -298,40 +302,37 @@ static inline int aout_GainRequest(audio_output_t *aout, float gain) return aout->event.gain_request(aout, gain); } -VLC_API int aout_ChannelsRestart( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void * ); - -/* */ -VLC_API vout_thread_t * aout_filter_RequestVout( filter_t *, vout_thread_t *p_vout, video_format_t *p_fmt ) VLC_USED; - -/** Audio output buffer FIFO */ -struct aout_fifo_t +static inline void aout_RestartRequest(audio_output_t *aout, unsigned mode) { - block_t *p_first; - block_t **pp_last; - date_t end_date; -}; + aout->event.restart_request(aout, mode); +} -/* Legacy packet-oriented audio output helpers */ -typedef struct +static inline int aout_ChannelsRestart (vlc_object_t *obj, const char *varname, + vlc_value_t oldval, vlc_value_t newval, void *data) { - vlc_mutex_t lock; - audio_sample_format_t format; - aout_fifo_t partial; /**< Audio blocks before packetization */ - aout_fifo_t fifo; /**< Packetized audio blocks */ - mtime_t pause_date; /**< Date when paused or VLC_TS_INVALID */ - unsigned samples; /**< Samples per packet */ - bool starving; /**< Whether currently starving (to limit error messages) */ -} aout_packet_t; + audio_output_t *aout = (audio_output_t *)obj; + (void)varname; (void)oldval; (void)newval; (void)data; -VLC_DEPRECATED void aout_PacketInit(audio_output_t *, aout_packet_t *, unsigned, const audio_sample_format_t *); -VLC_DEPRECATED void aout_PacketDestroy(audio_output_t *); - -VLC_DEPRECATED int aout_PacketTimeGet(audio_output_t *, mtime_t *); -VLC_DEPRECATED void aout_PacketPlay(audio_output_t *, block_t *); -VLC_DEPRECATED void aout_PacketPause(audio_output_t *, bool, mtime_t); -VLC_DEPRECATED void aout_PacketFlush(audio_output_t *, bool); - -VLC_DEPRECATED block_t *aout_PacketNext(audio_output_t *, mtime_t) VLC_USED; + aout_RestartRequest (aout, AOUT_RESTART_OUTPUT); + return 0; +} +/* Audio output filters */ +typedef struct aout_filters aout_filters_t; +typedef struct aout_request_vout aout_request_vout_t; + +VLC_API aout_filters_t *aout_FiltersNew(vlc_object_t *, + const audio_sample_format_t *, + const audio_sample_format_t *, + const aout_request_vout_t *) VLC_USED; +#define aout_FiltersNew(o,inf,outf,rv) \ + aout_FiltersNew(VLC_OBJECT(o),inf,outf,rv) +VLC_API void aout_FiltersDelete(vlc_object_t *, aout_filters_t *); +#define aout_FiltersDelete(o,f) \ + aout_FiltersDelete(VLC_OBJECT(o),f) +VLC_API bool aout_FiltersAdjustResampling(aout_filters_t *, int); +VLC_API block_t *aout_FiltersPlay(aout_filters_t *, block_t *, int rate); + +VLC_API vout_thread_t * aout_filter_RequestVout( filter_t *, vout_thread_t *p_vout, video_format_t *p_fmt ); #endif /* VLC_AOUT_H */