8f3413813ebad3fd41aaf813b821e4946f01faaa
[vlc.git] / src / audio_output / aout_u8.c
1 /*****************************************************************************
2  * aout_u8.c: 8 bit unsigned audio output functions
3  *****************************************************************************
4  * Copyright (C) 1999-2001 VideoLAN
5  * $Id: aout_u8.c,v 1.11 2002/01/14 12:15:10 asmax Exp $
6  *
7  * Authors: Michel Kaempf <maxx@via.ecp.fr>
8  *          Cyril Deguet <asmax@via.ecp.fr>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  * 
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
23  *****************************************************************************/
24
25 /*****************************************************************************
26  * Preamble
27  *****************************************************************************/
28 #include <stdio.h>                                           /* "intf_msg.h" */
29 #include <stdlib.h>                            /* calloc(), malloc(), free() */
30 #include <string.h>
31
32 #include <videolan/vlc.h>
33
34 #include "audio_output.h"
35 #include "aout_common.h"
36
37
38 /*****************************************************************************
39  * Functions
40  *****************************************************************************/
41
42 void aout_U8Thread( aout_thread_t * p_aout )
43 {
44     int i_fifo;
45     long l_buffer, l_buffer_limit, l_bytes;
46
47     /* As the s32_buffer was created with calloc(), we don't have to set this
48      * memory to zero and we can immediately jump into the thread's loop */
49     while ( ! p_aout->b_die )
50     {
51         vlc_mutex_lock( &p_aout->fifos_lock );
52
53         for ( i_fifo = 0; i_fifo < AOUT_MAX_FIFOS; i_fifo++ )
54         {
55             if( p_aout->fifo[i_fifo].b_die )
56             {
57                 aout_FreeFifo( &p_aout->fifo[i_fifo] );
58             }
59             else
60             {
61                 aout_FillBuffer( p_aout, &p_aout->fifo[i_fifo] );
62             }
63         }
64
65         vlc_mutex_unlock( &p_aout->fifos_lock );
66
67         l_buffer_limit = p_aout->l_units << p_aout->b_stereo;
68
69         for ( l_buffer = 0; l_buffer < l_buffer_limit; l_buffer++ )
70         {
71             ((u8 *)p_aout->buffer)[l_buffer] = 
72                     (u8)( ( (p_aout->s32_buffer[l_buffer] / AOUT_MAX_FIFOS / 256) 
73                     + 128 ) * p_aout->i_volume / 256 );
74             p_aout->s32_buffer[l_buffer] = 0;
75         }
76         l_bytes = p_aout->pf_getbufinfo( p_aout, l_buffer_limit );
77         
78         p_aout->date = mdate() + ((((mtime_t)((l_bytes + 4 * p_aout->i_latency) / 
79                 sizeof(u8) << (p_aout->b_stereo))) * 1000000) / 
80                 ((mtime_t)p_aout->l_rate)) + p_main->i_desync;
81  
82         p_aout->pf_play( p_aout, (byte_t *)p_aout->buffer, l_buffer_limit * 
83                 sizeof(u8) );
84         if ( l_bytes > (l_buffer_limit * sizeof(u8)) )
85         {
86             msleep( p_aout->l_msleep );
87         }
88     }
89
90     vlc_mutex_lock( &p_aout->fifos_lock );
91
92     for ( i_fifo = 0; i_fifo < AOUT_MAX_FIFOS; i_fifo++ )
93     {
94         aout_FreeFifo( &p_aout->fifo[i_fifo] );
95     }
96
97     vlc_mutex_unlock( &p_aout->fifos_lock );
98 }
99