Index: libao2/ao_dart.c =================================================================== --- libao2/ao_dart.c (revision 0) +++ libao2/ao_dart.c (revision 0) @@ -0,0 +1,266 @@ +/* + * libao2 DART Audio Output Driver for MPlayer + * + * Copyright (c) 2007-2009 by KO Myung-Hun (komh@chollian.net) + * + * This file is part of MPlayer. + * + * MPlayer is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * MPlayer 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with MPlayer; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#define INCL_DOS +#include + +#include +#include +#include +#include + +#include "config.h" +#include "libaf/af_format.h" +#include "audio_out.h" +#include "audio_out_internal.h" +#include "mp_msg.h" +#include "libvo/fastmemcpy.h" +#include "subopt-helper.h" + +#include "dart.h" + +static ao_info_t info = +{ + "DART audio output", + "dart", + "KO Myung-Hun ", + "" +}; + +LIBAO_EXTERN( dart ) + +#define OUTBURST_SAMPLES 512 +#define DART_SAMPLES ( OUTBURST_SAMPLES << 2 ) + +static uint8_t *m_audioBuf = NULL; +static volatile int m_nBufSize = 0; +static volatile int m_nBufLen = 0; +static volatile int m_iBufPos = 0; + +static ULONG APIENTRY dart_audio_callback( PVOID pCBData, PVOID pBuffer, ULONG ulSize ) +{ + int nCopySize; + + nCopySize = ulSize < m_nBufLen ? ulSize : m_nBufLen; + + if ( m_iBufPos + nCopySize > m_nBufSize ) { + int len = m_nBufSize - m_iBufPos; + + fast_memcpy( pBuffer, m_audioBuf + m_iBufPos, len ); + fast_memcpy(( uint8_t * )pBuffer + len, m_audioBuf, nCopySize - len ); + } + else + fast_memcpy( pBuffer, m_audioBuf + m_iBufPos, nCopySize ); + + m_iBufPos = ( m_iBufPos + nCopySize ) % m_nBufSize; + m_nBufLen -= nCopySize; + + memset(( uint8_t * )pBuffer + nCopySize, DART.bSilence, ulSize - nCopySize ); + + return ulSize; +} + +// to set/get/query special features/parameters +static int control( int cmd, void *arg ) +{ + switch (cmd) { + case AOCONTROL_GET_VOLUME : + { + ao_control_vol_t *vol = ( ao_control_vol_t * )arg; + + vol->left = vol->right = LOUSHORT( dartGetVolume()); + + return CONTROL_OK; + } + + case AOCONTROL_SET_VOLUME: + { + int mid; + ao_control_vol_t *vol = ( ao_control_vol_t * )arg; + + mid = ( vol->left + vol->right ) / 2; + dartSetVolume( MCI_SET_AUDIO_ALL, mid ); + + return CONTROL_OK; + } + } + + return CONTROL_UNKNOWN; +} + +static void print_help( void ) +{ + mp_msg( MSGT_AO, MSGL_FATAL, + "\n-ao dart commandline help:\n" + "Example: mplayer -ao dart:noshare\n" + " open DART as exclusive mode\n" + "\nOptions:\n" + " noshare\n" + " Open DART as exclusive mode\n" + " bufsize=\n" + " Set buffer size to in samples, default 2048\n"); +} + +// open & setup audio device +// return: 1=success 0=fail +static int init( int rate, int channels, int format, int flags ) +{ + int fNoShare = 0; + int nDartSamples = DART_SAMPLES; + int n; + + opt_t subopts[] = { + {"noshare", OPT_ARG_BOOL, &fNoShare, NULL }, + {"bufsize", OPT_ARG_INT, &nDartSamples, NULL }, + { NULL } + }; + + if ( subopt_parse( ao_subdevice, subopts ) != 0 ) { + print_help(); + return 0; + } + + mp_msg( MSGT_AO, MSGL_V, "DART: opened as %s mode, buffer size = %d sample(s)\n", fNoShare ? "exclusive" : "shareable", nDartSamples ); + + switch( format ) { + case AF_FORMAT_S16_LE: + case AF_FORMAT_S8: + break; + + default : + format = AF_FORMAT_S16_LE; + mp_msg( MSGT_AO, MSGL_V, "DART: format %s not supported defaulting to Signed 16-bit Little-Endian\n", af_fmt2str_short( format )); + break; + } + + n = ( af_fmt2bits( format ) >> 3 ) * channels; + + m_nBufSize = n * ( nDartSamples << 2 ); + + if ( dartInit( 0, af_fmt2bits( format ), rate, MCI_WAVE_FORMAT_PCM, channels, + 2, n * nDartSamples, !fNoShare, dart_audio_callback, NULL )) + return 0; + + ao_data.channels = channels; + ao_data.samplerate = rate; + ao_data.format = format; + ao_data.bps = channels * rate * ( af_fmt2bits( format ) >> 3 ); + ao_data.outburst = n * OUTBURST_SAMPLES; + ao_data.buffersize = m_nBufSize; + + m_audioBuf = malloc( m_nBufSize ); + + m_nBufLen = 0; + m_iBufPos = 0; + + dartPlay(); + + // mask off all floating-point exceptions + _control87( MCW_EM, MCW_EM ); + + return 1; +} + +// close audio device +static void uninit( int immed ) +{ + if ( !immed ) { + while ( m_nBufLen ) + DosSleep( 1 ); + } + + dartClose(); + + free( m_audioBuf ); +} + +// stop playing and empty buffers (for seeking/pause) +static void reset( void ) +{ + dartPause(); + + // empty buffers + m_nBufLen = 0; + + dartResume(); +} + +// stop playing, keep buffers (for pause) +static void audio_pause( void ) +{ + dartPause(); +} + +// resume playing, after audio_pause() +static void audio_resume( void ) +{ + dartResume(); +} + +// return: how many bytes can be played without blocking +static int get_space( void ) +{ + return ( m_nBufSize - m_nBufLen ); +} + +// plays 'len' bytes of 'data' +// it should round it down to outburst*n +// return: number of bytes played +static int play( void *data, int len, int flags) +{ + int start_pos, end_pos; + + if ( !( flags & AOPLAY_FINAL_CHUNK )) + len = ( len / ao_data.outburst ) * ao_data.outburst; + + if ( len == 0 ) + return 0; + + start_pos = ( m_iBufPos + m_nBufLen ) % m_nBufSize; + + end_pos = ( start_pos + len ) % m_nBufSize; + if ( end_pos <= start_pos ) { + int len1 = m_nBufSize - start_pos; + + if ( end_pos > m_iBufPos ) + end_pos = m_iBufPos; + + fast_memcpy( m_audioBuf + start_pos, data, len1 ); + fast_memcpy( m_audioBuf, ( uint8_t * )data + len1, end_pos ); + + len = len1 + end_pos; + } + else + fast_memcpy( m_audioBuf + start_pos, data, len ); + + m_nBufLen += len; + + return len; +} + +// return: delay in seconds between first and last sample in buffer +static float get_delay( void ) +{ + return ( float )m_nBufLen / ( float )ao_data.bps; +} + + Index: libao2/audio_out.c =================================================================== --- libao2/audio_out.c (revision 28593) +++ libao2/audio_out.c (working copy) @@ -47,6 +47,7 @@ extern ao_functions_t audio_out_sgi; extern ao_functions_t audio_out_win32; extern ao_functions_t audio_out_dsound; +extern ao_functions_t audio_out_dart; extern ao_functions_t audio_out_dxr2; extern ao_functions_t audio_out_ivtv; extern ao_functions_t audio_out_v4l2; @@ -63,6 +64,9 @@ #ifdef CONFIG_WIN32WAVEOUT &audio_out_win32, #endif +#ifdef CONFIG_DART + &audio_out_dart, +#endif #ifdef CONFIG_COREAUDIO &audio_out_macosx, #endif Index: Makefile =================================================================== --- Makefile (revision 28593) +++ Makefile (working copy) @@ -545,6 +545,7 @@ SRCS_MPLAYER-$(CACA) += libvo/vo_caca.c SRCS_MPLAYER-$(COREAUDIO) += libao2/ao_macosx.c SRCS_MPLAYER-$(COREVIDEO) += libvo/vo_macosx.m +SRCS_MPLAYER-$(DART) += libao2/ao_dart.c SRCS_MPLAYER-$(DFBMGA) += libvo/vo_dfbmga.c SRCS_MPLAYER-$(DGA) += libvo/vo_dga.c SRCS_MPLAYER-$(DIRECT3D) += libvo/vo_direct3d.c libvo/w32_common.c Index: configure =================================================================== --- configure (revision 28593) +++ configure (working copy) @@ -414,6 +415,7 @@ --disable-nas disable NAS audio output [autodetect] --disable-sgiaudio disable SGI audio output [autodetect] --disable-sunaudio disable Sun audio output [autodetect] + --disable-dart disable DART audio output [autodetect] --disable-win32waveout disable Windows waveout audio output [autodetect] --disable-select disable using select() on the audio device [enable] @@ -586,6 +589,7 @@ _esd=auto _pulse=auto _jack=auto +_dart=auto _openal=auto _libcdio=auto _liblzo=auto @@ -952,6 +959,8 @@ --disable-jack) _jack=no ;; --enable-openal) _openal=yes ;; --disable-openal) _openal=no ;; + --enable-dart) _dart=yes ;; + --disable-dart) _dart=no ;; --enable-mad) _mad=yes ;; --disable-mad) _mad=no ;; --enable-mp3lame) _mp3lame=yes ;; @@ -5611,6 +5644,30 @@ fi #if irix +if os2 ; then +echocheck "DART" +if test "$_dart" = auto; then + cat > $TMPC << EOF +#include +#include +int main( void ) { return 0; } +EOF + _dart=no; + cc_check -ldart && _dart=yes +fi +if test "$_dart" = yes ; then + def_dart='#define CONFIG_DART 1' + _libs_mplayer="$_libs_mplayer -ldart" + _aosrc="$_aosrc ao_dart.c" + _aomodules="dart $_aomodules" +else + def_dart='#undef CONFIG_DART' + _noaomodules="dart $_noaomodules" +fi +echores "$_dart" +fi #if os2 + + # set default CD/DVD devices if win32 || os2 ; then default_cdrom_device="D:" @@ -8045,6 +8102,7 @@ CDDB = $_cddb COREAUDIO = $_coreaudio COREVIDEO = $_corevideo +DART = $_dart DFBMGA = $_dfbmga DGA = $_dga DIRECT3D = $_direct3d @@ -8485,6 +8544,7 @@ $def_alsa9 $def_arts $def_coreaudio +$def_dart $def_esd $def_esd_latency $def_jack