1
mirror of https://code.videolan.org/videolan/vlc synced 2024-08-06 16:44:19 +02:00

Audio track and channel support for JavaScript API. The ActiveX vlc.audio.channel interface still has a bug left.

This commit is contained in:
Jean-Paul Saman 2006-12-20 22:11:54 +00:00
parent b2009aee6f
commit 2dfa55bd53
7 changed files with 170 additions and 81 deletions

View File

@ -205,9 +205,9 @@ library AXVLC
[propput, helpstring("Returns/sets audio track used/to use.")] [propput, helpstring("Returns/sets audio track used/to use.")]
HRESULT track([in] long track); HRESULT track([in] long track);
[propget, helpstring("Returns audio channel: reverse, stereo, left, right, dolby.")] [propget, helpstring("Returns audio channel: reverse stereo, stereo, left, right, dolby.")]
HRESULT channel([out, retval] BSTR* channel); HRESULT channel([out, retval] BSTR* channel);
[propput, helpstring("Sets audio channel to: reverse, stereo, left, right, dolby.")] [propput, helpstring("Sets audio channel to: reverse stereo, stereo, left, right, dolby.")]
HRESULT channel([in] BSTR channel); HRESULT channel([in] BSTR channel);
}; };

View File

@ -211,7 +211,9 @@ STDMETHODIMP VLCAudio::get_track(long* track)
libvlc_exception_t ex; libvlc_exception_t ex;
libvlc_exception_init(&ex); libvlc_exception_init(&ex);
*track = libvlc_audio_get_track(p_libvlc, &ex); libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
*track = libvlc_audio_get_track(p_input, &ex);
libvlc_input_free(p_input);
if( libvlc_exception_raised(&ex) ) if( libvlc_exception_raised(&ex) )
{ {
_p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex)); _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
@ -232,7 +234,9 @@ STDMETHODIMP VLCAudio::put_track(long track)
libvlc_exception_t ex; libvlc_exception_t ex;
libvlc_exception_init(&ex); libvlc_exception_init(&ex);
libvlc_audio_set_track(p_libvlc, track, &ex); libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex);
libvlc_audio_set_track(p_input, track, &ex);
libvlc_input_free(p_input);
if( libvlc_exception_raised(&ex) ) if( libvlc_exception_raised(&ex) )
{ {
_p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex)); _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex));
@ -265,9 +269,11 @@ STDMETHODIMP VLCAudio::get_channel(BSTR *channel)
*channel = BSTRFromCStr(CP_UTF8, psz_channel); *channel = BSTRFromCStr(CP_UTF8, psz_channel);
free( psz_channel ); free( psz_channel );
return NOERROR; psz_channel = NULL;
return (NULL == *channel) ? E_OUTOFMEMORY : NOERROR;
} }
if( psz_channel ) free( psz_channel ); if( psz_channel ) free( psz_channel );
psz_channel = NULL;
_p_instance->setErrorInfo(IID_IVLCAudio, _p_instance->setErrorInfo(IID_IVLCAudio,
libvlc_exception_get_message(&ex)); libvlc_exception_get_message(&ex));
libvlc_exception_clear(&ex); libvlc_exception_clear(&ex);
@ -297,7 +303,6 @@ STDMETHODIMP VLCAudio::put_channel(BSTR channel)
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
libvlc_audio_set_channel(p_libvlc, psz_channel, &ex); libvlc_audio_set_channel(p_libvlc, psz_channel, &ex);
CoTaskMemFree(psz_channel); CoTaskMemFree(psz_channel);
if( libvlc_exception_raised(&ex) ) if( libvlc_exception_raised(&ex) )
{ {
@ -2087,12 +2092,13 @@ STDMETHODIMP VLCVideo::get_aspectRatio(BSTR* aspect)
if( NULL == psz_aspect ) if( NULL == psz_aspect )
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
*aspect = SysAllocStringByteLen(psz_aspect, strlen(psz_aspect)); *aspect = BSTRFromCStr(CP_UTF8, psz_aspect);
free( psz_aspect ); free( psz_aspect );
psz_aspect = NULL; psz_aspect = NULL;
return NOERROR; return (NULL == *aspect) ? E_OUTOFMEMORY : NOERROR;
} }
if( psz_aspect ) free( psz_aspect ); if( psz_aspect ) free( psz_aspect );
psz_aspect = NULL;
} }
_p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex)); _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
libvlc_exception_clear(&ex); libvlc_exception_clear(&ex);
@ -2466,4 +2472,3 @@ STDMETHODIMP VLCControl2::get_video(IVLCVideo** obj)
} }
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
}; };

View File

@ -492,33 +492,33 @@ int libvlc_audio_get_volume( libvlc_instance_t *, libvlc_exception_t * );
void libvlc_audio_set_volume( libvlc_instance_t *, int, libvlc_exception_t *); void libvlc_audio_set_volume( libvlc_instance_t *, int, libvlc_exception_t *);
/** /**
* Get current audio track + * Get current audio track
* \param p_instance libvlc instance + * \param p_input input instance
* \param p_exception an initialized exception + * \param p_exception an initialized exception
* \return the audio track (int) + * \return the audio track (int)
*/ + */
int libvlc_audio_get_track( libvlc_instance_t *, libvlc_exception_t * ); int libvlc_audio_get_track( libvlc_input_t *, libvlc_exception_t * );
/** /**
* Set current audio track * Set current audio track
* \param p_instance libvlc instance * \param p_input input instance
* \param i_track the track (int) * \param i_track the track (int)
* \param p_exception an initialized exception * \param p_exception an initialized exception
* \return void * \return void
*/ */
void libvlc_audio_set_track( libvlc_instance_t *, int, libvlc_exception_t * ); void libvlc_audio_set_track( libvlc_input_t *, int, libvlc_exception_t * );
/** /**
* Get current audio channel * Get current audio channel
* \param p_instance libvlc instance * \param p_instance input instance
* \param p_exception an initialized exception * \param p_exception an initialized exception
* \return the audio channel (char *) * \return the audio channel (char *)
*/ */
char *libvlc_audio_get_channel( libvlc_instance_t *, libvlc_exception_t * ); char *libvlc_audio_get_channel( libvlc_instance_t *, libvlc_exception_t * );
/** /**
* Set current audio track * Set current audio channel
* \param p_instance libvlc instance * \param p_instance input instance
* \param psz_channel the audio channel (char *) * \param psz_channel the audio channel (char *)
* \param p_exception an initialized exception * \param p_exception an initialized exception
* \return void * \return void

View File

@ -199,11 +199,20 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::getProperty(int index, NPVari
libvlc_exception_t ex; libvlc_exception_t ex;
libvlc_exception_init(&ex); libvlc_exception_init(&ex);
libvlc_input_t *p_input = libvlc_playlist_get_input(p_plugin->getVLC(), &ex);
if( libvlc_exception_raised(&ex) )
{
NPN_SetException(this, libvlc_exception_get_message(&ex));
libvlc_exception_clear(&ex);
return INVOKERESULT_GENERIC_ERROR;
}
switch( index ) switch( index )
{ {
case ID_audio_mute: case ID_audio_mute:
{ {
vlc_bool_t muted = libvlc_audio_get_mute(p_plugin->getVLC(), &ex); vlc_bool_t muted = libvlc_audio_get_mute(p_plugin->getVLC(), &ex);
libvlc_input_free(p_input);
if( libvlc_exception_raised(&ex) ) if( libvlc_exception_raised(&ex) )
{ {
NPN_SetException(this, libvlc_exception_get_message(&ex)); NPN_SetException(this, libvlc_exception_get_message(&ex));
@ -216,6 +225,7 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::getProperty(int index, NPVari
case ID_audio_volume: case ID_audio_volume:
{ {
int volume = libvlc_audio_get_volume(p_plugin->getVLC(), &ex); int volume = libvlc_audio_get_volume(p_plugin->getVLC(), &ex);
libvlc_input_free(p_input);
if( libvlc_exception_raised(&ex) ) if( libvlc_exception_raised(&ex) )
{ {
NPN_SetException(this, libvlc_exception_get_message(&ex)); NPN_SetException(this, libvlc_exception_get_message(&ex));
@ -227,7 +237,8 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::getProperty(int index, NPVari
} }
case ID_audio_track: case ID_audio_track:
{ {
int track = libvlc_audio_get_track(p_plugin->getVLC(), &ex); int track = libvlc_audio_get_track(p_input, &ex);
libvlc_input_free(p_input);
if( libvlc_exception_raised(&ex) ) if( libvlc_exception_raised(&ex) )
{ {
NPN_SetException(this, libvlc_exception_get_message(&ex)); NPN_SetException(this, libvlc_exception_get_message(&ex));
@ -239,35 +250,24 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::getProperty(int index, NPVari
} }
case ID_audio_channel: case ID_audio_channel:
{ {
char *channel = libvlc_audio_get_channel(p_plugin->getVLC(), &ex); NPUTF8 *psz_channel = libvlc_audio_get_channel(p_plugin->getVLC(), &ex);
libvlc_input_free(p_input);
if( libvlc_exception_raised(&ex) ) if( libvlc_exception_raised(&ex) )
{ {
NPN_SetException(this, libvlc_exception_get_message(&ex)); NPN_SetException(this, libvlc_exception_get_message(&ex));
libvlc_exception_clear(&ex); libvlc_exception_clear(&ex);
return INVOKERESULT_GENERIC_ERROR; return INVOKERESULT_GENERIC_ERROR;
} }
if( channel ) if( !psz_channel )
{ return INVOKERESULT_GENERIC_ERROR;
int len = strlen(channel);
NPUTF8 *retval = (NPUTF8*)NPN_MemAlloc(len); STRINGZ_TO_NPVARIANT(psz_channel, result);
if( retval )
{
memcpy(retval, channel, len);
STRINGN_TO_NPVARIANT(retval, len, result);
}
else
{
NULL_TO_NPVARIANT(result);
}
free( channel );
channel = NULL;
return INVOKERESULT_NO_ERROR; return INVOKERESULT_NO_ERROR;
} }
return INVOKERESULT_NO_SUCH_METHOD;
}
default: default:
; ;
} }
libvlc_input_free(p_input);
} }
return INVOKERESULT_GENERIC_ERROR; return INVOKERESULT_GENERIC_ERROR;
} }
@ -280,6 +280,14 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::setProperty(int index, const
libvlc_exception_t ex; libvlc_exception_t ex;
libvlc_exception_init(&ex); libvlc_exception_init(&ex);
libvlc_input_t *p_input = libvlc_playlist_get_input(p_plugin->getVLC(), &ex);
if( libvlc_exception_raised(&ex) )
{
NPN_SetException(this, libvlc_exception_get_message(&ex));
libvlc_exception_clear(&ex);
return INVOKERESULT_GENERIC_ERROR;
}
switch( index ) switch( index )
{ {
case ID_audio_mute: case ID_audio_mute:
@ -287,6 +295,7 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::setProperty(int index, const
{ {
libvlc_audio_set_mute(p_plugin->getVLC(), libvlc_audio_set_mute(p_plugin->getVLC(),
NPVARIANT_TO_BOOLEAN(value), &ex); NPVARIANT_TO_BOOLEAN(value), &ex);
libvlc_input_free(p_input);
if( libvlc_exception_raised(&ex) ) if( libvlc_exception_raised(&ex) )
{ {
NPN_SetException(this, libvlc_exception_get_message(&ex)); NPN_SetException(this, libvlc_exception_get_message(&ex));
@ -297,6 +306,7 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::setProperty(int index, const
} }
return INVOKERESULT_INVALID_VALUE; return INVOKERESULT_INVALID_VALUE;
case ID_audio_volume: case ID_audio_volume:
libvlc_input_free(p_input);
if( isNumberValue(value) ) if( isNumberValue(value) )
{ {
libvlc_audio_set_volume(p_plugin->getVLC(), libvlc_audio_set_volume(p_plugin->getVLC(),
@ -313,8 +323,9 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::setProperty(int index, const
case ID_audio_track: case ID_audio_track:
if( isNumberValue(value) ) if( isNumberValue(value) )
{ {
libvlc_audio_set_track(p_plugin->getVLC(), libvlc_audio_set_track(p_input,
numberValue(value), &ex); numberValue(value), &ex);
libvlc_input_free(p_input);
if( libvlc_exception_raised(&ex) ) if( libvlc_exception_raised(&ex) )
{ {
NPN_SetException(this, libvlc_exception_get_message(&ex)); NPN_SetException(this, libvlc_exception_get_message(&ex));
@ -323,15 +334,15 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::setProperty(int index, const
} }
return INVOKERESULT_NO_ERROR; return INVOKERESULT_NO_ERROR;
} }
libvlc_input_free(p_input);
return INVOKERESULT_INVALID_VALUE; return INVOKERESULT_INVALID_VALUE;
case ID_audio_channel: case ID_audio_channel:
{ {
char *psz_channel = NULL; char *psz_channel = NULL;
libvlc_input_free(p_input);
if( ! NPVARIANT_IS_STRING(value) ) if( ! NPVARIANT_IS_STRING(value) )
{
return INVOKERESULT_INVALID_VALUE; return INVOKERESULT_INVALID_VALUE;
}
psz_channel = stringValue(NPVARIANT_TO_STRING(value)); psz_channel = stringValue(NPVARIANT_TO_STRING(value));
if( !psz_channel ) if( !psz_channel )
@ -352,6 +363,7 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::setProperty(int index, const
default: default:
; ;
} }
libvlc_input_free(p_input);
} }
return INVOKERESULT_GENERIC_ERROR; return INVOKERESULT_GENERIC_ERROR;
} }
@ -1900,7 +1912,10 @@ RuntimeNPObject::InvokeResult LibvlcVideoNPObject::setProperty(int index, const
psz_aspect = stringValue(NPVARIANT_TO_STRING(value)); psz_aspect = stringValue(NPVARIANT_TO_STRING(value));
if( !psz_aspect ) if( !psz_aspect )
{
libvlc_input_free(p_input);
return INVOKERESULT_GENERIC_ERROR; return INVOKERESULT_GENERIC_ERROR;
}
libvlc_video_set_aspect_ratio(p_input, psz_aspect, &ex); libvlc_video_set_aspect_ratio(p_input, psz_aspect, &ex);
if( psz_aspect ) if( psz_aspect )

View File

@ -25,8 +25,56 @@
#include "libvlc_internal.h" #include "libvlc_internal.h"
#include <vlc/libvlc.h> #include <vlc/libvlc.h>
#include <vlc_input.h>
#include <vlc_aout.h> #include <vlc_aout.h>
/*
* Remember to release the returned input_thread_t since it is locked at
* the end of this function.
*/
static input_thread_t *GetInput( libvlc_input_t *p_input,
libvlc_exception_t *p_exception )
{
input_thread_t *p_input_thread = NULL;
if( !p_input )
{
libvlc_exception_raise( p_exception, "Input is NULL" );
return NULL;
}
p_input_thread = (input_thread_t*)vlc_object_get(
p_input->p_instance->p_libvlc_int,
p_input->i_input_id );
if( !p_input_thread )
{
libvlc_exception_raise( p_exception, "Input does not exist" );
return NULL;
}
return p_input_thread;
}
/*
* Remember to release the returned aout_instance_t since it is locked at
* the end of this function.
*/
static aout_instance_t *GetAOut( libvlc_instance_t *p_instance,
libvlc_exception_t *p_exception )
{
aout_instance_t * p_aout = NULL;
p_aout = vlc_object_find( p_instance->p_libvlc_int, VLC_OBJECT_AOUT, FIND_CHILD );
if( !p_aout )
{
libvlc_exception_raise( p_exception, "No active audio output" );
return NULL;
}
return p_aout;
}
/***************************************************************************** /*****************************************************************************
* libvlc_audio_get_mute : Get the volume state, true if muted * libvlc_audio_get_mute : Get the volume state, true if muted
*****************************************************************************/ *****************************************************************************/
@ -94,12 +142,14 @@ void libvlc_audio_set_volume( libvlc_instance_t *p_instance, int i_volume,
/***************************************************************************** /*****************************************************************************
* libvlc_audio_get_track : Get the current audio track * libvlc_audio_get_track : Get the current audio track
*****************************************************************************/ *****************************************************************************/
int libvlc_audio_get_track( libvlc_instance_t *p_instance, int libvlc_audio_get_track( libvlc_input_t *p_input,
libvlc_exception_t *p_e ) libvlc_exception_t *p_e )
{ {
input_thread_t *p_input_thread = GetInput( p_input, p_e );
int i_track = 0; int i_track = 0;
i_track = var_GetInteger( p_instance->p_libvlc_int, "audio-track" ); i_track = var_GetInteger( p_input_thread, "audio-es" );
vlc_object_release( p_input_thread );
return i_track; return i_track;
} }
@ -107,17 +157,31 @@ int libvlc_audio_get_track( libvlc_instance_t *p_instance,
/***************************************************************************** /*****************************************************************************
* libvlc_audio_set_track : Set the current audio track * libvlc_audio_set_track : Set the current audio track
*****************************************************************************/ *****************************************************************************/
void libvlc_audio_set_track( libvlc_instance_t *p_instance, int i_track, void libvlc_audio_set_track( libvlc_input_t *p_input, int i_track,
libvlc_exception_t *p_e ) libvlc_exception_t *p_e )
{ {
input_thread_t *p_input_thread = GetInput( p_input, p_e );
vlc_value_t val_list;
int i_ret = -1; int i_ret = -1;
int i;
i_ret = var_SetInteger( p_instance->p_libvlc_int, "audio-track", i_track ); var_Change( p_input_thread, "audio-es", VLC_VAR_GETCHOICES, &val_list, NULL );
for( i = 0; i < val_list.p_list->i_count; i++ )
{
vlc_value_t val = val_list.p_list->p_values[i];
if( i_track == val.i_int )
{
i_ret = var_SetInteger( p_input_thread, "audio-es", i_track );
if( i_ret < 0 ) if( i_ret < 0 )
{ {
libvlc_exception_raise( p_e, "Setting audio track failed" ); libvlc_exception_raise( p_e, "Setting audio track failed" );
} }
vlc_object_release( p_input_thread );
return;
}
}
libvlc_exception_raise( p_e, "Audio track out of range" );
vlc_object_release( p_input_thread );
} }
/***************************************************************************** /*****************************************************************************
@ -126,14 +190,15 @@ void libvlc_audio_set_track( libvlc_instance_t *p_instance, int i_track,
char *libvlc_audio_get_channel( libvlc_instance_t *p_instance, char *libvlc_audio_get_channel( libvlc_instance_t *p_instance,
libvlc_exception_t *p_e ) libvlc_exception_t *p_e )
{ {
aout_instance_t *p_aout = GetAOut( p_instance, p_e );
char *psz_channel = NULL; char *psz_channel = NULL;
int i_channel = 0; vlc_value_t val;
i_channel = var_GetInteger( p_instance->p_libvlc_int, "audio-channel" ); var_Get( p_aout, "audio-channels", &val );
switch( i_channel ) switch( val.i_int )
{ {
case AOUT_VAR_CHAN_RSTEREO: case AOUT_VAR_CHAN_RSTEREO:
psz_channel = strdup("reverse"); psz_channel = strdup("reverse stereo");
break; break;
case AOUT_VAR_CHAN_STEREO: case AOUT_VAR_CHAN_STEREO:
psz_channel = strdup("stereo"); psz_channel = strdup("stereo");
@ -151,6 +216,7 @@ char *libvlc_audio_get_channel( libvlc_instance_t *p_instance,
psz_channel = strdup("disabled"); psz_channel = strdup("disabled");
break; break;
} }
vlc_object_release( p_aout );
return psz_channel; return psz_channel;
} }
@ -160,30 +226,33 @@ char *libvlc_audio_get_channel( libvlc_instance_t *p_instance,
void libvlc_audio_set_channel( libvlc_instance_t *p_instance, char *psz_channel, void libvlc_audio_set_channel( libvlc_instance_t *p_instance, char *psz_channel,
libvlc_exception_t *p_e ) libvlc_exception_t *p_e )
{ {
int i_ret = -1; aout_instance_t *p_aout = GetAOut( p_instance, p_e );
int i_channel = 0; vlc_value_t val_list, text_list;
int i_ret = -1, i;
if( !psz_channel ) i_ret = var_Change( p_aout, "audio-channels", VLC_VAR_GETCHOICES, &val_list, &text_list );
if( (i_ret < 0) || !psz_channel )
{ {
libvlc_exception_raise( p_e, "Audio track out of range" ); libvlc_exception_raise( p_e, "Audio channel out of range" );
vlc_object_release( p_aout );
return;
} }
else
{
if( strncmp( psz_channel, "reverse", 7 ) == 0 )
i_channel = AOUT_VAR_CHAN_RSTEREO;
else if( strncmp( psz_channel, "stereo", 6 ) == 0 )
i_channel = AOUT_VAR_CHAN_STEREO;
else if( strncmp( psz_channel, "left", 4 ) == 0 )
i_channel = AOUT_VAR_CHAN_LEFT;
else if( strncmp( psz_channel, "right", 5 ) == 0 )
i_channel = AOUT_VAR_CHAN_RIGHT;
else if( strncmp( psz_channel, "dolby", 5 ) == 0 )
i_channel = AOUT_VAR_CHAN_DOLBYS;
i_ret = var_SetInteger( p_instance->p_libvlc_int, "audio-channel", i_channel ); for( i = 0; i < val_list.p_list->i_count; i++ )
{
vlc_value_t val = val_list.p_list->p_values[i];
vlc_value_t text = text_list.p_list->p_values[i];
if( strncasecmp( psz_channel, text.psz_string, strlen(text.psz_string) ) == 0 )
{
i_ret = var_Set( p_aout, "audio-channels", val );
if( i_ret < 0 ) if( i_ret < 0 )
{ {
libvlc_exception_raise( p_e, "Audio track out of range" ); break;
} }
} }
} }
libvlc_exception_raise( p_e, "Audio channel out of range" );
vlc_object_release( p_aout );
}