#92677#: Play sound within main thread
This commit is contained in:
parent
8b8fe97f1a
commit
96f2ba3946
1 changed files with 81 additions and 62 deletions
|
@ -2,9 +2,9 @@
|
||||||
*
|
*
|
||||||
* $RCSfile: filedlg.cxx,v $
|
* $RCSfile: filedlg.cxx,v $
|
||||||
*
|
*
|
||||||
* $Revision: 1.9 $
|
* $Revision: 1.10 $
|
||||||
*
|
*
|
||||||
* last change: $Author: thb $ $Date: 2001-10-05 12:52:53 $
|
* last change: $Author: ka $ $Date: 2001-10-15 14:53:38 $
|
||||||
*
|
*
|
||||||
* The Contents of this file are made available subject to the terms of
|
* The Contents of this file are made available subject to the terms of
|
||||||
* either of the following licenses
|
* either of the following licenses
|
||||||
|
@ -153,11 +153,14 @@ private:
|
||||||
css::uno::Reference< css::ui::dialogs::XFilePickerControlAccess > mxControlAccess;
|
css::uno::Reference< css::ui::dialogs::XFilePickerControlAccess > mxControlAccess;
|
||||||
|
|
||||||
Sound maSound;
|
Sound maSound;
|
||||||
|
ULONG mnPlaySoundEvent;
|
||||||
BOOL mbUsableSelection;
|
BOOL mbUsableSelection;
|
||||||
BOOL mbLabelPlaying;
|
BOOL mbLabelPlaying;
|
||||||
|
|
||||||
void CheckSelectionState();
|
void CheckSelectionState();
|
||||||
DECL_LINK( StopMusicHdl, void * );
|
|
||||||
|
DECL_LINK( PlayMusicHdl, void * );
|
||||||
|
DECL_LINK( StopMusicHdl, void * );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SdFileDialog_Imp( const short nDialogType, sal_Bool bUsableSelection );
|
SdFileDialog_Imp( const short nDialogType, sal_Bool bUsableSelection );
|
||||||
|
@ -185,71 +188,84 @@ void SAL_CALL SdFileDialog_Imp::ControlStateChanged( const css::ui::dialogs::Fil
|
||||||
case css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY:
|
case css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY:
|
||||||
if( mxControlAccess.is() )
|
if( mxControlAccess.is() )
|
||||||
{
|
{
|
||||||
if( mbLabelPlaying )
|
if( mnPlaySoundEvent )
|
||||||
{
|
Application::RemoveUserEvent( mnPlaySoundEvent );
|
||||||
// switch from playing to not playing
|
|
||||||
|
|
||||||
// reset, so that sound file gets unlocked
|
mnPlaySoundEvent = Application::PostUserEvent( LINK( this, SdFileDialog_Imp, PlayMusicHdl ) );
|
||||||
maSound.Stop();
|
|
||||||
maSound.SetSoundName( String() );
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY,
|
|
||||||
String( SdResId( STR_PLAY ) ) );
|
|
||||||
|
|
||||||
mbLabelPlaying = FALSE;
|
|
||||||
}
|
|
||||||
catch( css::lang::IllegalArgumentException )
|
|
||||||
{
|
|
||||||
#ifdef DBG_UTIL
|
|
||||||
DBG_ERROR( "Cannot access play button" );
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// switch from not playing to playing of current file
|
|
||||||
if( maSound.IsPlaying() )
|
|
||||||
{
|
|
||||||
// reset, so that sound file gets unlocked
|
|
||||||
maSound.Stop();
|
|
||||||
maSound.SetSoundName( String() );
|
|
||||||
}
|
|
||||||
|
|
||||||
INetURLObject aUrl( GetPath() );
|
|
||||||
String aSoundFile( aUrl.GetMainURL( INetURLObject::NO_DECODE ) );
|
|
||||||
|
|
||||||
if( aSoundFile.Len() > 0 )
|
|
||||||
{
|
|
||||||
maSound.SetNotifyHdl( LINK( this, SdFileDialog_Imp, StopMusicHdl ) );
|
|
||||||
maSound.SetSoundName( aSoundFile );
|
|
||||||
maSound.Play();
|
|
||||||
|
|
||||||
// guard against early stopping
|
|
||||||
if( maSound.IsPlaying() )
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY,
|
|
||||||
String( SdResId( STR_STOP ) ) );
|
|
||||||
|
|
||||||
mbLabelPlaying = TRUE;
|
|
||||||
}
|
|
||||||
catch( css::lang::IllegalArgumentException )
|
|
||||||
{
|
|
||||||
#ifdef DBG_UTIL
|
|
||||||
DBG_ERROR( "Cannot access play button" );
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
IMPL_LINK( SdFileDialog_Imp, PlayMusicHdl, void *, EMPTYARG )
|
||||||
|
{
|
||||||
|
mnPlaySoundEvent = 0;
|
||||||
|
|
||||||
|
if( mbLabelPlaying )
|
||||||
|
{
|
||||||
|
// switch from playing to not playing
|
||||||
|
|
||||||
|
// reset, so that sound file gets unlocked
|
||||||
|
maSound.Stop();
|
||||||
|
maSound.SetSoundName( String() );
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY,
|
||||||
|
String( SdResId( STR_PLAY ) ) );
|
||||||
|
|
||||||
|
mbLabelPlaying = FALSE;
|
||||||
|
}
|
||||||
|
catch( css::lang::IllegalArgumentException )
|
||||||
|
{
|
||||||
|
#ifdef DBG_UTIL
|
||||||
|
DBG_ERROR( "Cannot access play button" );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// switch from not playing to playing of current file
|
||||||
|
if( maSound.IsPlaying() )
|
||||||
|
{
|
||||||
|
// reset, so that sound file gets unlocked
|
||||||
|
maSound.Stop();
|
||||||
|
maSound.SetSoundName( String() );
|
||||||
|
}
|
||||||
|
|
||||||
|
INetURLObject aUrl( GetPath() );
|
||||||
|
String aSoundFile( aUrl.GetMainURL( INetURLObject::NO_DECODE ) );
|
||||||
|
|
||||||
|
if( aSoundFile.Len() > 0 )
|
||||||
|
{
|
||||||
|
maSound.SetNotifyHdl( LINK( this, SdFileDialog_Imp, StopMusicHdl ) );
|
||||||
|
maSound.SetSoundName( aSoundFile );
|
||||||
|
maSound.Play();
|
||||||
|
|
||||||
|
// guard against early stopping
|
||||||
|
if( maSound.IsPlaying() )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
mxControlAccess->setLabel( css::ui::dialogs::ExtendedFilePickerElementIds::PUSHBUTTON_PLAY,
|
||||||
|
String( SdResId( STR_STOP ) ) );
|
||||||
|
|
||||||
|
mbLabelPlaying = TRUE;
|
||||||
|
}
|
||||||
|
catch( css::lang::IllegalArgumentException )
|
||||||
|
{
|
||||||
|
#ifdef DBG_UTIL
|
||||||
|
DBG_ERROR( "Cannot access play button" );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
IMPL_LINK( SdFileDialog_Imp, StopMusicHdl, void *, EMPTYARG )
|
IMPL_LINK( SdFileDialog_Imp, StopMusicHdl, void *, EMPTYARG )
|
||||||
{
|
{
|
||||||
|
@ -304,6 +320,7 @@ void SdFileDialog_Imp::CheckSelectionState()
|
||||||
SdFileDialog_Imp::SdFileDialog_Imp( const short nDialogType,
|
SdFileDialog_Imp::SdFileDialog_Imp( const short nDialogType,
|
||||||
sal_Bool bUsableSelection ) :
|
sal_Bool bUsableSelection ) :
|
||||||
FileDialogHelper( nDialogType, 0 ),
|
FileDialogHelper( nDialogType, 0 ),
|
||||||
|
mnPlaySoundEvent( 0 ),
|
||||||
mbUsableSelection( bUsableSelection ),
|
mbUsableSelection( bUsableSelection ),
|
||||||
mbLabelPlaying(FALSE)
|
mbLabelPlaying(FALSE)
|
||||||
{
|
{
|
||||||
|
@ -348,6 +365,8 @@ SdFileDialog_Imp::SdFileDialog_Imp( const short nDialogType,
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
SdFileDialog_Imp::~SdFileDialog_Imp()
|
SdFileDialog_Imp::~SdFileDialog_Imp()
|
||||||
{
|
{
|
||||||
|
if( mnPlaySoundEvent )
|
||||||
|
Application::RemoveUserEvent( mnPlaySoundEvent );
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
Loading…
Reference in a new issue