Commit 5dcebef9 authored by Jon Lech Johansen's avatar Jon Lech Johansen

* MacOS X aout now uses AudioConverter for int->float

  * Various MacOS X intf improvements and bug fixes
parent 939b6ea1
...@@ -7773,7 +7773,7 @@ if test "${enable_macosx+set}" = set; then ...@@ -7773,7 +7773,7 @@ if test "${enable_macosx+set}" = set; then
if test x$enable_macosx = xyes if test x$enable_macosx = xyes
then then
BUILTINS="${BUILTINS} macosx" BUILTINS="${BUILTINS} macosx"
LIB_MACOSX="${LIB_MACOSX} -framework CoreAudio -framework Cocoa -framework AGL -framework QuickTime -lobjc" LIB_MACOSX="${LIB_MACOSX} -framework CoreAudio -framework AudioToolbox -framework Cocoa -framework AGL -framework QuickTime -lobjc"
CFLAGS_MACOSX="${CFLAGS_MACOSX} -ObjC" CFLAGS_MACOSX="${CFLAGS_MACOSX} -ObjC"
LIB="${LIB} -ObjC" LIB="${LIB} -ObjC"
fi fi
...@@ -7813,7 +7813,7 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ...@@ -7813,7 +7813,7 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
#define $ac_tr_hdr 1 #define $ac_tr_hdr 1
EOF EOF
BUILTINS="${BUILTINS} macosx" BUILTINS="${BUILTINS} macosx"
LIB_MACOSX="${LIB_MACOSX} -framework CoreAudio -framework Cocoa -framework AGL -framework QuickTime -lobjc" LIB_MACOSX="${LIB_MACOSX} -framework CoreAudio -framework AudioToolbox -framework Cocoa -framework AGL -framework QuickTime -lobjc"
CFLAGS_MACOSX="${CFLAGS_MACOSX} -ObjC" CFLAGS_MACOSX="${CFLAGS_MACOSX} -ObjC"
LIB="${LIB} -ObjC" LIB="${LIB} -ObjC"
......
...@@ -1305,13 +1305,13 @@ AC_ARG_ENABLE(macosx, ...@@ -1305,13 +1305,13 @@ AC_ARG_ENABLE(macosx,
[if test x$enable_macosx = xyes [if test x$enable_macosx = xyes
then then
BUILTINS="${BUILTINS} macosx" BUILTINS="${BUILTINS} macosx"
LIB_MACOSX="${LIB_MACOSX} -framework CoreAudio -framework Cocoa -framework AGL -framework QuickTime -lobjc" LIB_MACOSX="${LIB_MACOSX} -framework CoreAudio -framework AudioToolbox -framework Cocoa -framework AGL -framework QuickTime -lobjc"
CFLAGS_MACOSX="${CFLAGS_MACOSX} -ObjC" CFLAGS_MACOSX="${CFLAGS_MACOSX} -ObjC"
LIB="${LIB} -ObjC" LIB="${LIB} -ObjC"
fi], fi],
[AC_CHECK_HEADERS(Cocoa/Cocoa.h, [AC_CHECK_HEADERS(Cocoa/Cocoa.h,
BUILTINS="${BUILTINS} macosx" BUILTINS="${BUILTINS} macosx"
LIB_MACOSX="${LIB_MACOSX} -framework CoreAudio -framework Cocoa -framework AGL -framework QuickTime -lobjc" LIB_MACOSX="${LIB_MACOSX} -framework CoreAudio -framework AudioToolbox -framework Cocoa -framework AGL -framework QuickTime -lobjc"
CFLAGS_MACOSX="${CFLAGS_MACOSX} -ObjC" CFLAGS_MACOSX="${CFLAGS_MACOSX} -ObjC"
LIB="${LIB} -ObjC" LIB="${LIB} -ObjC"
)]) )])
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
LANGUAGE = ObjC; LANGUAGE = ObjC;
OUTLETS = {o_table = id; }; OUTLETS = {o_table = id; };
SUPERCLASS = NSObject; SUPERCLASS = NSObject;
}, }
); );
IBVersion = 1; IBVersion = 1;
} }
\ No newline at end of file
...@@ -18,6 +18,6 @@ ...@@ -18,6 +18,6 @@
<integer>21</integer> <integer>21</integer>
</array> </array>
<key>IBSystem Version</key> <key>IBSystem Version</key>
<string>5P48</string> <string>5Q45</string>
</dict> </dict>
</plist> </plist>
...@@ -77,6 +77,8 @@ ...@@ -77,6 +77,8 @@
F6799748020DCC2A01A80112, F6799748020DCC2A01A80112,
F6799749020DCC2A01A80112, F6799749020DCC2A01A80112,
F679974A020DCC2A01A80112, F679974A020DCC2A01A80112,
F6EA76F5024171E201A80112,
F6EA76F6024171E201A80112,
); );
isa = PBXGroup; isa = PBXGroup;
name = Files; name = Files;
...@@ -366,6 +368,18 @@ ...@@ -366,6 +368,18 @@
path = plugins/macosx/vout_window.h; path = plugins/macosx/vout_window.h;
refType = 4; refType = 4;
}; };
F6EA76F5024171E201A80112 = {
isa = PBXFileReference;
name = vout_vlc_wrapper.c;
path = plugins/macosx/vout_vlc_wrapper.c;
refType = 4;
};
F6EA76F6024171E201A80112 = {
isa = PBXFileReference;
name = vout_vlc_wrapper.h;
path = plugins/macosx/vout_vlc_wrapper.h;
refType = 4;
};
}; };
rootObject = F511306E0170620B01A80A1F; rootObject = F511306E0170620B01A80A1F;
} }
macosx_SOURCES = macosx.c aout_macosx.c vout_macosx.c vout_window.c vout_qdview.c intf_macosx.c intf_controller.c intf_vlc_wrapper.c macosx_SOURCES = macosx.c aout_macosx.c vout_macosx.c vout_window.c vout_qdview.c vout_vlc_wrapper.c intf_macosx.c intf_controller.c intf_vlc_wrapper.c
/***************************************************************************** /*****************************************************************************
* aout_darwin.c : Darwin audio output plugin * aout_macosx.c : CoreAudio output plugin
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: aout_macosx.c,v 1.14 2002/02/24 22:06:50 sam Exp $ * $Id: aout_macosx.c,v 1.15 2002/03/19 03:33:52 jlj Exp $
* *
* Authors: Colin Delacroix <colin@zoy.org> * Authors: Colin Delacroix <colin@zoy.org>
* Jon Lech Johansen <jon-vl@nanocrew.net>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
...@@ -21,19 +22,6 @@ ...@@ -21,19 +22,6 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/ *****************************************************************************/
/*
* 2001/03/21
* Status of audio under Darwin
* It currently works with 16 bits signed big endian mpeg 1 audio
* (and probably mpeg 2). This is the most common case.
* Note: ac3 decoder is currently broken under Darwin
*
* TODO:
* Find little endian files and adapt output
* Find unsigned files and adapt output
* Find 8 bits files and adapt output
*/
/***************************************************************************** /*****************************************************************************
* Preamble * Preamble
*****************************************************************************/ *****************************************************************************/
...@@ -45,30 +33,25 @@ ...@@ -45,30 +33,25 @@
#include <Carbon/Carbon.h> #include <Carbon/Carbon.h>
#include <CoreAudio/AudioHardware.h> #include <CoreAudio/AudioHardware.h>
#include <AudioToolbox/AudioConverter.h>
#include <sys/fcntl.h>
/*
* Debug: to dump the output of the decoder directly to a file
* May disappear when AC3 decoder will work on Darwin
*/
#define WRITE_AUDIO_OUTPUT_TO_FILE 0
/***************************************************************************** /*****************************************************************************
* aout_sys_t: private audio output method descriptor * aout_sys_t: private audio output method descriptor
***************************************************************************** *****************************************************************************
* This structure is part of the audio output thread descriptor. * This structure is part of the audio output thread descriptor.
* It describes the Darwin specific properties of an output thread. * It describes the CoreAudio specific properties of an output thread.
*****************************************************************************/ *****************************************************************************/
typedef struct aout_sys_s typedef struct aout_sys_s
{ {
#if WRITE_AUDIO_OUTPUT_TO_FILE AudioDeviceID device; // the audio device
int fd; // debug: fd to dump audio AudioConverterRef s_converter; // the AudioConverter
#endif int b_format; // format begun
AudioStreamBasicDescription deviceFormat; // info about the default device
AudioDeviceID device; // the default device AudioStreamBasicDescription s_src_stream_format;
Ptr p_Data; // ptr to the 32 bit float data AudioStreamBasicDescription s_dst_stream_format;
UInt32 ui_deviceBufferSize; // audio device buffer size
Ptr p_buffer; // ptr to the 32 bit float data
UInt32 ui_buffer_size; // audio device buffer size
vlc_mutex_t mutex_lock; // pthread locks for sync of vlc_mutex_t mutex_lock; // pthread locks for sync of
vlc_cond_t cond_sync; // aout_Play and callback vlc_cond_t cond_sync; // aout_Play and callback
} aout_sys_t; } aout_sys_t;
...@@ -83,18 +66,16 @@ static void aout_Play ( aout_thread_t *p_aout, ...@@ -83,18 +66,16 @@ static void aout_Play ( aout_thread_t *p_aout,
byte_t *buffer, int i_size ); byte_t *buffer, int i_size );
static void aout_Close ( aout_thread_t *p_aout ); static void aout_Close ( aout_thread_t *p_aout );
static OSStatus appIOProc( AudioDeviceID inDevice, const AudioTimeStamp* inNow, static int CABeginFormat ( aout_thread_t *p_aout );
const void* inInputData, const AudioTimeStamp* inInputTime, static int CAEndFormat ( aout_thread_t *p_aout );
AudioBufferList* outOutputData,
const AudioTimeStamp* inOutputTime, static OSStatus CAIOCallback ( AudioDeviceID inDevice,
void* threadGlobals ); const AudioTimeStamp *inNow,
static void Convert16BitIntegerTo32Float( Ptr p_in16BitDataPtr, Ptr p_out32BitDataPtr, const void *inInputData,
UInt32 ui_totalBytes ); const AudioTimeStamp *inInputTime,
static void Convert16BitIntegerTo32FloatWithByteSwap( Ptr p_in16BitDataPtr, AudioBufferList *outOutputData,
Ptr p_out32BitDataPtr, const AudioTimeStamp *inOutputTime,
UInt32 p_totalBytes ); void *threadGlobals );
static void Convert8BitIntegerTo32Float( Ptr in8BitDataPtr, Ptr p_out32BitDataPtr,
UInt32 ui_totalBytes );
/***************************************************************************** /*****************************************************************************
* Functions exported as capabilities. They are declared as static so that * Functions exported as capabilities. They are declared as static so that
...@@ -110,87 +91,82 @@ void _M( aout_getfunctions )( function_list_t * p_function_list ) ...@@ -110,87 +91,82 @@ void _M( aout_getfunctions )( function_list_t * p_function_list )
} }
/***************************************************************************** /*****************************************************************************
* aout_Open: opens a HAL audio device * aout_Open: opens a CoreAudio HAL device
*****************************************************************************/ *****************************************************************************/
static int aout_Open( aout_thread_t *p_aout ) static int aout_Open( aout_thread_t *p_aout )
{ {
OSStatus err = noErr; OSStatus err;
UInt32 ui_paramSize, ui_bufferSize; UInt32 ui_param_size;
AudioDeviceID device = kAudioDeviceUnknown;
AudioStreamBasicDescription format;
/* Allocate structure */ /* allocate instance */
p_aout->p_sys = malloc( sizeof( aout_sys_t ) ); p_aout->p_sys = malloc( sizeof( aout_sys_t ) );
if( p_aout->p_sys == NULL ) if( p_aout->p_sys == NULL )
{ {
intf_ErrMsg("aout error: %s", strerror(ENOMEM) ); intf_ErrMsg( "aout error: %s", strerror(ENOMEM) );
return( 1 ); return( 1 );
} }
/* Initialize some variables */ /* initialize members */
p_aout->p_sys->device = kAudioDeviceUnknown; memset( p_aout->p_sys, 0, sizeof( aout_sys_t ) );
p_aout->p_sys->p_Data = nil;
/* /* get the default output device */
* get the default output device for the HAL ui_param_size = sizeof( p_aout->p_sys->device );
* it is required to pass the size of the data to be returned
*/
ui_paramSize = sizeof( p_aout->p_sys->device );
err = AudioHardwareGetProperty( kAudioHardwarePropertyDefaultOutputDevice, err = AudioHardwareGetProperty( kAudioHardwarePropertyDefaultOutputDevice,
&ui_paramSize, (void *) &device ); &ui_param_size,
(void *)&p_aout->p_sys->device );
if( err != noErr )
if( err == noErr)
{ {
/* intf_ErrMsg( "aout error: failed to get the device: %d", err );
* The values we get here are not used. We may find another method for return( -1 );
* insuring us that the audio device is working ! }
*
* First get the buffersize that the default device uses for IO /* get the buffer size that the device uses for IO */
*/ ui_param_size = sizeof( p_aout->p_sys->ui_buffer_size );
ui_paramSize = sizeof( p_aout->p_sys->ui_deviceBufferSize ); err = AudioDeviceGetProperty( p_aout->p_sys->device, 0, false,
err = AudioDeviceGetProperty( device, 0, false,
kAudioDevicePropertyBufferSize, kAudioDevicePropertyBufferSize,
&ui_paramSize, &ui_bufferSize); &ui_param_size,
if( err == noErr ) &p_aout->p_sys->ui_buffer_size );
if( err != noErr )
{ {
/* get a description of the data format used by the default device */ intf_ErrMsg( "aout error: failed to get device buffer size: %d", err );
ui_paramSize = sizeof(p_aout->p_sys->deviceFormat); return( -1 );
err = AudioDeviceGetProperty( device, 0, false, }
/* get a description of the data format used by the device */
ui_param_size = sizeof( p_aout->p_sys->s_dst_stream_format );
err = AudioDeviceGetProperty( p_aout->p_sys->device, 0, false,
kAudioDevicePropertyStreamFormat, kAudioDevicePropertyStreamFormat,
&ui_paramSize, &format); &ui_param_size,
if( err == noErr ) &p_aout->p_sys->s_dst_stream_format );
{
if( format.mFormatID != kAudioFormatLinearPCM ) return paramErr;
/* everything is ok so fill in p_sys */ if( err != noErr )
p_aout->p_sys->device = device; {
p_aout->p_sys->ui_deviceBufferSize = ui_bufferSize; intf_ErrMsg( "aout error: failed to get dst stream format: %d", err );
p_aout->p_sys->deviceFormat = format; return( -1 );
}
}
} }
if (err != noErr) return err; if( p_aout->p_sys->s_dst_stream_format.mFormatID != kAudioFormatLinearPCM )
{
/* intf_ErrMsg( "aout error: kAudioFormatLinearPCM required" );
* Size calcul taken from audio_output.c we may change that file so we would return( -1 );
* not be forced to compute the same value twice }
*/
p_aout->p_sys->ui_deviceBufferSize =
2 * 2 * sizeof(s16) * ((s64)p_aout->i_rate * AOUT_BUFFER_DURATION) / 1000000;
/* Allocate memory for audio */ /* initialize mutex and cond */
p_aout->p_sys->p_Data = NewPtrClear( p_aout->p_sys->ui_deviceBufferSize ); vlc_mutex_init( &p_aout->p_sys->mutex_lock );
if( p_aout->p_sys->p_Data == nil ) return paramErr; vlc_cond_init( &p_aout->p_sys->cond_sync );
#if WRITE_AUDIO_OUTPUT_TO_FILE /* initialize source stream format */
p_aout->p_sys->fd = open( "audio-darwin.pcm", O_RDWR|O_CREAT ); memcpy( &p_aout->p_sys->s_src_stream_format,
intf_WarnMsg( 3, "open(...) -> %d", p_aout->p_sys->fd ); &p_aout->p_sys->s_dst_stream_format,
#endif sizeof( p_aout->p_sys->s_src_stream_format ) );
vlc_cond_init( &p_aout->p_sys->cond_sync ); if( CABeginFormat( p_aout ) )
vlc_mutex_init( &p_aout->p_sys->mutex_lock ); {
intf_ErrMsg( "aout error: CABeginFormat failed" );
return( -1 );
}
return( 0 ); return( 0 );
} }
...@@ -200,113 +176,85 @@ static int aout_Open( aout_thread_t *p_aout ) ...@@ -200,113 +176,85 @@ static int aout_Open( aout_thread_t *p_aout )
*****************************************************************************/ *****************************************************************************/
static int aout_SetFormat( aout_thread_t *p_aout ) static int aout_SetFormat( aout_thread_t *p_aout )
{ {
OSStatus err = noErr; if( CAEndFormat( p_aout ) )
UInt32 ui_paramSize,
ui_bufferSize = p_aout->p_sys->ui_deviceBufferSize;
AudioStreamBasicDescription format;
/* set the buffersize that the default device uses for IO */
ui_paramSize = sizeof( ui_bufferSize );
err = AudioDeviceSetProperty( p_aout->p_sys->device, 0, 0, false,
kAudioDevicePropertyBufferSize,
ui_paramSize, &ui_bufferSize);
if( err != noErr )
{ {
/* We have to tell the decoder to use audio device's buffer size */ intf_ErrMsg( "aout error: CAEndFormat failed" );
intf_ErrMsg( "aout : AudioDeviceSetProperty failed ( buffersize = %d ) -> %d",
ui_bufferSize, err );
return( -1 ); return( -1 );
} }
else
{
p_aout->p_sys->ui_deviceBufferSize = ui_bufferSize;
ui_paramSize = sizeof( format );
err = AudioDeviceGetProperty( p_aout->p_sys->device, 0, false,
kAudioDevicePropertyStreamFormat,
&ui_paramSize, &format);
if( err == noErr )
{
/*
* setting format.mFormatFlags to anything but the default value
* doesn't seem to work. Can anybody explain that ??
*/
switch( p_aout->i_format ) switch( p_aout->i_format )
{ {
case AOUT_FMT_U8: case AOUT_FMT_S8:
intf_ErrMsg( "Audio format (Unsigned 8) not supported now," intf_ErrMsg( "Audio format (Signed 8) not supported now,"
"please report stream" ); "please report stream" );
return( -1 ); return( -1 );
case AOUT_FMT_S16_LE: /* Little endian signed 16 */ case AOUT_FMT_U8:
// format.mFormatFlags &= ~kLinearPCMFormatFlagIsBigEndian; intf_ErrMsg( "Audio format (Unsigned 8) not supported now,"
intf_ErrMsg( "Audio format (LE Unsigned 16) not supported now,"
"please report stream" ); "please report stream" );
return( -1 ); return( -1 );
case AOUT_FMT_S16_BE: /* Big endian signed 16 */ case AOUT_FMT_S16_LE:
// format.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian; p_aout->p_sys->s_src_stream_format.mFormatFlags &=
~kLinearPCMFormatFlagIsBigEndian;
p_aout->p_sys->s_src_stream_format.mFormatFlags |=
kLinearPCMFormatFlagIsSignedInteger;
break; break;
case AOUT_FMT_S8: case AOUT_FMT_S16_BE:
intf_ErrMsg( "Audio format (Signed 8) not supported now," p_aout->p_sys->s_src_stream_format.mFormatFlags |=
"please report stream" ); kLinearPCMFormatFlagIsBigEndian;
return( -1 ); p_aout->p_sys->s_src_stream_format.mFormatFlags |=
kLinearPCMFormatFlagIsSignedInteger;
case AOUT_FMT_U16_LE: /* Little endian U16 */ break;
// format.mFormatFlags &= ~kLinearPCMFormatFlagIsSignedInteger;
intf_ErrMsg( "Audio format (LE Unsigned 8) not supported now,"
"please report stream" );
return( -1 );
case AOUT_FMT_U16_BE: /* Big endian U16 */ case AOUT_FMT_U16_LE:
// format.mFormatFlags &= ~kLinearPCMFormatFlagIsSignedInteger; p_aout->p_sys->s_src_stream_format.mFormatFlags &=
intf_ErrMsg( "Audio format (BE Unsigned 8) not supported now," ~kLinearPCMFormatFlagIsBigEndian;
"please report stream" ); p_aout->p_sys->s_src_stream_format.mFormatFlags &=
return( -1 ); ~kLinearPCMFormatFlagIsSignedInteger;
break;
case AOUT_FMT_U16_BE:
p_aout->p_sys->s_src_stream_format.mFormatFlags |=
kLinearPCMFormatFlagIsBigEndian;
p_aout->p_sys->s_src_stream_format.mFormatFlags &=
~kLinearPCMFormatFlagIsSignedInteger;
break; break;
default: default:
intf_ErrMsg( "Audio format (0x%08x) not supported now,"
"please report stream", p_aout->i_format );
return( -1 ); return( -1 );
} }
/* /* source format is not float */
* It would have been nice to have these work (no more buffer p_aout->p_sys->s_src_stream_format.mFormatFlags &=
* convertion to float) but I couldn't manage to ~kLinearPCMFormatFlagIsFloat;
*/
// format.mFormatFlags &= ~kLinearPCMFormatFlagIsFloat;
// format.mFormatFlags |= kLinearPCMFormatFlagIsFloat;
// format.mFormatFlags |= kLinearPCMFormatFlagIsSignedInteger;
format.mSampleRate = p_aout->i_rate; /* if destination format is float, take size diff into account */
format.mChannelsPerFrame = p_aout->i_channels; if( p_aout->p_sys->s_dst_stream_format.mFormatFlags &
kLinearPCMFormatFlagIsFloat )
err = AudioDeviceSetProperty( p_aout->p_sys->device, 0, 0, false,
kAudioDevicePropertyStreamFormat,
ui_paramSize, &format);
if( err != noErr )
{ {
intf_ErrMsg( "aout : AudioDeviceSetProperty( mFormatFlags = %x, " p_aout->p_sys->s_src_stream_format.mBytesPerPacket =
"mSampleRate = %f, mChannelsPerFrame = %d ) -> %d", p_aout->p_sys->s_dst_stream_format.mBytesPerPacket / 2;
format.mFormatFlags, format.mSampleRate, p_aout->p_sys->s_src_stream_format.mBytesPerFrame =
format.mChannelsPerFrame, err ); p_aout->p_sys->s_src_stream_format.mBytesPerFrame / 2;
return( -1 ); p_aout->p_sys->s_src_stream_format.mBitsPerChannel =
} p_aout->p_sys->s_src_stream_format.mBitsPerChannel / 2;
}
} }
/* add callback */ /* set sample rate and channels per frame */
err = AudioDeviceAddIOProc( p_aout->p_sys->device, p_aout->p_sys->s_src_stream_format.mSampleRate = p_aout->i_rate;
(AudioDeviceIOProc)appIOProc, p_aout->p_sys->s_src_stream_format.mChannelsPerFrame = p_aout->i_channels;
(void *)p_aout->p_sys );
/* open the output */ if( CABeginFormat( p_aout ) )
if( err == noErr ) {
err = AudioDeviceStart( p_aout->p_sys->device, (AudioDeviceIOProc)appIOProc ); intf_ErrMsg( "aout error: CABeginFormat failed" );
return( -1 );
}
return( err ); return( 0 );
} }
/***************************************************************************** /*****************************************************************************
...@@ -314,36 +262,30 @@ static int aout_SetFormat( aout_thread_t *p_aout ) ...@@ -314,36 +262,30 @@ static int aout_SetFormat( aout_thread_t *p_aout )
*****************************************************************************/ *****************************************************************************/
static int aout_GetBufInfo( aout_thread_t *p_aout, int i_buffer_limit ) static int aout_GetBufInfo( aout_thread_t *p_aout, int i_buffer_limit )
{ {
return( 0 ); // Send data as soon as possible return( 0 ); /* send data as soon as possible */
/*
* Tune me ?
*
return ( p_aout->p_sys->p_Data
+ p_aout->p_sys->sizeOfDataInMemory
- p_aout->p_sys->currentDataLocationPtr
- p_aout->p_sys->ui_deviceBufferSize );
*/
} }
/***************************************************************************** /*****************************************************************************
* appIOProc : callback for audio output * CAIOCallback : callback for audio output
*****************************************************************************/ *****************************************************************************/
static OSStatus appIOProc( AudioDeviceID inDevice, const AudioTimeStamp* inNow, static OSStatus CAIOCallback( AudioDeviceID inDevice,
const void* inInputData, const AudioTimeStamp* inInputTime, const AudioTimeStamp *inNow,
AudioBufferList* outOutputData, const AudioTimeStamp* inOutputTime, const void *inInputData,
void* threadGlobals ) const AudioTimeStamp *inInputTime,
AudioBufferList *outOutputData,
const AudioTimeStamp *inOutputTime,
void *threadGlobals )
{ {
aout_sys_t* p_sys = threadGlobals; aout_sys_t *p_sys = (aout_sys_t *)threadGlobals;
/* see aout_Play below */ /* see aout_Play below */
vlc_mutex_lock( &p_sys->mutex_lock ); vlc_mutex_lock( &p_sys->mutex_lock );
vlc_cond_signal( &p_sys->cond_sync ); vlc_cond_signal( &p_sys->cond_sync );
/* move data into output data buffer */ /* move data into output data buffer */
BlockMoveData( p_sys->p_Data, BlockMoveData( p_sys->p_buffer,
outOutputData->mBuffers[ 0 ].mData, outOutputData->mBuffers[ 0 ].mData,
p_sys->ui_deviceBufferSize ); p_sys->ui_buffer_size );
vlc_mutex_unlock( &p_sys->mutex_lock ); vlc_mutex_unlock( &p_sys->mutex_lock );
...@@ -355,106 +297,172 @@ static OSStatus appIOProc( AudioDeviceID inDevice, const AudioTimeStamp* inNow ...@@ -355,106 +297,172 @@ static OSStatus appIOProc( AudioDeviceID inDevice, const AudioTimeStamp* inNow
*****************************************************************************/ *****************************************************************************/
static void aout_Play( aout_thread_t *p_aout, byte_t *buffer, int i_size ) static void aout_Play( aout_thread_t *p_aout, byte_t *buffer, int i_size )
{ {
#if WRITE_AUDIO_OUTPUT_TO_FILE OSStatus err;
write( p_aout->p_sys->fd, buffer, i_size ); UInt32 ui_buffer_size = p_aout->p_sys->ui_buffer_size;
#else
Convert16BitIntegerTo32Float( buffer, p_aout->p_sys->p_Data, i_size ); err = AudioConverterConvertBuffer( p_aout->p_sys->s_converter,
i_size, buffer,
&ui_buffer_size,
p_aout->p_sys->p_buffer );
if( err != noErr )
{
intf_ErrMsg( "aout error: ConvertBuffer failed: %d", err );
}
/* /*
* wait for a callback to occur (to flush the buffer), so aout_Play * wait for a callback to occur (to flush the buffer), so aout_Play
* can't be called twice, losing the data we just wrote. * can't be called twice, losing the data we just wrote.
*/ */
vlc_mutex_lock( &p_aout->p_sys->mutex_lock );
vlc_cond_wait( &p_aout->p_sys->cond_sync, &p_aout->p_sys->mutex_lock ); vlc_cond_wait( &p_aout->p_sys->cond_sync, &p_aout->p_sys->mutex_lock );
#endif vlc_mutex_unlock( &p_aout->p_sys->mutex_lock );
} }
/***************************************************************************** /*****************************************************************************
* aout_Close: closes the dummy audio device * aout_Close: closes the CoreAudio HAL device
*****************************************************************************/ *****************************************************************************/
static void aout_Close( aout_thread_t *p_aout ) static void aout_Close( aout_thread_t *p_aout )
{ {
OSStatus err = noErr; if( CAEndFormat( p_aout ) )
/* stop playing sound through the device */
err = AudioDeviceStop( p_aout->p_sys->device,
(AudioDeviceIOProc)appIOProc );
if( err == noErr )
{ {
/* remove the callback */ intf_ErrMsg( "aout error: CAEndFormat failed" );
err = AudioDeviceRemoveIOProc( p_aout->p_sys->device,
(AudioDeviceIOProc)appIOProc );
} }
DisposePtr( p_aout->p_sys->p_Data ); /* destroy lock and cond */
vlc_mutex_destroy( &p_aout->p_sys->mutex_lock );
vlc_cond_destroy( &p_aout->p_sys->cond_sync );
return; free( p_aout->p_sys );
} }
/***************************************************************************** /*****************************************************************************
* Convert16BitIntegerTo32Float * CABeginFormat: creates an AudioConverter
*****************************************************************************/ *****************************************************************************/
static void Convert16BitIntegerTo32Float( Ptr p_in16BitDataPtr, Ptr p_out32BitDataPtr, static int CABeginFormat( aout_thread_t *p_aout )
UInt32 ui_totalBytes )
{ {
UInt32 i, ui_samples = ui_totalBytes / 2 /* each 16 bit sample is 2 bytes */; OSStatus err;
SInt16 *p_s_inDataPtr = (SInt16 *) p_in16BitDataPtr; UInt32 ui_param_size;
Float32 *p_f_outDataPtr = (Float32 *) p_out32BitDataPtr;
for( i = 0 ; i < ui_samples ; i++ ) if( p_aout->p_sys->b_format )
{ {
*p_f_outDataPtr = (Float32)(*p_s_inDataPtr); intf_ErrMsg( "aout error: CABeginFormat (b_format)" );
if( *p_f_outDataPtr > 0 ) return( 1 );
*p_f_outDataPtr /= 32767.0;
else
*p_f_outDataPtr /= 32768.0;
p_f_outDataPtr++;
p_s_inDataPtr++;
} }
}
/***************************************************************************** p_aout->p_sys->ui_buffer_size = 2 * 2 * sizeof(s16) *
* Convert16BitIntegerTo32FloatWithByteSwap ((s64)p_aout->i_rate * AOUT_BUFFER_DURATION) / 1000000;
*****************************************************************************/
static void Convert16BitIntegerTo32FloatWithByteSwap( Ptr p_in16BitDataPtr, /* set the buffer size that the device uses for IO */
Ptr p_out32BitDataPtr, ui_param_size = sizeof( p_aout->p_sys->ui_buffer_size );
UInt32 ui_totalBytes ) err = AudioDeviceSetProperty( p_aout->p_sys->device, 0, 0, false,
{ kAudioDevicePropertyBufferSize,
UInt32 i, ui_samples = ui_totalBytes / 2 /* each 16 bit sample is 2 bytes */; ui_param_size,
SInt16 *p_s_inDataPtr = (SInt16 *) p_in16BitDataPtr; &p_aout->p_sys->ui_buffer_size );
Float32 *p_f_outDataPtr = (Float32 *) p_out32BitDataPtr;
if( err != noErr )
{
intf_ErrMsg( "aout error: AudioDeviceSetProperty failed: %d", err );
return( 1 );
}
/* allocate audio buffer */
p_aout->p_sys->p_buffer = NewPtrClear( p_aout->p_sys->ui_buffer_size );
if( p_aout->p_sys->p_buffer == nil )
{
intf_ErrMsg( "aout error: failed to allocate audio buffer" );
return( 1 );
}
/* create a new AudioConverter */
err = AudioConverterNew( &p_aout->p_sys->s_src_stream_format,
&p_aout->p_sys->s_dst_stream_format,
&p_aout->p_sys->s_converter );
if( err != noErr )
{
intf_ErrMsg( "aout error: AudioConverterNew failed: %d", err );
DisposePtr( p_aout->p_sys->p_buffer );
return( 1 );
}
for( i = 0 ; i < ui_samples ; i++ ) /* add callback */
err = AudioDeviceAddIOProc( p_aout->p_sys->device,
(AudioDeviceIOProc)CAIOCallback,
(void *)p_aout->p_sys );
if( err != noErr )
{
intf_ErrMsg( "aout error: AudioDeviceAddIOProc failed: %d", err );
AudioConverterDispose( p_aout->p_sys->s_converter );
DisposePtr( p_aout->p_sys->p_buffer );
return( 1 );
}
/* open the output */
err = AudioDeviceStart( p_aout->p_sys->device,
(AudioDeviceIOProc)CAIOCallback );
if( err != noErr )
{ {
*p_f_outDataPtr = (Float32)CFSwapInt16LittleToHost(*p_s_inDataPtr); intf_ErrMsg( "aout error: AudioDeviceStart failed: %d", err );
if( *p_f_outDataPtr > 0 ) AudioConverterDispose( p_aout->p_sys->s_converter );
*p_f_outDataPtr /= 32767.0; DisposePtr( p_aout->p_sys->p_buffer );
else return( 1 );
*p_f_outDataPtr /= 32768.0;
p_f_outDataPtr++;
p_s_inDataPtr++;
} }
p_aout->p_sys->b_format = 1;
return( 0 );
} }
/***************************************************************************** /*****************************************************************************
* Convert8BitIntegerTo32Float * CAEndFormat: destroys the AudioConverter
*****************************************************************************/ *****************************************************************************/
static void Convert8BitIntegerTo32Float( Ptr p_in8BitDataPtr, Ptr p_out32BitDataPtr, static int CAEndFormat( aout_thread_t *p_aout )
UInt32 ui_totalBytes )
{ {
UInt32 i, ui_samples = ui_totalBytes; OSStatus err;
SInt8 *p_c_inDataPtr = (SInt8 *)p_in8BitDataPtr;
Float32 *p_f_outDataPtr = (Float32 *)p_out32BitDataPtr;
for( i = 0 ; i < ui_samples ; i++ ) if( !p_aout->p_sys->b_format )
{ {
*p_f_outDataPtr = (Float32)(*p_c_inDataPtr); intf_ErrMsg( "aout error: CAEndFormat (!b_format)" );
if( *p_f_outDataPtr > 0 ) return( 1 );
*p_f_outDataPtr /= 32767.0;
else
*p_f_outDataPtr /= 32768.0;
p_f_outDataPtr++;
p_c_inDataPtr++;
} }
/* stop playing sound through the device */
err = AudioDeviceStop( p_aout->p_sys->device,
(AudioDeviceIOProc)CAIOCallback );
if( err != noErr )
{
intf_ErrMsg( "aout error: AudioDeviceStop failed: %d", err );
return( 1 );
}
/* remove the callback */
err = AudioDeviceRemoveIOProc( p_aout->p_sys->device,
(AudioDeviceIOProc)CAIOCallback );
if( err != noErr )
{
intf_ErrMsg( "aout error: AudioDeviceRemoveIOProc failed: %d", err );
return( 1 );
}
/* destroy the AudioConverter */
err = AudioConverterDispose( p_aout->p_sys->s_converter );
if( err != noErr )
{
intf_ErrMsg( "aout error: AudioConverterDispose failed: %d", err );
return( 1 );
}
/* release audio buffer */
DisposePtr( p_aout->p_sys->p_buffer );
p_aout->p_sys->b_format = 0;
return( 0 );
} }
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* intf_controller.c: MacOS X plugin for vlc * intf_controller.c: MacOS X plugin for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: intf_controller.c,v 1.3 2002/02/18 01:34:44 jlj Exp $ * $Id: intf_controller.c,v 1.4 2002/03/19 03:33:52 jlj Exp $
* *
* Authors: Florian G. Pflug <fgp@phlo.org> * Authors: Florian G. Pflug <fgp@phlo.org>
* Jon Lech Johansen <jon-vl@nanocrew.net> * Jon Lech Johansen <jon-vl@nanocrew.net>
...@@ -32,10 +32,6 @@ ...@@ -32,10 +32,6 @@
#include "macosx.h" #include "macosx.h"
#include "intf_controller.h" #include "intf_controller.h"
@interface Intf_Controller (Internal)
- (void)handlePortMessage:(NSPortMessage *)o_msg;
@end
@implementation Intf_Controller @implementation Intf_Controller
/* Initialization & Event-Management */ /* Initialization & Event-Management */
...@@ -45,19 +41,16 @@ ...@@ -45,19 +41,16 @@
NSString *pTitle = [NSString NSString *pTitle = [NSString
stringWithCString: VOUT_TITLE " (Cocoa)"]; stringWithCString: VOUT_TITLE " (Cocoa)"];
o_vlc = [Intf_VlcWrapper instance];
[o_vlc initWithDelegate: self];
[o_window setTitle: pTitle]; [o_window setTitle: pTitle];
} }
- (void)applicationDidFinishLaunching:(NSNotification *)o_notification - (void)applicationDidFinishLaunching:(NSNotification *)o_notification
{ {
[[o_vlc sendPort] setDelegate: self]; o_intf = [[Intf_VLCWrapper instance] retain];
o_vout = [[Vout_VLCWrapper instance] retain];
[[NSRunLoop currentRunLoop] f_slider = f_slider_old = 0.0;
addPort: [o_vlc sendPort] o_slider_lock = [[NSLock alloc] init];
forMode: NSDefaultRunLoopMode];
[NSThread detachNewThreadSelector: @selector(manage) [NSThread detachNewThreadSelector: @selector(manage)
toTarget: self withObject: nil]; toTarget: self withObject: nil];
...@@ -70,13 +63,31 @@ ...@@ -70,13 +63,31 @@
o_pool = [[NSAutoreleasePool alloc] init]; o_pool = [[NSAutoreleasePool alloc] init];
while( ![o_vlc manage] ) while( ![o_intf manage] )
{
if( [o_intf playlistPlaying] )
{ {
[o_currenttime setStringValue: [o_vlc getTimeAsString]]; [o_currenttime setStringValue: [o_intf getTimeAsString]];
[o_timeslider setFloatValue: [o_vlc getTimeAsFloat]];
if( [o_vlc playlistPlaying] ) if( f_slider == f_slider_old )
{
float f_updated = [o_intf getTimeAsFloat];
if( f_updated != f_slider )
{
if( [o_slider_lock tryLock] )
{ {
[o_timeslider setFloatValue: f_updated];
[o_slider_lock unlock];
}
}
}
else
{
[o_intf setTimeAsFloat: f_slider];
f_slider_old = f_slider;
}
UpdateSystemActivity( UsrActivity ); UpdateSystemActivity( UsrActivity );
} }
...@@ -95,6 +106,9 @@ ...@@ -95,6 +106,9 @@
[NSApp stop: nil]; [NSApp stop: nil];
[o_vout release];
[o_intf release];
/* send a dummy event to break out of the event loop */ /* send a dummy event to break out of the event loop */
pEvent = [NSEvent mouseEventWithType: NSLeftMouseDown pEvent = [NSEvent mouseEventWithType: NSLeftMouseDown
location: NSMakePoint( 1, 1 ) modifierFlags: 0 location: NSMakePoint( 1, 1 ) modifierFlags: 0
...@@ -120,36 +134,49 @@ ...@@ -120,36 +134,49 @@
while( ( o_file = (NSString *)[o_files nextObject] ) ) while( ( o_file = (NSString *)[o_files nextObject] ) )
{ {
[o_vlc playlistAdd: o_file]; [o_intf playlistAdd: o_file];
} }
[o_vlc playlistPlayCurrent]; [o_intf playlistPlayCurrent];
} }
} }
- (IBAction)pause:(id)sender - (IBAction)pause:(id)sender
{ {
[o_vlc playlistPause]; [o_intf playlistPause];
} }
- (IBAction)play:(id)sender - (IBAction)play:(id)sender
{ {
[o_vlc playlistPlayCurrent]; [o_intf playlistPlayCurrent];
} }
- (IBAction)stop:(id)sender - (IBAction)stop:(id)sender
{ {
[o_vlc playlistStop]; [o_intf playlistStop];
} }
- (IBAction)timeslider_update:(id)slider - (IBAction)timeslider_update:(id)slider
{ {
[o_vlc setTimeAsFloat: [o_timeslider floatValue]]; switch( [[NSApp currentEvent] type] )
{
case NSLeftMouseDown:
[o_slider_lock lock];
break;
case NSLeftMouseUp:
f_slider = [o_timeslider floatValue];
[o_slider_lock unlock];
break;
default:
break;
}
} }
- (IBAction)speedslider_update:(id)slider - (IBAction)speedslider_update:(id)slider
{ {
[o_vlc setSpeed: (intf_speed_t)[slider intValue]]; [o_intf setSpeed: (intf_speed_t)[slider intValue]];
} }
- (IBAction)fullscreen_toggle:(id)sender - (IBAction)fullscreen_toggle:(id)sender
...@@ -159,31 +186,26 @@ ...@@ -159,31 +186,26 @@
- (IBAction)quit:(id)sender - (IBAction)quit:(id)sender
{ {
[o_vlc quit]; [o_intf quit];
}
@end
@implementation Intf_Controller (Internal)
- (void)handlePortMessage:(NSPortMessage *)o_msg
{
[o_vlc handlePortMessage: o_msg];
} }
@end @end
@implementation Intf_PlaylistDS @implementation Intf_PlaylistDS
- (void)awakeFromNib - (id)init
{ {
o_vlc = [Intf_VlcWrapper instance]; if( [super init] == nil )
return( nil );
o_playlist = nil; o_playlist = nil;
return( self );
} }
- (void)readPlaylist - (void)readPlaylist
{ {
o_playlist = [[o_vlc playlistAsArray] retain]; o_playlist = [[[Intf_VLCWrapper instance] playlistAsArray] retain];
} }
- (int)numberOfRowsInTableView:(NSTableView*)o_table - (int)numberOfRowsInTableView:(NSTableView*)o_table
...@@ -202,4 +224,3 @@ ...@@ -202,4 +224,3 @@
} }
@end @end
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* intf_controller.h: MacOS X plugin for vlc * intf_controller.h: MacOS X plugin for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: intf_controller.h,v 1.3 2002/02/18 01:34:44 jlj Exp $ * $Id: intf_controller.h,v 1.4 2002/03/19 03:33:52 jlj Exp $
* *
* Authors: Florian G. Pflug <fgp@phlo.org> * Authors: Florian G. Pflug <fgp@phlo.org>
* *
...@@ -22,16 +22,15 @@ ...@@ -22,16 +22,15 @@
*****************************************************************************/ *****************************************************************************/
#include "intf_vlc_wrapper.h" #include "intf_vlc_wrapper.h"
#include "vout_vlc_wrapper.h"
@interface Intf_PlaylistDS : NSObject @interface Intf_PlaylistDS : NSObject
{ {
Intf_VlcWrapper *o_vlc;
NSMutableArray *o_playlist; NSMutableArray *o_playlist;
IBOutlet NSTableView *o_table; IBOutlet NSTableView *o_table;
} }
- (void)awakeFromNib;
- (void)readPlaylist; - (void)readPlaylist;
- (int)numberOfRowsInTableView:(NSTableView *)o_table; - (int)numberOfRowsInTableView:(NSTableView *)o_table;
...@@ -42,7 +41,11 @@ ...@@ -42,7 +41,11 @@
@interface Intf_Controller : NSObject @interface Intf_Controller : NSObject
{ {
Intf_VlcWrapper *o_vlc; Intf_VLCWrapper *o_intf;
Vout_VLCWrapper *o_vout;
NSLock *o_slider_lock;
float f_slider, f_slider_old;
IBOutlet NSWindow *o_window; IBOutlet NSWindow *o_window;
IBOutlet NSButton *o_play; IBOutlet NSButton *o_play;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* intf_vlc_wrapper.c: MacOS X plugin for vlc * intf_vlc_wrapper.c: MacOS X plugin for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: intf_vlc_wrapper.c,v 1.8 2002/02/18 01:34:44 jlj Exp $ * $Id: intf_vlc_wrapper.c,v 1.9 2002/03/19 03:33:52 jlj Exp $
* *
* Authors: Florian G. Pflug <fgp@phlo.org> * Authors: Florian G. Pflug <fgp@phlo.org>
* Jon Lech Johansen <jon-vl@nanocrew.net> * Jon Lech Johansen <jon-vl@nanocrew.net>
...@@ -39,30 +39,36 @@ ...@@ -39,30 +39,36 @@
#include "macosx.h" #include "macosx.h"
#include "intf_vlc_wrapper.h" #include "intf_vlc_wrapper.h"
@implementation Intf_VlcWrapper @implementation Intf_VLCWrapper
static Intf_VLCWrapper *o_intf = nil;
/* Initialization */ /* Initialization */
+ (Intf_VlcWrapper *)instance - (id)init
{ {
static bool b_initialized = 0; if( [super init] == nil )
static Intf_VlcWrapper* o_vlc = nil; return( nil );
e_speed = SPEED_NORMAL;
if( !b_initialized ) return( self );
}
+ (Intf_VLCWrapper *)instance
{
if( o_intf == nil )
{ {
o_vlc = [[Intf_VlcWrapper alloc] init]; o_intf = [[[Intf_VLCWrapper alloc] init] autorelease];
b_initialized = TRUE;
} }
return o_vlc; return( o_intf );
} }
- (Intf_VlcWrapper *)initWithDelegate:(id)_o_delegate - (void)dealloc
{ {
e_speed = SPEED_NORMAL; o_intf = nil;
o_delegate = _o_delegate; [super dealloc];
return self;
} }
- (bool)manage - (bool)manage
...@@ -88,98 +94,6 @@ ...@@ -88,98 +94,6 @@
p_main->p_intf->b_die = 1; p_main->p_intf->b_die = 1;
} }
/* Vout requests */
- (void)handlePortMessage:(NSPortMessage *)o_msg
{
NSData *o_req;
struct vout_req_s *p_req;
o_req = [[o_msg components] lastObject];
p_req = *((struct vout_req_s **)[o_req bytes]);
[p_req->o_lock lock];
if( p_req->i_type == VOUT_REQ_CREATE_WINDOW )
{
VLCView *o_view;
p_req->p_vout->p_sys->o_window = [VLCWindow alloc];
[p_req->p_vout->p_sys->o_window setVout: p_req->p_vout];
[p_req->p_vout->p_sys->o_window setReleasedWhenClosed: YES];
if( p_req->p_vout->b_fullscreen )
{
[p_req->p_vout->p_sys->o_window
initWithContentRect: [[NSScreen mainScreen] frame]
styleMask: NSBorderlessWindowMask
backing: NSBackingStoreBuffered
defer: NO screen: [NSScreen mainScreen]];
[p_req->p_vout->p_sys->o_window
setLevel: CGShieldingWindowLevel()];
}
else
{
unsigned int i_stylemask = NSTitledWindowMask |
NSMiniaturizableWindowMask |
NSResizableWindowMask;
[p_req->p_vout->p_sys->o_window
initWithContentRect: p_req->p_vout->p_sys->s_rect
styleMask: i_stylemask
backing: NSBackingStoreBuffered
defer: NO screen: [NSScreen mainScreen]];
if( !p_req->p_vout->p_sys->b_pos_saved )
{
[p_req->p_vout->p_sys->o_window center];
}
}
o_view = [[VLCView alloc] initWithVout: p_req->p_vout];
[p_req->p_vout->p_sys->o_window setContentView: o_view];
[o_view lockFocus];
p_req->p_vout->p_sys->p_qdport = [o_view qdPort];
[o_view unlockFocus];
[p_req->p_vout->p_sys->o_window setTitle: [NSString
stringWithCString: VOUT_TITLE]];
[p_req->p_vout->p_sys->o_window setAcceptsMouseMovedEvents: YES];
[p_req->p_vout->p_sys->o_window makeKeyAndOrderFront: nil];
p_req->i_result = 1;
}
else if( p_req->i_type == VOUT_REQ_DESTROY_WINDOW )
{
if( !p_req->p_vout->b_fullscreen )
{
NSRect s_rect;
s_rect = [[p_req->p_vout->p_sys->o_window contentView] frame];
p_req->p_vout->p_sys->s_rect.size = s_rect.size;
s_rect = [p_req->p_vout->p_sys->o_window frame];
p_req->p_vout->p_sys->s_rect.origin = s_rect.origin;
p_req->p_vout->p_sys->b_pos_saved = 1;
}
p_req->p_vout->p_sys->p_qdport = nil;
[p_req->p_vout->p_sys->o_window close];
p_req->p_vout->p_sys->o_window = nil;
p_req->i_result = 1;
}
[p_req->o_lock unlockWithCondition: 1];
}
- (NSPort *)sendPort
{
return( p_main->p_intf->p_sys->o_port );
}
/* Playback control */ /* Playback control */
- (void)setSpeed:(intf_speed_t)_e_speed - (void)setSpeed:(intf_speed_t)_e_speed
{ {
...@@ -206,12 +120,18 @@ ...@@ -206,12 +120,18 @@
- (float)getTimeAsFloat - (float)getTimeAsFloat
{ {
if( p_input_bank->pp_input[0] == NULL ) float f_time = 0.0;
vlc_mutex_lock( &p_input_bank->lock );
if( p_input_bank->pp_input[0] != NULL )
{ {
return( 0.0 ); f_time = (float)p_area->i_tell / (float)p_area->i_size;
} }
return( (float)p_area->i_tell / (float)p_area->i_size ); vlc_mutex_unlock( &p_input_bank->lock );
return( f_time );
} }
- (void)setTimeAsFloat:(float)f_position - (void)setTimeAsFloat:(float)f_position
...@@ -400,7 +320,7 @@ ...@@ -400,7 +320,7 @@
- (bool)playlistPlaying - (bool)playlistPlaying
{ {
return( p_main->p_playlist->b_stopped ); return( !p_main->p_playlist->b_stopped );
} }
@end @end
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* intf_vlc_wrapper.h: MacOS X plugin for vlc * intf_vlc_wrapper.h: MacOS X plugin for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: intf_vlc_wrapper.h,v 1.3 2002/02/18 01:34:44 jlj Exp $ * $Id: intf_vlc_wrapper.h,v 1.4 2002/03/19 03:33:52 jlj Exp $
* *
* Authors: Florian G. Pflug <fgp@phlo.org> * Authors: Florian G. Pflug <fgp@phlo.org>
* Jon Lech Johansen <jon-vl@nanocrew.net> * Jon Lech Johansen <jon-vl@nanocrew.net>
...@@ -29,26 +29,20 @@ typedef enum intf_speed_e ...@@ -29,26 +29,20 @@ typedef enum intf_speed_e
SPEED_FAST SPEED_FAST
} intf_speed_t; } intf_speed_t;
/* Intf_VlcWrapper is a singleton class /* Intf_VLCWrapper is a singleton class
(only one instance at any time) */ (only one instance at any time) */
@interface Intf_VlcWrapper : NSObject @interface Intf_VLCWrapper : NSObject
{ {
id o_delegate;
intf_speed_t e_speed; intf_speed_t e_speed;
} }
/* Initialization */ /* Initialization */
+ (Intf_VlcWrapper *)instance; + (Intf_VLCWrapper *)instance;
- (Intf_VlcWrapper *)initWithDelegate:(id)o_delegate;
- (bool)manage; - (bool)manage;
- (void)quit; - (void)quit;
/* Vout requests */
- (void)handlePortMessage:(NSPortMessage *)o_msg;
- (NSPort *)sendPort;
/* Playback control */ /* Playback control */
- (void)setSpeed:(intf_speed_t)e_speed; - (void)setSpeed:(intf_speed_t)e_speed;
- (NSString *)getTimeAsString; - (NSString *)getTimeAsString;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* vout_qdview.c: MacOS X plugin for vlc * vout_qdview.c: MacOS X plugin for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: vout_qdview.c,v 1.1 2002/02/18 01:34:44 jlj Exp $ * $Id: vout_qdview.c,v 1.2 2002/03/19 03:33:52 jlj Exp $
* *
* Authors: Florian G. Pflug <fgp@phlo.org> * Authors: Florian G. Pflug <fgp@phlo.org>
* Jon Lech Johansen <jon-vl@nanocrew.net> * Jon Lech Johansen <jon-vl@nanocrew.net>
...@@ -25,36 +25,30 @@ ...@@ -25,36 +25,30 @@
/***************************************************************************** /*****************************************************************************
* Preamble * Preamble
*****************************************************************************/ *****************************************************************************/
#include <errno.h> /* ENOMEM */ #import <Cocoa/Cocoa.h>
#include <stdlib.h> /* free() */
#include <string.h> /* strerror() */
#include <videolan/vlc.h> #import "vout_qdview.h"
#include "video.h"
#include "video_output.h"
#include "macosx.h"
/***************************************************************************** /*****************************************************************************
* VLCView implementation * VLCView implementation
*****************************************************************************/ *****************************************************************************/
@implementation VLCView @implementation VLCView
- (id)initWithVout:(struct vout_thread_s *)_p_vout - (id)initWithWrapper:(Vout_VLCWrapper *)_o_wrapper forVout:(void *)_p_vout
{ {
if( [super init] == nil ) if( [super init] == nil )
return nil; return nil;
p_vout = _p_vout; p_vout = _p_vout;
o_wrapper = _o_wrapper;
return self; return( self );
} }
- (void)drawRect:(NSRect)rect - (void)drawRect:(NSRect)rect
{ {
[super drawRect: rect]; [super drawRect: rect];
p_vout->i_changes |= VOUT_SIZE_CHANGE; [o_wrapper voutDidResize: p_vout];
} }
@end @end
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* vout_qdview.h: MacOS X plugin for vlc * vout_qdview.h: MacOS X plugin for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: vout_qdview.h,v 1.1 2002/02/18 01:34:44 jlj Exp $ * $Id: vout_qdview.h,v 1.2 2002/03/19 03:33:52 jlj Exp $
* *
* Authors: Florian G. Pflug <fgp@phlo.org> * Authors: Florian G. Pflug <fgp@phlo.org>
* Jon Lech Johansen <jon-vl@nanocrew.net> * Jon Lech Johansen <jon-vl@nanocrew.net>
...@@ -22,11 +22,14 @@ ...@@ -22,11 +22,14 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/ *****************************************************************************/
#import "vout_vlc_wrapper.h"
@interface VLCView : NSQuickDrawView @interface VLCView : NSQuickDrawView
{ {
struct vout_thread_s *p_vout; void *p_vout;
Vout_VLCWrapper *o_wrapper;
} }
- (id)initWithVout:(struct vout_thread_s *)_p_vout; - (id)initWithWrapper:(Vout_VLCWrapper *)_o_wrapper forVout:(void *)_p_vout;
@end @end
/*****************************************************************************
* vout_vlc_wrapper.c: MacOS X plugin for vlc
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: vout_vlc_wrapper.c,v 1.1 2002/03/19 03:33:52 jlj Exp $
*
* Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
*
* This program 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.
*
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include <errno.h> /* ENOMEM */
#include <stdlib.h> /* free() */
#include <string.h> /* strerror() */
#include <videolan/vlc.h>
#include "video.h"
#include "video_output.h"
#include "interface.h"
#include "macosx.h"
#include "vout_vlc_wrapper.h"
/*****************************************************************************
* Vout_VLCWrapper implementation
*****************************************************************************/
@implementation Vout_VLCWrapper
static Vout_VLCWrapper *o_vout = nil;
+ (Vout_VLCWrapper *)instance
{
if( o_vout == nil )
{
o_vout = [[[Vout_VLCWrapper alloc] init] autorelease];
[[Vout_VLCWrapper sendPort] setDelegate: o_vout];
[[NSRunLoop currentRunLoop]
addPort: [Vout_VLCWrapper sendPort]
forMode: NSDefaultRunLoopMode];
}
return( o_vout );
}
- (void)dealloc
{
o_vout = nil;
[super dealloc];
}
+ (NSPort *)sendPort
{
return( p_main->p_intf->p_sys->o_port );
}
- (void)voutDidResize:(void *)_p_vout
{
struct vout_thread_s *p_vout =
(struct vout_thread_s *)_p_vout;
p_vout->i_changes |= VOUT_SIZE_CHANGE;
}
- (void)mouseEvent:(unsigned int)ui_status forVout:(void *)_p_vout
{
struct vout_thread_s *p_vout =
(struct vout_thread_s *)_p_vout;
if( ui_status & MOUSE_MOVED )
p_vout->p_sys->b_mouse_moved = 1;
if( ui_status & MOUSE_NOT_MOVED )
p_vout->p_sys->b_mouse_moved = 0;
if( ui_status & MOUSE_LAST_MOVED )
p_vout->p_sys->i_time_mouse_last_moved = mdate();
if( ui_status & MOUSE_NOT_LAST_MOVED )
p_vout->p_sys->i_time_mouse_last_moved = 0;
}
- (BOOL)keyDown:(NSEvent *)o_event forVout:(void *)_p_vout
{
unichar key = 0;
struct vout_thread_s *p_vout =
(struct vout_thread_s *)_p_vout;
if( [[o_event characters] length] )
{
key = [[o_event characters] characterAtIndex: 0];
}
switch( key )
{
case 'f': case 'F':
p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE;
break;
case 'q': case 'Q':
p_main->p_intf->b_die = 1;
break;
default:
return( NO );
break;
}
return( YES );
}
@end
@implementation Vout_VLCWrapper (Internal)
- (void)handlePortMessage:(NSPortMessage *)o_msg
{
NSData *o_req;
struct vout_req_s *p_req;
o_req = [[o_msg components] lastObject];
p_req = *((struct vout_req_s **)[o_req bytes]);
[p_req->o_lock lock];
if( p_req->i_type == VOUT_REQ_CREATE_WINDOW )
{
VLCView *o_view;
p_req->p_vout->p_sys->o_window = [VLCWindow alloc];
[p_req->p_vout->p_sys->o_window
setWrapper: self forVout: (void *)p_req->p_vout];
[p_req->p_vout->p_sys->o_window setReleasedWhenClosed: YES];
if( p_req->p_vout->b_fullscreen )
{
[p_req->p_vout->p_sys->o_window
initWithContentRect: [[NSScreen mainScreen] frame]
styleMask: NSBorderlessWindowMask
backing: NSBackingStoreBuffered
defer: NO screen: [NSScreen mainScreen]];
[p_req->p_vout->p_sys->o_window
setLevel: CGShieldingWindowLevel()];
}
else
{
unsigned int i_stylemask = NSTitledWindowMask |
NSMiniaturizableWindowMask |
NSResizableWindowMask;
[p_req->p_vout->p_sys->o_window
initWithContentRect: p_req->p_vout->p_sys->s_rect
styleMask: i_stylemask
backing: NSBackingStoreBuffered
defer: NO screen: [NSScreen mainScreen]];
if( !p_req->p_vout->p_sys->b_pos_saved )
{
[p_req->p_vout->p_sys->o_window center];
}
}
o_view = [[VLCView alloc]
initWithWrapper: self forVout: (void *)p_req->p_vout];
[p_req->p_vout->p_sys->o_window setContentView: o_view];
[o_view autorelease];
[o_view lockFocus];
p_req->p_vout->p_sys->p_qdport = [o_view qdPort];
[o_view unlockFocus];
[p_req->p_vout->p_sys->o_window setTitle: [NSString
stringWithCString: VOUT_TITLE]];
[p_req->p_vout->p_sys->o_window setAcceptsMouseMovedEvents: YES];
[p_req->p_vout->p_sys->o_window makeKeyAndOrderFront: nil];
p_req->i_result = 1;
}
else if( p_req->i_type == VOUT_REQ_DESTROY_WINDOW )
{
if( !p_req->p_vout->b_fullscreen )
{
NSRect s_rect;
s_rect = [[p_req->p_vout->p_sys->o_window contentView] frame];
p_req->p_vout->p_sys->s_rect.size = s_rect.size;
s_rect = [p_req->p_vout->p_sys->o_window frame];
p_req->p_vout->p_sys->s_rect.origin = s_rect.origin;
p_req->p_vout->p_sys->b_pos_saved = 1;
}
p_req->p_vout->p_sys->p_qdport = nil;
[p_req->p_vout->p_sys->o_window close];
p_req->p_vout->p_sys->o_window = nil;
p_req->i_result = 1;
}
[p_req->o_lock unlockWithCondition: 1];
}
@end
/*****************************************************************************
* vout_vlc_wrapper.h: MacOS X plugin for vlc
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: vout_vlc_wrapper.h,v 1.1 2002/03/19 03:33:52 jlj Exp $
*
* Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
*
* This program 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.
*
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
#define MOUSE_MOVED 0x00000001
#define MOUSE_NOT_MOVED 0x00000002
#define MOUSE_LAST_MOVED 0x00000004
#define MOUSE_NOT_LAST_MOVED 0x00000008
@interface Vout_VLCWrapper : NSObject
{
}
+ (Vout_VLCWrapper *)instance;
+ (NSPort *)sendPort;
- (void)voutDidResize:(void *)_p_vout;
- (void)mouseEvent:(unsigned int)ui_status forVout:(void *)_p_vout;
- (BOOL)keyDown:(NSEvent *)o_event forVout:(void *)_p_vout;
@end
@interface Vout_VLCWrapper (Internal)
- (void)handlePortMessage:(NSPortMessage *)o_msg;
@end
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* vout_window.c: MacOS X plugin for vlc * vout_window.c: MacOS X plugin for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: vout_window.c,v 1.1 2002/02/18 01:34:44 jlj Exp $ * $Id: vout_window.c,v 1.2 2002/03/19 03:33:52 jlj Exp $
* *
* Authors: Jon Lech Johansen <jon-vl@nanocrew.net> * Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
* *
...@@ -24,27 +24,19 @@ ...@@ -24,27 +24,19 @@
/***************************************************************************** /*****************************************************************************
* Preamble * Preamble
*****************************************************************************/ *****************************************************************************/
#include <errno.h> /* ENOMEM */ #import <Cocoa/Cocoa.h>
#include <stdlib.h> /* free() */
#include <string.h> /* strerror() */
#include <videolan/vlc.h> #import "vout_window.h"
#include "video.h"
#include "video_output.h"
#include "interface.h"
#include "macosx.h"
/***************************************************************************** /*****************************************************************************
* VLCWindow implementation * VLCWindow implementation
*****************************************************************************/ *****************************************************************************/
@implementation VLCWindow @implementation VLCWindow
- (void)setVout:(struct vout_thread_s *)_p_vout - (void)setWrapper:(Vout_VLCWrapper *)_o_wrapper forVout:(void *)_p_vout
{ {
p_vout = _p_vout; p_vout = _p_vout;
o_wrapper = _o_wrapper;
} }
- (BOOL)canBecomeKeyWindow - (BOOL)canBecomeKeyWindow
...@@ -55,45 +47,34 @@ ...@@ -55,45 +47,34 @@
- (void)becomeKeyWindow - (void)becomeKeyWindow
{ {
[super becomeKeyWindow]; [super becomeKeyWindow];
p_vout->p_sys->b_mouse_moved = 0;
p_vout->p_sys->i_time_mouse_last_moved = mdate(); [o_wrapper
mouseEvent: (MOUSE_NOT_MOVED | MOUSE_LAST_MOVED)
forVout: p_vout];
} }
- (void)resignKeyWindow - (void)resignKeyWindow
{ {
[super resignKeyWindow]; [super resignKeyWindow];
p_vout->p_sys->b_mouse_moved = 1;
p_vout->p_sys->i_time_mouse_last_moved = 0; [o_wrapper
mouseEvent: (MOUSE_MOVED | MOUSE_NOT_LAST_MOVED)
forVout: p_vout];
} }
- (void)keyDown:(NSEvent *)theEvent - (void)keyDown:(NSEvent *)o_event
{ {
unichar key = 0; if( [o_wrapper keyDown: o_event forVout: p_vout] == NO )
if( [[theEvent characters] length] )
{ {
key = [[theEvent characters] characterAtIndex: 0]; [super keyDown: o_event];
}
switch( key )
{
case 'f': case 'F':
p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE;
break;
case 'q': case 'Q':
p_main->p_intf->b_die = 1;
break;
default:
[super keyDown: theEvent];
break;
} }
} }
- (void)mouseMoved:(NSEvent *)theEvent - (void)mouseMoved:(NSEvent *)o_event
{ {
p_vout->p_sys->i_time_mouse_last_moved = mdate(); [o_wrapper
mouseEvent: MOUSE_LAST_MOVED
forVout: p_vout];
} }
@end @end
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* vout_window.h: MacOS X plugin for vlc * vout_window.h: MacOS X plugin for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: vout_window.h,v 1.1 2002/02/18 01:34:44 jlj Exp $ * $Id: vout_window.h,v 1.2 2002/03/19 03:33:52 jlj Exp $
* *
* Authors: Jon Lech Johansen <jon-vl@nanocrew.net> * Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
* *
...@@ -21,11 +21,14 @@ ...@@ -21,11 +21,14 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/ *****************************************************************************/
#import "vout_vlc_wrapper.h"
@interface VLCWindow : NSWindow @interface VLCWindow : NSWindow
{ {
struct vout_thread_s *p_vout; void *p_vout;
Vout_VLCWrapper *o_wrapper;
} }
- (void)setVout:(struct vout_thread_s *)_p_vout; - (void)setWrapper:(Vout_VLCWrapper *)_o_wrapper forVout:(void *)_p_vout;
@end @end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment