Commit fec0d40b authored by Christophe Massiot's avatar Christophe Massiot

* S/PDIF output should now be working (untested, though).

parent 19457f20
This diff is collapsed.
......@@ -441,13 +441,12 @@ BUILTINS="${BUILTINS}"
PLUGINS="${PLUGINS} misc/dummy/dummy misc/null/null"
PLUGINS="${PLUGINS} control/rc/rc misc/logger/logger access/file access/udp access/http misc/network/ipv4 misc/memcpy/memcpy"
PLUGINS="${PLUGINS} demux/mpeg/es demux/mpeg/audio demux/mpeg/mpeg_system demux/mpeg/ps demux/mpeg/ts"
PLUGINS="${PLUGINS} codec/mpeg_video/idct/idct codec/mpeg_video/idct/idctclassic codec/mpeg_video/motion/motion codec/mpeg_video/mpeg_video codec/spudec/spudec"
PLUGINS="${PLUGINS} codec/spdif"
PLUGINS="${PLUGINS} codec/mpeg_video/idct/idct codec/mpeg_video/idct/idctclassic codec/mpeg_video/motion/motion codec/mpeg_video/mpeg_video codec/spudec/spudec codec/spdif"
#PLUGINS="${PLUGINS} codec/a52old/imdct/imdct codec/a52old/downmix/downmix codec/mpeg_audio/mpeg_audio codec/a52old/a52old codec/lpcm/lpcm"
PLUGINS="${PLUGINS} video_filter/deinterlace/deinterlace video_filter/invert video_filter/wall video_filter/transform video_filter/distort video_filter/clone video_filter/crop"
PLUGINS="${PLUGINS} audio_filter/converter/float32tos16"
PLUGINS="${PLUGINS} audio_filter/converter/float32tos16 audio_filter/converter/a52tospdif"
PLUGINS="${PLUGINS} audio_filter/resampler/trivial"
PLUGINS="${PLUGINS} audio_mixer/trivial"
PLUGINS="${PLUGINS} audio_mixer/trivial audio_mixer/spdif"
PLUGINS="${PLUGINS} audio_output/file"
#PLUGINS="${PLUGINS} visualization/scope/scope"
PLUGINS="${PLUGINS} video_chroma/i420_rgb video_chroma/i420_yuy2 video_chroma/i422_yuy2 video_chroma/i420_ymga"
......
float32tos16_SOURCES = float32tos16.c
a52tospdif_SOURCES = a52tospdif.c
/*****************************************************************************
* a52tospdif.c : encapsulates A/52 frames into S/PDIF packets
*****************************************************************************
* Copyright (C) 2002 VideoLAN
* $Id: a52tospdif.c,v 1.1 2002/08/11 22:36:35 massiot Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Stphane Borel <stef@via.ecp.fr>
*
* 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>
#include <stdlib.h> /* malloc(), free() */
#include <string.h>
#include <vlc/vlc.h>
#include "audio_output.h"
#include "aout_internal.h"
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static int Create ( vlc_object_t * );
static void DoWork ( aout_instance_t *, aout_filter_t *, aout_buffer_t *,
aout_buffer_t * );
/*****************************************************************************
* Module descriptor
*****************************************************************************/
vlc_module_begin();
set_description( _("aout filter for A/52->S/PDIF encapsulation") );
set_capability( "audio filter", 10 );
set_callbacks( Create, NULL );
vlc_module_end();
/*****************************************************************************
* Create: allocate trivial mixer
*****************************************************************************
* This function allocates and initializes a Crop vout method.
*****************************************************************************/
static int Create( vlc_object_t *p_this )
{
aout_filter_t * p_filter = (aout_filter_t *)p_this;
if ( p_filter->input.i_format != AOUT_FMT_A52
&& p_filter->output.i_format != AOUT_FMT_SPDIF )
{
return -1;
}
p_filter->pf_do_work = DoWork;
p_filter->b_in_place = 0;
return 0;
}
/*****************************************************************************
* DoWork: convert a buffer
*****************************************************************************/
static void DoWork( aout_instance_t * p_aout, aout_filter_t * p_filter,
aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf )
{
static const u8 p_sync[6] = { 0x72, 0xF8, 0x1F, 0x4E, 0x01, 0x00 };
u16 i_length = *(u16 *)p_in_buf->p_buffer;
u16 * pi_length;
byte_t * p_in = p_in_buf->p_buffer;
byte_t * p_out = p_out_buf->p_buffer;
/* Copy the S/PDIF headers. */
memcpy( p_out, p_sync, 6 );
pi_length = (u16 *)(p_out + 6);
*pi_length = i_length;
/* FIXME : if i_length is odd, the following code sucks. What should
* we do ? --Meuuh */
#ifndef WORDS_BIGENDIAN
# ifdef HAVE_SWAB
swab( p_out + 8, p_in + sizeof(u16), i_length );
# else
p_out += 8;
p_in += sizeof(u16);
for ( i = 0; i < i_length / 2; i++ )
{
p_out[0] = p_in[1];
p_out[1] = p_in[0];
p_out += 2; p_in += 2;
}
# endif
#else
p_filter->p_vlc->pf_memcpy( p_out + 8, p_in + sizeof(u16), i_length );
#endif
p_out_buf->i_nb_samples = p_in_buf->i_nb_samples; /* == 1 */
}
trivial_SOURCES = trivial.c
spdif_SOURCES = spdif.c
/*****************************************************************************
* spdif.c : dummy mixer for S/PDIF output (1 input only)
*****************************************************************************
* Copyright (C) 2002 VideoLAN
* $Id: spdif.c,v 1.1 2002/08/11 22:36:35 massiot Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
* 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>
#include <stdlib.h> /* malloc(), free() */
#include <string.h>
#include <vlc/vlc.h>
#include "audio_output.h"
#include "aout_internal.h"
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static int Create ( vlc_object_t * );
static void DoWork ( aout_instance_t *, aout_buffer_t * );
/*****************************************************************************
* Module descriptor
*****************************************************************************/
vlc_module_begin();
set_description( _("dummy spdif audio mixer module") );
set_capability( "audio mixer", 1 );
add_shortcut( "spdif" );
set_callbacks( Create, NULL );
vlc_module_end();
/*****************************************************************************
* Create: allocate spdif mixer
*****************************************************************************/
static int Create( vlc_object_t *p_this )
{
aout_instance_t * p_aout = (aout_instance_t *)p_this;
if ( p_aout->mixer.output.i_format != AOUT_FMT_SPDIF )
{
return -1;
}
p_aout->mixer.pf_do_work = DoWork;
/* This is a bit kludgy - do not ask for a new buffer, since the one
* provided by the first input will be good enough. */
p_aout->mixer.output_alloc.i_alloc = AOUT_ALLOC_NONE;
return 0;
}
/*****************************************************************************
* DoWork: mix a new output buffer - this does nothing, indeed
*****************************************************************************/
static void DoWork( aout_instance_t * p_aout, aout_buffer_t * p_buffer )
{
}
......@@ -2,7 +2,7 @@
* trivial.c : trivial mixer plug-in (1 input, no downmixing)
*****************************************************************************
* Copyright (C) 2002 VideoLAN
* $Id: trivial.c,v 1.2 2002/08/08 00:35:10 sam Exp $
* $Id: trivial.c,v 1.3 2002/08/11 22:36:35 massiot Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
......@@ -51,8 +51,6 @@ vlc_module_end();
/*****************************************************************************
* Create: allocate trivial mixer
*****************************************************************************
* This function allocates and initializes a Crop vout method.
*****************************************************************************/
static int Create( vlc_object_t *p_this )
{
......
......@@ -2,7 +2,7 @@
* oss.c : OSS /dev/dsp module for vlc
*****************************************************************************
* Copyright (C) 2000-2002 VideoLAN
* $Id: oss.c,v 1.5 2002/08/11 01:27:01 massiot Exp $
* $Id: oss.c,v 1.6 2002/08/11 22:36:35 massiot Exp $
*
* Authors: Michel Kaempf <maxx@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
......@@ -189,46 +189,49 @@ static int SetFormat( aout_instance_t *p_aout )
return -1;
}
/* FIXME */
if ( p_aout->output.output.i_channels > 2 )
if ( !AOUT_FMT_IS_SPDIF( &p_aout->output.output ) )
{
msg_Warn( p_aout, "only two channels are supported at the moment" );
/* Trigger downmixing */
p_aout->output.output.i_channels = 2;
}
/* FIXME */
if ( p_aout->output.output.i_channels > 2 )
{
msg_Warn( p_aout, "only two channels are supported at the moment" );
/* Trigger downmixing */
p_aout->output.output.i_channels = 2;
}
/* Set the number of channels */
b_stereo = p_aout->output.output.i_channels - 1;
/* Set the number of channels */
b_stereo = p_aout->output.output.i_channels - 1;
if( ioctl( p_sys->i_fd, SNDCTL_DSP_STEREO, &b_stereo ) < 0 )
{
msg_Err( p_aout, "cannot set number of audio channels (%i)",
p_aout->output.output.i_channels );
return -1;
}
if( ioctl( p_sys->i_fd, SNDCTL_DSP_STEREO, &b_stereo ) < 0 )
{
msg_Err( p_aout, "cannot set number of audio channels (%i)",
p_aout->output.output.i_channels );
return -1;
}
if ( b_stereo + 1 != p_aout->output.output.i_channels )
{
msg_Warn( p_aout, "driver forced up/downmixing %li->%li",
p_aout->output.output.i_channels,
b_stereo + 1 );
p_aout->output.output.i_channels = b_stereo + 1;
}
if ( b_stereo + 1 != p_aout->output.output.i_channels )
{
msg_Warn( p_aout, "driver forced up/downmixing %li->%li",
p_aout->output.output.i_channels,
b_stereo + 1 );
p_aout->output.output.i_channels = b_stereo + 1;
}
/* Set the output rate */
i_rate = p_aout->output.output.i_rate;
if( ioctl( p_sys->i_fd, SNDCTL_DSP_SPEED, &i_rate ) < 0 )
{
msg_Err( p_aout, "cannot set audio output rate (%i)",
p_aout->output.output.i_rate );
return -1;
}
/* Set the output rate */
i_rate = p_aout->output.output.i_rate;
if( ioctl( p_sys->i_fd, SNDCTL_DSP_SPEED, &i_rate ) < 0 )
{
msg_Err( p_aout, "cannot set audio output rate (%i)",
p_aout->output.output.i_rate );
return -1;
}
if( i_rate != p_aout->output.output.i_rate )
{
msg_Warn( p_aout, "driver forced resampling %li->%li",
p_aout->output.output.i_rate, i_rate );
p_aout->output.output.i_rate = i_rate;
if( i_rate != p_aout->output.output.i_rate )
{
msg_Warn( p_aout, "driver forced resampling %li->%li",
p_aout->output.output.i_rate, i_rate );
p_aout->output.output.i_rate = i_rate;
}
}
p_sys->b_initialized = VLC_TRUE;
......
......@@ -2,7 +2,7 @@
* spdif.c: A52 pass-through to external decoder with enabled soundcard
*****************************************************************************
* Copyright (C) 2001-2002 VideoLAN
* $Id: spdif.c,v 1.1 2002/08/11 01:27:01 massiot Exp $
* $Id: spdif.c,v 1.2 2002/08/11 22:36:35 massiot Exp $
*
* Authors: Stphane Borel <stef@via.ecp.fr>
* Juha Yrjola <jyrjola@cc.hut.fi>
......@@ -145,6 +145,7 @@ static int RunDecoder( decoder_fifo_t *p_fifo )
/* Temporary buffer to store the raw frame to be decoded */
byte_t p_header[7];
aout_buffer_t * p_buffer;
u16 * pi_length;
/* Look for sync word - should be 0x0b77 */
RealignBits( &p_dec->bit_stream );
......@@ -215,9 +216,14 @@ static int RunDecoder( decoder_fifo_t *p_fifo )
/ p_dec->output_format.i_rate;
p_buffer->end_date = last_date;
/* The first two bytes store the length of the frame - this is
* a bit kludgy. */
pi_length = (u16 *)p_buffer->p_buffer;
*pi_length = i_frame_size;
/* Get the whole frame. */
memcpy( p_buffer->p_buffer, p_header, 7 );
GetChunk( &p_dec->bit_stream, p_buffer->p_buffer + 7,
memcpy( p_buffer->p_buffer + sizeof(u16), p_header, 7 );
GetChunk( &p_dec->bit_stream, p_buffer->p_buffer + 7 + sizeof(u16),
i_frame_size - 7 );
if( p_dec->p_fifo->b_die ) break;
......
......@@ -2,7 +2,7 @@
* mixer.c : audio output mixing operations
*****************************************************************************
* Copyright (C) 2002 VideoLAN
* $Id: mixer.c,v 1.1 2002/08/07 21:36:56 massiot Exp $
* $Id: mixer.c,v 1.2 2002/08/11 22:36:35 massiot Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
......@@ -111,7 +111,10 @@ void aout_MixerRun( aout_instance_t * p_aout )
/* Run the mixer. */
aout_BufferAlloc( &p_aout->mixer.output_alloc,
(u64)(p_aout->output.i_nb_samples * 1000000)
/ p_aout->output.output.i_rate, NULL,
/ p_aout->output.output.i_rate,
/* This is a bit kludgy, but is actually only used
* for the S/PDIF dummy mixer : */
p_aout->pp_inputs[0]->fifo.p_first,
p_output_buffer );
if ( p_output_buffer == NULL )
{
......
......@@ -2,7 +2,7 @@
* output.c : internal management of output streams for the audio output
*****************************************************************************
* Copyright (C) 2002 VideoLAN
* $Id: output.c,v 1.2 2002/08/09 23:47:23 massiot Exp $
* $Id: output.c,v 1.3 2002/08/11 22:36:35 massiot Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
......@@ -61,7 +61,11 @@ int aout_OutputNew( aout_instance_t * p_aout,
memcpy( &p_aout->output.output, p_format, sizeof(audio_sample_format_t) );
if ( i_rate != -1 ) p_aout->output.output.i_rate = i_rate;
if ( i_channels != -1 ) p_aout->output.output.i_channels = i_channels;
if ( p_aout->output.output.i_format != AOUT_FMT_A52 )
if ( AOUT_FMT_IS_SPDIF(&p_aout->output.output) )
{
p_aout->output.output.i_format = AOUT_FMT_SPDIF;
}
else
{
/* Non-S/PDIF mixer only deals with float32 or fixed32. */
p_aout->output.output.i_format
......@@ -84,8 +88,13 @@ int aout_OutputNew( aout_instance_t * p_aout,
/* Calculate the resulting mixer output format. */
p_aout->mixer.output.i_channels = p_aout->output.output.i_channels;
p_aout->mixer.output.i_rate = p_aout->output.output.i_rate;
if ( p_aout->output.output.i_format != AOUT_FMT_A52 )
if ( AOUT_FMT_IS_SPDIF(&p_aout->output.output) )
{
p_aout->mixer.output.i_format = AOUT_FMT_SPDIF;
}
else
{
/* Non-S/PDIF mixer only deals with float32 or fixed32. */
p_aout->mixer.output.i_format
= (p_aout->p_vlc->i_cpu & CPU_CAPABILITY_FPU) ?
AOUT_FMT_FLOAT32 : AOUT_FMT_FIXED32;
......
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