Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc
  • chouquette/vlc
  • bakiewicz.marek122/vlc
  • devnexen/vlc
  • rohanrajpal/vlc
  • blurrrb/vlc
  • gsoc/gsoc2019/darkapex/vlc
  • b1ue/vlc
  • fkuehne/vlc
  • magsoft/vlc
  • chub/vlc
  • cramiro9/vlc
  • robUx4/vlc
  • rom1v/vlc
  • akshayaky/vlc
  • tmk907/vlc
  • akymaster/vlc
  • govind.sharma/vlc
  • psilokos/vlc
  • xjbeta/vlc
  • jahan/vlc
  • 1480c1/vlc
  • amanchande/vlc
  • aaqib/vlc
  • rist/vlc
  • apol/vlc
  • mindfreeze/vlc
  • alexandre-janniaux/vlc
  • sandsmark/vlc
  • jagannatharjun/vlc
  • gsoc/gsoc2020/matiaslgonzalez/vlc
  • gsoc/gsoc2020/jagannatharjun/vlc
  • mstorsjo/vlc
  • gsoc/gsoc2020/vedenta/vlc
  • gsoc/gsoc2020/arnav-ishaan/vlc
  • gsoc/gsoc2020/andreduong/vlc
  • fuzun/vlc
  • gsoc/gsoc2020/vatsin/vlc
  • gsoc/gsoc2020/sagid/vlc
  • yaron/vlc
  • Phoenix/vlc
  • Garf/vlc
  • ePiratWorkarounds/vlc
  • tguillem/vlc
  • jnqnfe/vlc
  • mdc/vlc
  • Vedaa/vlc
  • rasa/vlc
  • quink/vlc
  • yealo/vlc
  • aleksey_ak/vlc
  • ePirat/vlc
  • ilya.yanok/vlc
  • asenat/vlc
  • m/vlc
  • bunjee/vlc
  • BLumia/vlc
  • sagudev/vlc
  • hamedmonji30/vlc
  • nullgemm/vlc
  • DivyamAhuja/vlc
  • thesamesam/vlc
  • dag7/vlc
  • snehil101/vlc
  • haasn/vlc
  • jbk/vlc
  • ValZapod/vlc
  • mfkl/vlc
  • WangChuan/vlc
  • core1024/vlc
  • GhostVaibhav/vlc
  • dfuhrmann/vlc
  • davide.prade/vlc
  • tmatth/vlc
  • Courmisch/vlc
  • zouya/vlc
  • hpi/vlc
  • EwoutH/vlc
  • aleung27/vlc
  • hengwu0/vlc
  • saladin/vlc
  • ashuio/vlc
  • richselwood/vlc
  • verma16Ayush/vlc
  • chemicalflash/vlc
  • PoignardAzur/vlc
  • huangjieNT/vlc
  • Blake-Haydon/vlc
  • AnuthaDev/vlc
  • gsoc/gsoc2021/mpd/vlc
  • nicolas_lequec/vlc
  • sambassaly/vlc
  • thresh/vlc
  • bonniegong/vlc
  • myaashish/vlc
  • stavros.vagionitis/vlc
  • ileoo/vlc
  • louis-santucci/vlc
  • cchristiansen/vlc
  • sabyasachi07/vlc
  • AbduAmeen/vlc
  • ashishb0410/vlc
  • urbanhusky/vlc
  • davidepietrasanta/vlc
  • riksleutelstad/vlc
  • jeremyVignelles/vlc
  • komh/vlc
  • iamjithinjohn/vlc
  • JohannesKauffmann/vlc2
  • kunglao/vlc
  • natzberg/vlc
  • jill/vlc
  • cwendling/vlc
  • adufou/vlc
  • ErwanAirone/vlc
  • HasinduDilshan10/vlc
  • vagrantc/vlc
  • rafiv/macos-bigsur-icon
  • Aymeriic/vlc
  • saranshg20/vlc
  • metzlove24/vlc
  • linkfanel/vlc
  • Ds886/vlc
  • metehan-arslan/vlc
  • Skantes/vlc
  • kgsandundananjaya96/vlc
  • mitchcapper/vlc
  • advaitgupta/vlc
  • StefanBruens/vlc
  • ratajs/vlc
  • T.M.F.B.3761/vlc
  • m222059/vlc
  • casemerrick/vlc
  • joshuaword2alt/vlc
  • sjwaddy/vlc
  • dima/vlc
  • Ybalrid/vlc
  • umxprime/vlc
  • eschmidt/vlc
  • vannieuwenhuysenmichelle/vlc
  • badcf00d/vlc
  • wesinator/vlc
  • louis/vlc
  • xqq/vlc
  • EmperorYP7/vlc
  • NicoLiam/vlc
  • loveleen/vlc
  • rofferom/vlc
  • rbultje/vlc
  • TheUnamed/vlc
  • pratiksharma341/vlc
  • Saurab17/vlc
  • purist.coder/vlc
  • Shuicheng/vlc
  • mdrrubel292/vlc
  • silverbleu00/vlc
  • metif12/vlc
  • asher-m/vlc
  • jeffk/vlc
  • Brandonbr1/vlc
  • beautyyuyanli/vlc
  • rego21/vlc
  • muyangren907/vlc
  • collectionbylawrencejason/vlc
  • evelez/vlc
  • GSMgeeth/vlc
  • Oneric/vlc
  • TJ5/vlc
  • XuanTung95/vlc
  • darrenjenny21/vlc
  • Trenly/vlc
  • RockyTDR/vlc
  • mjakubowski/vlc
  • caprica/vlc
  • ForteFrankie/vlc
  • seannamiller19/vlc
  • junlon2006/vlc
  • kiwiren6666/vlc
  • iuseiphonexs/vlc
  • fenngtun/vlc
  • Rajdutt999/vlc
  • typx/vlc
  • leon.vitanos/vlc
  • robertogarci0938/vlc
  • gsoc/gsoc2022/luc65r/vlc-mpd
  • skeller/vlc
  • MCJack123/vlc
  • luc65r/vlc-mpd
  • popov895/vlc
  • claucambra/vlc
  • brad/vlc
  • matthewmurua88/vlc
  • Tomas8874/vlc
  • philenotfound/vlc
  • makita-do3/vlc
  • LZXCorp/vlc
  • mar0x/vlc
  • senojetkennedy0102/vlc
  • shaneb243/vlc
  • ahmadbader/vlc
  • rajduttcse26/vlc-audio-filters
  • Juniorzito8415/vlc
  • achernyakov/vlc
  • lucasjetgroup/vlc
  • pupdoggy666/vlc
  • gmde9363/vlc
  • alexnwayne/vlc
  • bahareebrahimi781/vlc
  • hamad633666/vlc
  • umghof3112/vlc
  • joe0199771874/vlc
  • Octocats66666666/vlc
  • jjm_223/vlc
  • btech10110.19/vlc
  • sunnykfc028/vlc-audio-filters
  • loic/vlc
  • nguyenminhducmx1/vlc
  • JanekKrueger/vlc
  • bstubbington2/vlc
  • rcombs/vlc
  • Ordissimo/vlc
  • king7532/vlc
  • noobsauce101/vlc
  • schong0525/vlc
  • myQwil/vlc
  • apisbg91/vlc
  • geeboy0101017/vlc
  • kim.faughey/vlc
  • nurupo/vlc
  • yyusea/vlc
  • 0711235879.khco/vlc
  • ialo/vlc
  • iloveyeye2/vlc
  • gdtdftdqtd/vlc
  • leandroconsiglio/vlc
  • AndyHTML2012/vlc
  • ncz/vlc
  • lucenticus/vlc
  • knr1931/vlc
  • kjoonlee/vlc
  • chandrakant100/vlc-qt
  • johge42/vlc
  • polter/vlc
  • hexchain/vlc
  • Tushwrld/vlc
  • mztea928/vlc
  • jbelloncastro/vlc
  • alvinhochun/vlc
  • ghostpiratecrow/vlc
  • ujjwaltwitx/vlc
  • alexsonarin06/vlc
  • adrianbon76/vlc
  • altsod/vlc
  • damien.lucas44/vlc
  • dmytrivtaisa/vlc
  • utk202/vlc
  • aaxhrj/vlc
  • thomas.hermes/vlc
  • structurenewworldorder/vlc
  • slomo/vlc
  • wantlamy/vlc
  • musc.o3cminc/vlc
  • thebarshablog/vlc
  • kerrick/vlc
  • kratos142518/vlc
  • leogps/vlc
  • vacantron/vlc
  • luna_koly/vlc
  • Ratio2/vlc
  • anuoshemohammad/vlc
  • apsun/vlc
  • aaa1115910/vlc
  • alimotmoyo/vlc
  • Ambossmann/vlc
  • Sam-LearnsToCode/vlc
  • Chilledheart/vlc
  • Labnann/vlc
  • ktcoooot1/vlc
  • mohit-marathe/vlc
  • johnddx/vlc
  • manstabuk/vlc
  • Omar-ahmed314/vlc
  • vineethkm/vlc
  • 9Enemi86/vlc
  • radoslav.m.panteleev/vlc
  • ashishami2002/vlc
  • Corbax/vlc
  • firnasahmed/vlc
  • pelayarmalam4/vlc
  • c0ff330k/vlc
  • shikhindahikar/vlc
  • l342723951/vlc
  • christianschwandner/vlc
  • douniwan5788/vlc
  • 7damian7/vlc
  • ferdnyc/vlc
  • f.ales1/vlc
  • pandagby/vlc
  • BaaBaa/vlc
  • jewe37/vlc
  • w00drow/vlc
  • russelltg/vlc
  • ironicallygod/vlc
  • soumyaDghosh/vlc
  • linzihao1999/vlc
  • deyayush6/vlc
  • mibi88/vlc
  • newabdallah10/vlc
  • jhorbincolombia/vlc
  • rimvihaqueshupto/vlc
  • andrewkhon98/vlc
  • fab78/vlc
  • lapaz17/vlc
  • amanna13/vlc
  • mdakram28/vlc
  • 07jw1980/vlc
  • sohamgupta/vlc
  • Eson-Jia1/vlc
  • Sumou/vlc
  • vikram-kangotra/vlc
  • chalice191/vlc
  • olivercalder/vlc
  • aaasg4001/vlc
  • zipdox/vlc
  • kwizart/vlc
  • Dragon-S/vlc
  • jdemeule/vlc
  • gabriel_lt/vlc
  • locutusofborg/vlc
  • sammirata/vlc-librist
  • another/vlc
  • Benjamin_Loison/vlc
  • ahmedmoselhi/vlc
  • petergaal/vlc
  • huynhsontung/vlc
  • dariusmihut/vlc
  • tvermaashutosh/vlc
  • buti/vlc
  • Niram7777/vlc
  • rohan-here/vlc
  • balaji-sivasakthi/vlc
  • rlindner81/vlc
  • Kakadus/vlc
  • djain/vlc
  • ABBurmeister/vlc
  • craighuggins/vlc
  • orbea/vlc
  • maxos/vlc
  • aakarshmj/vlc
  • kblaschke/vlc
  • ankitm/vlc
  • advait-0/vlc
  • mohak2003/vlc
  • yselkowitz/vlc
  • AZM999/vlc-azm
  • andrey.turkin/vlc
  • Disha-Baghel/vlc
  • nowrep/vlc
  • Apeng/vlc
  • Choucroute_melba/vlc
  • autra/vlc
  • eclipseo/vlc
  • fhuber/vlc
  • olafhering/vlc
  • sdasda7777/vlc
  • 1div0/vlc
  • skosnits/vlc-extended-playlist-support
  • dnicolson/vlc
  • Timshel/vlc
  • octopols/vlc
  • MangalK/vlc
  • nima64/vlc
  • misawai/vlc
  • Alexander-Wilms/vlc
  • Maxime2/vlc-fork-for-visualizer
  • ww/vlc
  • jeske/vlc
  • sgross-emlix/vlc
  • morenonatural/vlc
  • freakingLovesVLC/vlc
  • borisgolovnev/vlc
  • mpromonet/vlc
  • diogo.simao-marques/vlc
  • masstock/vlc
  • pratikpatel8982/vlc
  • hugok79/vlc
  • longervision/vlc
  • abhiudaysurya/vlc
  • rishabhgarg/vlc
  • tumic/vlc
  • cart/vlc
  • shubham442/vlc
  • Aditya692005/vlc
  • sammirata/vlc4
  • syrykh/vlc
  • Vvorcun/macos-new-icon
  • AyaanshC/vlc
  • nasso/vlc
  • Quark/vlc
  • sebastinas/vlc
  • rhstone/vlc
  • talregev/vlc
  • Managor/vlc
