~ubuntu-branches/debian/wheezy/vlc/wheezy

« back to all changes in this revision

Viewing changes to modules/audio_mixer/spdif.c

Tags: upstream-0.7.2.final
ImportĀ upstreamĀ versionĀ 0.7.2.final

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*****************************************************************************
 
2
 * spdif.c : dummy mixer for S/PDIF output (1 input only)
 
3
 *****************************************************************************
 
4
 * Copyright (C) 2002 VideoLAN
 
5
 * $Id: spdif.c 7522 2004-04-27 16:35:15Z sam $
 
6
 *
 
7
 * Authors: Christophe Massiot <massiot@via.ecp.fr>
 
8
 *
 
9
 * This program is free software; you can redistribute it and/or modify
 
10
 * it under the terms of the GNU General Public License as published by
 
11
 * the Free Software Foundation; either version 2 of the License, or
 
12
 * (at your option) any later version.
 
13
 * 
 
14
 * This program is distributed in the hope that it will be useful,
 
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
17
 * GNU General Public License for more details.
 
18
 *
 
19
 * You should have received a copy of the GNU General Public License
 
20
 * along with this program; if not, write to the Free Software
 
21
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
 
22
 *****************************************************************************/
 
23
 
 
24
/*****************************************************************************
 
25
 * Preamble
 
26
 *****************************************************************************/
 
27
#include <stdlib.h>                                      /* malloc(), free() */
 
28
#include <string.h>
 
29
 
 
30
#include <vlc/vlc.h>
 
31
#include "audio_output.h"
 
32
#include "aout_internal.h"
 
33
 
 
34
/*****************************************************************************
 
35
 * Local prototypes
 
36
 *****************************************************************************/
 
37
static int  Create    ( vlc_object_t * );
 
38
 
 
39
static void DoWork    ( aout_instance_t *, aout_buffer_t * );
 
40
 
 
41
/*****************************************************************************
 
42
 * Module descriptor
 
43
 *****************************************************************************/
 
44
vlc_module_begin();
 
45
    set_description( _("Dummy S/PDIF audio mixer") );
 
46
    set_capability( "audio mixer", 1 );
 
47
    set_callbacks( Create, NULL );
 
48
vlc_module_end();
 
49
 
 
50
/*****************************************************************************
 
51
 * Create: allocate spdif mixer
 
52
 *****************************************************************************/
 
53
static int Create( vlc_object_t *p_this )
 
54
{
 
55
    aout_instance_t * p_aout = (aout_instance_t *)p_this;
 
56
 
 
57
    if ( !AOUT_FMT_NON_LINEAR(&p_aout->mixer.mixer) )
 
58
    {
 
59
        return -1;
 
60
    }
 
61
 
 
62
    p_aout->mixer.pf_do_work = DoWork;
 
63
    /* This is a bit kludgy - do not ask for a new buffer, since the one
 
64
     * provided by the first input will be good enough. */
 
65
    p_aout->mixer.output_alloc.i_alloc_type = AOUT_ALLOC_NONE;
 
66
 
 
67
    return 0;
 
68
}
 
69
 
 
70
/*****************************************************************************
 
71
 * DoWork: mix a new output buffer - this does nothing, indeed
 
72
 *****************************************************************************/
 
73
static void DoWork( aout_instance_t * p_aout, aout_buffer_t * p_buffer )
 
74
{
 
75
    int i = 0;
 
76
    aout_input_t * p_input = p_aout->pp_inputs[i];
 
77
    while ( p_input->b_error )
 
78
    {
 
79
        p_input = p_aout->pp_inputs[++i];
 
80
    }
 
81
    aout_FifoPop( p_aout, &p_input->fifo );
 
82
 
 
83
    /* Empty other FIFOs to avoid a memory leak. */
 
84
    for ( i++; i < p_aout->i_nb_inputs; i++ )
 
85
    {
 
86
        aout_fifo_t * p_fifo;
 
87
        aout_buffer_t * p_deleted;
 
88
 
 
89
        p_input = p_aout->pp_inputs[i];
 
90
        if ( p_input->b_error ) continue;
 
91
        p_fifo = &p_input->fifo;
 
92
        p_deleted = p_fifo->p_first;  
 
93
        while ( p_deleted != NULL )
 
94
        {
 
95
            aout_buffer_t * p_next = p_deleted->p_next;
 
96
            aout_BufferFree( p_deleted );
 
97
            p_deleted = p_next;
 
98
        }
 
99
        p_fifo->p_first = NULL;
 
100
        p_fifo->pp_last = &p_fifo->p_first;
 
101
    }
 
102
}
 
103