403 results
Show changes
Commits on Source (2)
......@@ -33,6 +33,7 @@ Core:
Audio output:
* ALSA: HDMI passthrough support.
Use --alsa-passthrough to configure S/PDIF or HDMI passthrough.
* Remove the DirectSound plugin (API obsolete after Windows 7)
Demuxer:
* Support for HEIF image and grid image formats
......
......@@ -73,13 +73,6 @@ aout_LTLIBRARIES += libwinstore_plugin.la
endif
endif
libdirectsound_plugin_la_SOURCES = audio_output/directsound.c \
audio_output/windows_audio_common.h
libdirectsound_plugin_la_LIBADD = -ldsound $(LIBCOM)
if HAVE_WIN32_DESKTOP
aout_LTLIBRARIES += libdirectsound_plugin.la
endif
libkai_plugin_la_SOURCES = audio_output/kai.c
libkai_plugin_la_LIBADD = $(KAI_LIBS)
if HAVE_KAI
......
/*****************************************************************************
* directsound.c: DirectSound audio output plugin for VLC
*****************************************************************************
* Copyright (C) 2001-2009 VLC authors and VideoLAN
*
* Authors: Gildas Bazin <gbazin@videolan.org>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* 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
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation, Inc.,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <assert.h>
#include <math.h>
#include <vlc_common.h>
#include <vlc_plugin.h>
#include <vlc_aout.h>
#include <vlc_charset.h>
#include "audio_output/windows_audio_common.h"
#include "audio_output/mmdevice.h"
#include <mmdeviceapi.h>
#define DS_BUF_SIZE (6*1024*1024)
static int Open( vlc_object_t * );
static void Close( vlc_object_t * );
static HRESULT StreamStart( aout_stream_t *, audio_sample_format_t *,
const GUID * );
static void * PlayedDataEraser( void * );
/* Speaker setup override options list */
static const char *const speaker_list[] = { N_("Windows default"), N_("Mono"), N_("Stereo"),
N_("Quad"), N_("5.1"), N_("7.1") };
/*****************************************************************************
* Module descriptor
*****************************************************************************/
#define DEVICE_TEXT N_("Output device")
#define DEVICE_LONGTEXT N_("Select your audio output device")
#define SPEAKER_TEXT N_("Speaker configuration")
#define SPEAKER_LONGTEXT N_("Select speaker configuration you want to use. " \
"This option doesn't upmix! So NO e.g. Stereo -> 5.1 conversion." )
#define VOLUME_TEXT N_("Audio volume")
#define VOLUME_LONGTEXT N_("Audio volume in hundredths of decibels (dB).")
vlc_module_begin ()
set_description( N_("DirectX audio output") )
set_shortname( "DirectX" )
set_capability( "audio output", 100 )
set_subcategory( SUBCAT_AUDIO_AOUT )
add_shortcut( "directx", "aout_directx", "directsound", "dsound" )
add_string( "directx-audio-device", NULL,
DEVICE_TEXT, DEVICE_LONGTEXT )
add_bool( "directx-audio-float32", true, FLOAT_TEXT,
FLOAT_LONGTEXT )
add_string( "directx-audio-speaker", "Windows default",
SPEAKER_TEXT, SPEAKER_LONGTEXT )
change_string_list( speaker_list, speaker_list )
add_float( "directx-volume", 1.0f,
VOLUME_TEXT, VOLUME_LONGTEXT )
change_float_range( 0.f, 2.f )
set_callbacks( Open, Close )
add_submodule()
set_capability( "aout stream", 30 )
set_callback( StreamStart )
vlc_module_end ()
typedef struct aout_stream_sys
{
LPDIRECTSOUND p_dsobject; /*< main Direct Sound object */
LPDIRECTSOUNDBUFFER p_dsbuffer; /*< the sound buffer we use (direct sound
takes care of mixing all the secondary
buffers into the primary) */
LPDIRECTSOUNDNOTIFY p_notify;
int i_bytes_per_sample; /*< Size in bytes of one frame */
int i_rate; /*< Sample rate */
uint8_t chans_to_reorder; /*< Do we need channel reordering? */
uint8_t chan_table[AOUT_CHAN_MAX];
uint32_t i_channel_mask;
vlc_fourcc_t format;
size_t i_write;
size_t i_last_read;
int64_t i_data;
bool b_playing;
vlc_mutex_t lock;
vlc_cond_t cond;
vlc_thread_t eraser_thread;
} aout_stream_sys_t;
/**
* DirectSound audio output method descriptor
*
* This structure is part of the audio output thread descriptor.
* It describes the direct sound specific properties of an audio device.
*/
typedef struct
{
aout_stream_sys_t s;
struct
{
float volume;
LONG mb;
bool mute;
} volume;
} aout_sys_t;
static HRESULT Flush( aout_stream_sys_t *sys );
static HRESULT TimeGet( aout_stream_sys_t *sys, vlc_tick_t *delay )
{
DWORD read, status;
HRESULT hr;
ssize_t size;
hr = IDirectSoundBuffer_GetStatus( sys->p_dsbuffer, &status );
if( hr != DS_OK )
return hr;
if( !(status & DSBSTATUS_PLAYING) )
return DSERR_INVALIDCALL ;
hr = IDirectSoundBuffer_GetCurrentPosition( sys->p_dsbuffer, &read, NULL );
if( hr != DS_OK )
return hr;
size = (ssize_t)read - sys->i_last_read;
/* GetCurrentPosition cannot be trusted if the return doesn't change
* Just return an error */
if( size == 0 )
return DSERR_GENERIC ;
else if( size < 0 )
size += DS_BUF_SIZE;
sys->i_data -= size;
sys->i_last_read = read;
if( sys->i_data < 0 )
/* underrun */
Flush(sys);
*delay = vlc_tick_from_samples( sys->i_data / sys->i_bytes_per_sample, sys->i_rate );
return DS_OK;
}
static HRESULT StreamTimeGet( aout_stream_t *s, vlc_tick_t *delay )
{
return TimeGet( s->sys, delay );
}
static int OutputTimeGet( audio_output_t *aout, vlc_tick_t *delay )
{
aout_sys_t *sys = aout->sys;
return (TimeGet( &sys->s, delay ) == DS_OK) ? 0 : -1;
}
/**
* Fills in one of the DirectSound frame buffers.
*
* @return VLC_SUCCESS on success.
*/
static HRESULT FillBuffer( vlc_object_t *obj, aout_stream_sys_t *p_sys,
block_t *p_buffer )
{
size_t towrite = (p_buffer != NULL) ? p_buffer->i_buffer : DS_BUF_SIZE;
void *p_write_position, *p_wrap_around;
unsigned long l_bytes1, l_bytes2;
HRESULT dsresult;
vlc_mutex_lock( &p_sys->lock );
/* Before copying anything, we have to lock the buffer */
dsresult = IDirectSoundBuffer_Lock(
p_sys->p_dsbuffer, /* DS buffer */
p_sys->i_write, /* Start offset */
towrite, /* Number of bytes */
&p_write_position, /* Address of lock start */
&l_bytes1, /* Count of bytes locked before wrap around */
&p_wrap_around, /* Buffer address (if wrap around) */
&l_bytes2, /* Count of bytes after wrap around */
0 ); /* Flags: DSBLOCK_FROMWRITECURSOR is buggy */
if( dsresult == DSERR_BUFFERLOST )
{
IDirectSoundBuffer_Restore( p_sys->p_dsbuffer );
dsresult = IDirectSoundBuffer_Lock(
p_sys->p_dsbuffer,
p_sys->i_write,
towrite,
&p_write_position,
&l_bytes1,
&p_wrap_around,
&l_bytes2,
0 );
}
if( dsresult != DS_OK )
{
msg_Warn( obj, "cannot lock buffer" );
if( p_buffer != NULL )
block_Release( p_buffer );
vlc_mutex_unlock( &p_sys->lock );
return dsresult;
}
if( p_buffer == NULL )
{
memset( p_write_position, 0, l_bytes1 );
memset( p_wrap_around, 0, l_bytes2 );
}
else
{
if( p_sys->chans_to_reorder ) /* Do the channel reordering here */
aout_ChannelReorder( p_buffer->p_buffer, p_buffer->i_buffer,
p_sys->chans_to_reorder, p_sys->chan_table,
p_sys->format );
memcpy( p_write_position, p_buffer->p_buffer, l_bytes1 );
if( p_wrap_around && l_bytes2 )
memcpy( p_wrap_around, p_buffer->p_buffer + l_bytes1, l_bytes2 );
if( unlikely( ( l_bytes1 + l_bytes2 ) < p_buffer->i_buffer ) )
msg_Err( obj, "Buffer overrun");
block_Release( p_buffer );
}
/* Now the data has been copied, unlock the buffer */
IDirectSoundBuffer_Unlock( p_sys->p_dsbuffer, p_write_position, l_bytes1,
p_wrap_around, l_bytes2 );
p_sys->i_write += towrite;
p_sys->i_write %= DS_BUF_SIZE;
p_sys->i_data += towrite;
vlc_mutex_unlock( &p_sys->lock );
return DS_OK;
}
static HRESULT Play( vlc_object_t *obj, aout_stream_sys_t *sys,
block_t *p_buffer )
{
HRESULT dsresult;
dsresult = FillBuffer( obj, sys, p_buffer );
if( dsresult != DS_OK )
return dsresult;
/* start playing the buffer */
dsresult = IDirectSoundBuffer_Play( sys->p_dsbuffer, 0, 0,
DSBPLAY_LOOPING );
if( dsresult == DSERR_BUFFERLOST )
{
IDirectSoundBuffer_Restore( sys->p_dsbuffer );
dsresult = IDirectSoundBuffer_Play( sys->p_dsbuffer,
0, 0, DSBPLAY_LOOPING );
}
if( dsresult != DS_OK )
msg_Err( obj, "cannot start playing buffer: (hr=0x%lX)", dsresult );
else
{
vlc_mutex_lock( &sys->lock );
sys->b_playing = true;
vlc_cond_signal(&sys->cond);
vlc_mutex_unlock( &sys->lock );
}
return dsresult;
}
static HRESULT StreamPlay( aout_stream_t *s, block_t *block, vlc_tick_t date )
{
(void) date;
return Play( VLC_OBJECT(s), s->sys, block );
}
static void OutputPlay( audio_output_t *aout, block_t *block, vlc_tick_t date )
{
aout_sys_t *sys = aout->sys;
Play( VLC_OBJECT(aout), &sys->s, block );
(void) date;
}
static HRESULT Pause( aout_stream_sys_t *sys, bool pause )
{
HRESULT hr;
if( pause )
hr = IDirectSoundBuffer_Stop( sys->p_dsbuffer );
else
hr = IDirectSoundBuffer_Play( sys->p_dsbuffer, 0, 0, DSBPLAY_LOOPING );
if( hr == DS_OK )
{
vlc_mutex_lock( &sys->lock );
sys->b_playing = !pause;
if( sys->b_playing )
vlc_cond_signal( &sys->cond );
vlc_mutex_unlock( &sys->lock );
}
return hr;
}
static HRESULT StreamPause( aout_stream_t *s, bool pause )
{
return Pause( s->sys, pause );
}
static void OutputPause( audio_output_t *aout, bool pause, vlc_tick_t date )
{
aout_sys_t *sys = aout->sys;
Pause( &sys->s, pause );
(void) date;
}
static HRESULT Flush( aout_stream_sys_t *sys )
{
HRESULT ret = IDirectSoundBuffer_Stop( sys->p_dsbuffer );
if( ret == DS_OK )
{
vlc_mutex_lock(&sys->lock);
sys->i_data = 0;
sys->i_last_read = sys->i_write;
IDirectSoundBuffer_SetCurrentPosition( sys->p_dsbuffer, sys->i_write);
sys->b_playing = false;
vlc_mutex_unlock(&sys->lock);
}
return ret;
}
static HRESULT StreamFlush( aout_stream_t *s )
{
return Flush( s->sys );
}
static void OutputFlush( audio_output_t *aout )
{
aout_sys_t *sys = aout->sys;
Flush( &sys->s );
}
/**
* Creates a DirectSound buffer of the required format.
*
* This function creates the buffer we'll use to play audio.
* In DirectSound there are two kinds of buffers:
* - the primary buffer: which is the actual buffer that the soundcard plays
* - the secondary buffer(s): these buffers are the one actually used by
* applications and DirectSound takes care of mixing them into the primary.
*
* Once you create a secondary buffer, you cannot change its format anymore so
* you have to release the current one and create another.
*/
static HRESULT CreateDSBuffer( vlc_object_t *obj, aout_stream_sys_t *sys,
int i_format, int i_channels, int i_nb_channels,
int i_rate, bool b_probe )
{
WAVEFORMATEXTENSIBLE waveformat;
DSBUFFERDESC dsbdesc;
HRESULT hr;
void *pv = NULL;
/* First set the sound buffer format */
waveformat.dwChannelMask = 0;
for( unsigned i = 0; pi_vlc_chan_order_wg4[i]; i++ )
if( i_channels & pi_vlc_chan_order_wg4[i] )
waveformat.dwChannelMask |= pi_channels_in[i];
switch( i_format )
{
case VLC_CODEC_SPDIFL:
i_nb_channels = 2;
/* To prevent channel re-ordering */
waveformat.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT;
waveformat.Format.wBitsPerSample = 16;
waveformat.Samples.wValidBitsPerSample =
waveformat.Format.wBitsPerSample;
waveformat.Format.wFormatTag = WAVE_FORMAT_DOLBY_AC3_SPDIF;
waveformat.SubFormat = _KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF;
break;
case VLC_CODEC_FL32:
waveformat.Format.wBitsPerSample = sizeof(float) * 8;
waveformat.Samples.wValidBitsPerSample =
waveformat.Format.wBitsPerSample;
waveformat.Format.wFormatTag = WAVE_FORMAT_IEEE_FLOAT;
waveformat.SubFormat = _KSDATAFORMAT_SUBTYPE_IEEE_FLOAT;
break;
case VLC_CODEC_S16N:
waveformat.Format.wBitsPerSample = 16;
waveformat.Samples.wValidBitsPerSample =
waveformat.Format.wBitsPerSample;
waveformat.Format.wFormatTag = WAVE_FORMAT_PCM;
waveformat.SubFormat = _KSDATAFORMAT_SUBTYPE_PCM;
break;
}
waveformat.Format.nChannels = i_nb_channels;
waveformat.Format.nSamplesPerSec = i_rate;
waveformat.Format.nBlockAlign =
waveformat.Format.wBitsPerSample / 8 * i_nb_channels;
waveformat.Format.nAvgBytesPerSec =
waveformat.Format.nSamplesPerSec * waveformat.Format.nBlockAlign;
sys->i_bytes_per_sample = waveformat.Format.nBlockAlign;
sys->format = i_format;
/* Then fill in the direct sound descriptor */
memset(&dsbdesc, 0, sizeof(DSBUFFERDESC));
dsbdesc.dwSize = sizeof(DSBUFFERDESC);
dsbdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 /* Better position accuracy */
| DSBCAPS_GLOBALFOCUS /* Allows background playing */
| DSBCAPS_CTRLVOLUME /* Allows volume control */
| DSBCAPS_CTRLPOSITIONNOTIFY; /* Allow position notifications */
/* Only use the new WAVE_FORMAT_EXTENSIBLE format for multichannel audio */
if( i_nb_channels <= 2 )
{
waveformat.Format.cbSize = 0;
}
else
{
waveformat.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
waveformat.Format.cbSize =
sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
/* Needed for 5.1 on emu101k */
dsbdesc.dwFlags |= DSBCAPS_LOCHARDWARE;
}
dsbdesc.dwBufferBytes = DS_BUF_SIZE; /* buffer size */
dsbdesc.lpwfxFormat = (WAVEFORMATEX *)&waveformat;
/* CreateSoundBuffer doesn't allow volume control for non-PCM buffers */
if ( i_format == VLC_CODEC_SPDIFL )
dsbdesc.dwFlags &= ~DSBCAPS_CTRLVOLUME;
hr = IDirectSound_CreateSoundBuffer( sys->p_dsobject, &dsbdesc,
&sys->p_dsbuffer, NULL );
if( FAILED(hr) )
{
if( !(dsbdesc.dwFlags & DSBCAPS_LOCHARDWARE) )
return hr;
/* Try without DSBCAPS_LOCHARDWARE */
dsbdesc.dwFlags &= ~DSBCAPS_LOCHARDWARE;
hr = IDirectSound_CreateSoundBuffer( sys->p_dsobject, &dsbdesc,
&sys->p_dsbuffer, NULL );
if( FAILED(hr) )
return hr;
if( !b_probe )
msg_Dbg( obj, "couldn't use hardware sound buffer" );
}
/* Stop here if we were just probing */
if( b_probe )
{
IDirectSoundBuffer_Release( sys->p_dsbuffer );
sys->p_dsbuffer = NULL;
return DS_OK;
}
sys->i_rate = i_rate;
sys->i_channel_mask = waveformat.dwChannelMask;
sys->chans_to_reorder =
aout_CheckChannelReorder( pi_channels_in, pi_channels_out,
waveformat.dwChannelMask, sys->chan_table );
if( sys->chans_to_reorder )
msg_Dbg( obj, "channel reordering needed" );
hr = IDirectSoundBuffer_QueryInterface( sys->p_dsbuffer,
&IID_IDirectSoundNotify, &pv );
sys->p_notify = pv;
if( hr != DS_OK )
{
msg_Err( obj, "Couldn't query IDirectSoundNotify" );
sys->p_notify = NULL;
}
FillBuffer( obj, sys, NULL );
return DS_OK;
}
/**
* Creates a PCM DirectSound buffer.
*
* We first try to create a WAVE_FORMAT_IEEE_FLOAT buffer if supported by
* the hardware, otherwise we create a WAVE_FORMAT_PCM buffer.
*/
static HRESULT CreateDSBufferPCM( vlc_object_t *obj, aout_stream_sys_t *sys,
vlc_fourcc_t *i_format, int i_channels,
int i_rate, bool b_probe )
{
HRESULT hr;
unsigned i_nb_channels = vlc_popcount( i_channels );
if( var_GetBool( obj, "directx-audio-float32" ) )
{
hr = CreateDSBuffer( obj, sys, VLC_CODEC_FL32, i_channels,
i_nb_channels, i_rate, b_probe );
if( hr == DS_OK )
{
*i_format = VLC_CODEC_FL32;
return DS_OK;
}
}
hr = CreateDSBuffer( obj, sys, VLC_CODEC_S16N, i_channels, i_nb_channels,
i_rate, b_probe );
if( hr == DS_OK )
{
*i_format = VLC_CODEC_S16N;
return DS_OK;
}
return hr;
}
/**
* Closes the audio device.
*/
static HRESULT Stop( aout_stream_sys_t *p_sys )
{
vlc_mutex_lock( &p_sys->lock );
p_sys->b_playing = true;
vlc_cond_signal( &p_sys->cond );
vlc_mutex_unlock( &p_sys->lock );
vlc_cancel( p_sys->eraser_thread );
vlc_join( p_sys->eraser_thread, NULL );
if( p_sys->p_notify != NULL )
{
IDirectSoundNotify_Release(p_sys->p_notify );
p_sys->p_notify = NULL;
}
if( p_sys->p_dsbuffer != NULL )
{
IDirectSoundBuffer_Stop( p_sys->p_dsbuffer );
IDirectSoundBuffer_Release( p_sys->p_dsbuffer );
p_sys->p_dsbuffer = NULL;
}
if( p_sys->p_dsobject != NULL )
{
IDirectSound_Release( p_sys->p_dsobject );
p_sys->p_dsobject = NULL;
}
return DS_OK;
}
static void StreamStop( aout_stream_t *s )
{
Stop( s->sys );
free( s->sys );
}
static void OutputStop( audio_output_t *aout )
{
msg_Dbg( aout, "closing audio device" );
aout_sys_t *sys = aout->sys;
Stop( &sys->s );
}
static HRESULT Start( vlc_object_t *obj, aout_stream_sys_t *sys,
audio_sample_format_t *restrict pfmt )
{
if( aout_FormatNbChannels( pfmt ) == 0 )
return E_FAIL;
#ifndef VLC_WINSTORE_APP
/* Set DirectSound Cooperative level, ie what control we want over Windows
* sound device. In our case, DSSCL_EXCLUSIVE means that we can modify the
* settings of the primary buffer, but also that only the sound of our
* application will be hearable when it will have the focus.
* !!! (this is not really working as intended yet because to set the
* cooperative level you need the window handle of your application, and
* I don't know of any easy way to get it. Especially since we might play
* sound without any video, and so what window handle should we use ???
* The hack for now is to use the Desktop window handle - it seems to be
* working */
if( IDirectSound_SetCooperativeLevel( sys->p_dsobject, GetDesktopWindow(),
DSSCL_EXCLUSIVE) )
msg_Warn( obj, "cannot set direct sound cooperative level" );
#endif
if( AOUT_FMT_HDMI( pfmt ) )
return E_FAIL;
audio_sample_format_t fmt = *pfmt;
const char *const *ppsz_compare = speaker_list;
char *psz_speaker;
int i = 0;
HRESULT hr = DSERR_UNSUPPORTED;
/* Retrieve config values */
var_Create( obj, "directx-audio-float32",
VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
psz_speaker = var_CreateGetString( obj, "directx-audio-speaker" );
while ( *ppsz_compare != NULL )
{
if ( !strncmp( *ppsz_compare, psz_speaker, strlen(*ppsz_compare) ) )
{
break;
}
ppsz_compare++; i++;
}
if ( *ppsz_compare == NULL )
{
msg_Err( obj, "(%s) isn't valid speaker setup option", psz_speaker );
msg_Err( obj, "Defaulting to Windows default speaker config");
i = 0;
}
free( psz_speaker );
vlc_mutex_init(&sys->lock);
vlc_cond_init(&sys->cond);
if( AOUT_FMT_SPDIF( &fmt ) )
{
if( var_InheritBool( obj, "spdif" ) )
hr = CreateDSBuffer( obj, sys, VLC_CODEC_SPDIFL,
fmt.i_physical_channels,
aout_FormatNbChannels(&fmt), fmt.i_rate, false );
if( hr == DS_OK )
{
msg_Dbg( obj, "using A/52 pass-through over S/PDIF" );
fmt.i_format = VLC_CODEC_SPDIFL;
/* Calculate the frame size in bytes */
fmt.i_bytes_per_frame = AOUT_SPDIF_SIZE;
fmt.i_frame_length = A52_FRAME_NB;
}
else
return E_FAIL;
}
if( hr != DS_OK )
{
if( i == 0 )
{
DWORD ui_speaker_config;
int i_channels = 2; /* Default to stereo */
int i_orig_channels = aout_FormatNbChannels( &fmt );
/* Check the speaker configuration to determine which channel
* config should be the default */
hr = IDirectSound_GetSpeakerConfig( sys->p_dsobject,
&ui_speaker_config );
if( FAILED(hr) )
{
ui_speaker_config = DSSPEAKER_STEREO;
msg_Dbg( obj, "GetSpeakerConfig failed" );
}
const char *name = "Unknown";
switch( DSSPEAKER_CONFIG(ui_speaker_config) )
{
case DSSPEAKER_7POINT1:
case DSSPEAKER_7POINT1_SURROUND:
name = "7.1";
i_channels = 8;
break;
case DSSPEAKER_5POINT1:
case DSSPEAKER_5POINT1_SURROUND:
name = "5.1";
i_channels = 6;
break;
case DSSPEAKER_QUAD:
name = "Quad";
i_channels = 4;
break;
#if 0 /* Lots of people just get their settings wrong and complain that
* this is a problem with VLC so just don't ever set mono by default. */
case DSSPEAKER_MONO:
name = "Mono";
i_channels = 1;
break;
#endif
case DSSPEAKER_SURROUND:
name = "Surround";
i_channels = 4;
break;
case DSSPEAKER_STEREO:
name = "Stereo";
i_channels = 2;
break;
}
if( i_channels >= i_orig_channels )
i_channels = i_orig_channels;
msg_Dbg( obj, "%s speaker config: %s and stream has "
"%d channels, using %d channels", "Windows", name,
i_orig_channels, i_channels );
switch( i_channels )
{
case 8:
fmt.i_physical_channels = AOUT_CHANS_7_1;
break;
case 7:
case 6:
fmt.i_physical_channels = AOUT_CHANS_5_1;
break;
case 5:
case 4:
fmt.i_physical_channels = AOUT_CHANS_4_0;
break;
default:
fmt.i_physical_channels = AOUT_CHANS_2_0;
break;
}
}
else
{ /* Overridden speaker configuration */
const char *name = "Non-existent";
switch( i )
{
case 1: /* Mono */
name = "Mono";
fmt.i_physical_channels = AOUT_CHAN_CENTER;
break;
case 2: /* Stereo */
name = "Stereo";
fmt.i_physical_channels = AOUT_CHANS_2_0;
break;
case 3: /* Quad */
name = "Quad";
fmt.i_physical_channels = AOUT_CHANS_4_0;
break;
case 4: /* 5.1 */
name = "5.1";
fmt.i_physical_channels = AOUT_CHANS_5_1;
break;
case 5: /* 7.1 */
name = "7.1";
fmt.i_physical_channels = AOUT_CHANS_7_1;
break;
}
msg_Dbg( obj, "%s speaker config: %s", "VLC", name );
}
/* Open the device */
aout_FormatPrepare( &fmt );
hr = CreateDSBufferPCM( obj, sys, &fmt.i_format,
fmt.i_physical_channels, fmt.i_rate, false );
if( hr != DS_OK )
{
msg_Err( obj, "cannot open directx audio device" );
goto error;
}
}
int ret = vlc_clone(&sys->eraser_thread, PlayedDataEraser, (void*) obj);
if( unlikely( ret ) )
{
if( ret != ENOMEM )
msg_Err( obj, "Couldn't start eraser thread" );
hr = E_FAIL;
goto error;
}
fmt.channel_type = AUDIO_CHANNEL_TYPE_BITMAP;
*pfmt = fmt;
sys->b_playing = false;
sys->i_write = 0;
sys->i_last_read = 0;
sys->i_data = 0;
return DS_OK;
error:
if( sys->p_notify != NULL )
{
IDirectSoundNotify_Release( sys->p_notify );
sys->p_notify = NULL;
}
if( sys->p_dsbuffer != NULL )
{
IDirectSoundBuffer_Release( sys->p_dsbuffer );
sys->p_dsbuffer = NULL;
}
IDirectSound_Release( sys->p_dsobject );
sys->p_dsobject = NULL;
return hr;
}
static HRESULT StreamStart( aout_stream_t *s,
audio_sample_format_t *restrict fmt,
const GUID *sid )
{
aout_stream_sys_t *sys = calloc( 1, sizeof( *sys ) );
if( unlikely(sys == NULL) )
return E_OUTOFMEMORY;
void *pv;
HRESULT hr;
if( sid )
{
DIRECTX_AUDIO_ACTIVATION_PARAMS params = {
.cbDirectXAudioActivationParams = sizeof( params ),
.guidAudioSession = *sid,
.dwAudioStreamFlags = 0,
};
PROPVARIANT prop;
PropVariantInit( &prop );
prop.vt = VT_BLOB;
prop.blob.cbSize = sizeof( params );
prop.blob.pBlobData = (BYTE *)&params;
hr = aout_stream_Activate( s, &IID_IDirectSound, &prop, &pv );
}
else
hr = aout_stream_Activate( s, &IID_IDirectSound, NULL, &pv );
if( FAILED(hr) )
goto error;
sys->p_dsobject = pv;
hr = Start( VLC_OBJECT(s), sys, fmt );
if( FAILED(hr) )
goto error;
s->sys = sys;
s->time_get = StreamTimeGet;
s->play = StreamPlay;
s->pause = StreamPause;
s->flush = StreamFlush;
s->stop = StreamStop;
return S_OK;
error:
free( sys );
return hr;
}
/**
* Handles all the gory details of DirectSound initialization.
*/
static int InitDirectSound( audio_output_t *p_aout )
{
aout_sys_t *sys = p_aout->sys;
GUID guid, *p_guid = NULL;
char *dev = var_GetNonEmptyString( p_aout, "directx-audio-device" );
if( dev != NULL )
{
LPOLESTR lpsz = ToWide( dev );
free( dev );
if( SUCCEEDED( IIDFromString( lpsz, &guid ) ) )
p_guid = &guid;
else
msg_Err( p_aout, "bad device GUID: %ls", lpsz );
free( lpsz );
}
/* Create the direct sound object */
if FAILED( DirectSoundCreate( p_guid, &sys->s.p_dsobject, NULL ) )
{
msg_Warn( p_aout, "cannot create a direct sound device" );
goto error;
}
return VLC_SUCCESS;
error:
sys->s.p_dsobject = NULL;
return VLC_EGENERIC;
}
static int VolumeSet( audio_output_t *p_aout, float volume )
{
aout_sys_t *sys = p_aout->sys;
int ret = 0;
/* Directsound doesn't support amplification, so we use software
gain if we need it and only for this */
float gain = volume > 1.f ? volume * volume * volume : 1.f;
aout_GainRequest( p_aout, gain );
/* millibels from linear amplification */
LONG mb = lroundf( 6000.f * log10f( __MIN( volume, 1.f ) ));
/* Clamp to allowed DirectSound range */
static_assert( DSBVOLUME_MIN < DSBVOLUME_MAX, "DSBVOLUME_* confused" );
if( mb > DSBVOLUME_MAX )
{
mb = DSBVOLUME_MAX;
ret = -1;
}
if( mb <= DSBVOLUME_MIN )
mb = DSBVOLUME_MIN;
sys->volume.mb = mb;
sys->volume.volume = volume;
if( !sys->volume.mute && sys->s.p_dsbuffer != NULL &&
IDirectSoundBuffer_SetVolume( sys->s.p_dsbuffer, mb ) != DS_OK )
return -1;
/* Convert back to UI volume */
aout_VolumeReport( p_aout, volume );
if( var_InheritBool( p_aout, "volume-save" ) )
config_PutFloat( "directx-volume", volume );
return ret;
}
static int MuteSet( audio_output_t *p_aout, bool mute )
{
HRESULT res = DS_OK;
aout_sys_t *sys = p_aout->sys;
sys->volume.mute = mute;
if( sys->s.p_dsbuffer != NULL )
res = IDirectSoundBuffer_SetVolume( sys->s.p_dsbuffer,
mute? DSBVOLUME_MIN : sys->volume.mb );
aout_MuteReport( p_aout, mute );
return (res != DS_OK);
}
static int OutputStart( audio_output_t *p_aout,
audio_sample_format_t *restrict fmt )
{
msg_Dbg( p_aout, "Opening DirectSound Audio Output" );
/* Initialise DirectSound */
if( InitDirectSound( p_aout ) )
{
msg_Err( p_aout, "cannot initialize DirectSound" );
return -1;
}
aout_sys_t *sys = p_aout->sys;
HRESULT hr = Start( VLC_OBJECT(p_aout), &sys->s, fmt );
if( FAILED(hr) )
return -1;
/* Force volume update */
VolumeSet( p_aout, sys->volume.volume );
MuteSet( p_aout, sys->volume.mute );
/* then launch the notification thread */
p_aout->time_get = OutputTimeGet;
p_aout->play = OutputPlay;
p_aout->pause = OutputPause;
p_aout->flush = OutputFlush;
return 0;
}
typedef struct
{
unsigned count;
char **ids;
char **names;
} ds_list_t;
static int CALLBACK DeviceEnumCallback( LPGUID guid, LPCWSTR desc,
LPCWSTR mod, LPVOID data )
{
ds_list_t *list = data;
OLECHAR buf[48];
if( StringFromGUID2( guid, buf, 48 ) <= 0 )
return true;
list->count++;
list->ids = realloc_or_free( list->ids, list->count * sizeof(char *) );
if( list->ids == NULL )
return false;
list->names = realloc_or_free( list->names, list->count * sizeof(char *) );
if( list->names == NULL )
{
free( list->ids );
return false;
}
list->ids[list->count - 1] = FromWide( buf );
list->names[list->count - 1] = FromWide( desc );
(void) mod;
return true;
}
/**
* Stores the list of devices in preferences
*/
static int ReloadDirectXDevices( char const *psz_name,
char ***values, char ***descs )
{
ds_list_t list = {
.count = 1,
.ids = xmalloc(sizeof (char *)),
.names = xmalloc(sizeof (char *)),
};
list.ids[0] = xstrdup("");
list.names[0] = xstrdup(_("Default"));
(void) psz_name;
DirectSoundEnumerate( DeviceEnumCallback, &list );
*values = list.ids;
*descs = list.names;
return list.count;
}
VLC_CONFIG_STRING_ENUM(ReloadDirectXDevices)
static int DeviceSelect (audio_output_t *aout, const char *id)
{
var_SetString(aout, "directx-audio-device", (id != NULL) ? id : "");
aout_DeviceReport (aout, id);
aout_RestartRequest (aout, AOUT_RESTART_OUTPUT);
return 0;
}
static int Open(vlc_object_t *obj)
{
audio_output_t *aout = (audio_output_t *)obj;
aout_sys_t *sys = calloc(1, sizeof (*sys));
if (unlikely(sys == NULL))
return VLC_ENOMEM;
aout->sys = sys;
aout->start = OutputStart;
aout->stop = OutputStop;
aout->volume_set = VolumeSet;
aout->mute_set = MuteSet;
aout->device_select = DeviceSelect;
/* Volume */
sys->volume.volume = var_InheritFloat(aout, "directx-volume");
aout_VolumeReport(aout, sys->volume.volume );
MuteSet(aout, var_InheritBool(aout, "mute"));
/* DirectSound does not support hot-plug events (unless with WASAPI) */
char **ids, **names;
int count = ReloadDirectXDevices(NULL, &ids, &names);
msg_Dbg(obj, "found %d devices", count);
if (count >= 0)
{
for (int i = 0; i < count; i++)
{
aout_HotplugReport(aout, ids[i], names[i]);
free(names[i]);
free(ids[i]);
}
free(names);
free(ids);
}
char *dev = var_CreateGetNonEmptyString(aout, "directx-audio-device");
aout_DeviceReport(aout, dev);
free(dev);
return VLC_SUCCESS;
}
static void Close(vlc_object_t *obj)
{
audio_output_t *aout = (audio_output_t *)obj;
aout_sys_t *sys = aout->sys;
var_Destroy(aout, "directx-audio-device");
free(sys);
}
static void * PlayedDataEraser( void * data )
{
const audio_output_t *aout = (audio_output_t *) data;
aout_sys_t *aout_sys = aout->sys;
aout_stream_sys_t *p_sys = &aout_sys->s;
void *p_write_position, *p_wrap_around;
unsigned long l_bytes1, l_bytes2;
DWORD i_read;
int64_t toerase, tosleep;
vlc_tick_t ticksleep;
HRESULT dsresult;
vlc_thread_set_name("vlc-directsound");
for(;;)
{
int canc = vlc_savecancel();
vlc_mutex_lock( &p_sys->lock );
while( !p_sys->b_playing )
vlc_cond_wait( &p_sys->cond, &p_sys->lock );
toerase = 0;
tosleep = 0;
ticksleep = VLC_TICK_FROM_MS(20);
dsresult = IDirectSoundBuffer_GetCurrentPosition( p_sys->p_dsbuffer,
&i_read, NULL );
if( dsresult == DS_OK )
{
int64_t max = (int64_t) i_read - (int64_t) p_sys->i_write;
tosleep = -max;
if( max <= 0 )
max += DS_BUF_SIZE;
else
tosleep += DS_BUF_SIZE;
toerase = max;
ticksleep = vlc_tick_from_sec( tosleep / p_sys->i_bytes_per_sample ) / p_sys->i_rate;
}
ticksleep = __MAX( ticksleep, VLC_TICK_FROM_MS(20) );
dsresult = IDirectSoundBuffer_Lock( p_sys->p_dsbuffer,
p_sys->i_write,
toerase,
&p_write_position,
&l_bytes1,
&p_wrap_around,
&l_bytes2,
0 );
if( dsresult == DSERR_BUFFERLOST )
{
IDirectSoundBuffer_Restore( p_sys->p_dsbuffer );
dsresult = IDirectSoundBuffer_Lock( p_sys->p_dsbuffer,
p_sys->i_write,
toerase,
&p_write_position,
&l_bytes1,
&p_wrap_around,
&l_bytes2,
0 );
}
if( dsresult != DS_OK )
goto wait;
memset( p_write_position, 0, l_bytes1 );
memset( p_wrap_around, 0, l_bytes2 );
IDirectSoundBuffer_Unlock( p_sys->p_dsbuffer, p_write_position, l_bytes1,
p_wrap_around, l_bytes2 );
wait:
vlc_mutex_unlock(&p_sys->lock);
vlc_restorecancel(canc);
vlc_tick_sleep(ticksleep);
}
return NULL;
}
......@@ -172,10 +172,6 @@ static int getDefaultAudioVolume(const char *aout)
return (config_GetFloat("auhal-volume") * 100.f + .5f)
/ AOUT_VOLUME_DEFAULT;
#endif
#ifdef _WIN32
if (!strcmp(aout, "directsound") && module_exists("directsound"))
return config_GetFloat("directx-volume") * 100.f + .5f;
#endif
if (!strcmp(aout, "jack"))
return cbrtf(config_GetFloat("jack-gain")) * 100.f + 0.5f;
......@@ -1100,8 +1096,6 @@ void SPrefsPanel::updateAudioOptions( int number )
optionWidgets["mmdeviceW"]->setVisible( mmDeviceEnabled );
optionWidgets["mmdeviceL"]->setVisible( mmDeviceEnabled );
optionWidgets["directxW"]->setVisible( ( value == "directsound" ) );
optionWidgets["directxL"]->setVisible( ( value == "directsound" ) );
optionWidgets["waveoutW"]->setVisible( ( value == "waveout" ) );
optionWidgets["waveoutL"]->setVisible( ( value == "waveout" ) );
#elif defined( __OS2__ )
......@@ -1122,7 +1116,7 @@ void SPrefsPanel::updateAudioOptions( int number )
#endif
optionWidgets["fileW"]->setVisible( ( value == "afile" ) );
optionWidgets["spdifChB"]->setVisible( ( value == "alsa" || value == "oss" || value == "auhal" ||
value == "directsound" || value == "waveout" ) );
value == "waveout" ) );
int volume = getDefaultAudioVolume(qtu(value));
bool save = true;
......@@ -1252,8 +1246,6 @@ void SPrefsPanel::apply()
VLC_UNUSED( f_gain );
if( save_vol_aout( "mmdevice" ) )
config_PutFloat( "mmdevice-volume", i_volume / 100.f );
if( save_vol_aout( "directsound" ) )
config_PutFloat( "directx-volume", i_volume / 100.f );
if( save_vol_aout( "waveout" ) )
config_PutFloat( "waveout-volume", i_volume / 100.f );
#elif defined( Q_OS_MAC )
......
......@@ -257,7 +257,6 @@ modules/audio_output/audiotrack.c
modules/audio_output/audiounit_ios.m
modules/audio_output/auhal.c
modules/audio_output/coreaudio_common.c
modules/audio_output/directsound.c
modules/audio_output/file.c
modules/audio_output/jack.c
modules/audio_output/kai.c
......