Subversion Repositories Kolibri OS

Rev

Rev 1696 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1696 serge 1
 
2
#include 
3
#include 
4
#include 
5
6
 
7
#include 
8
#include "sound.h"
9
#include "fplay.h"
10
11
 
12
 
13
14
 
15
16
 
2349 Serge 17
18
 
1696 serge 19
20
 
2349 Serge 21
1696 serge 22
 
23
 
24
int sample_rate;
25
26
 
27
{
28
    int    err;
29
    int    version =-1;
30
    char  *errstr;
31
32
 
2349 Serge 33
34
 
1696 serge 35
    {
36
        mutex_unlock(&driver_lock);
2349 Serge 37
        errstr = "Sound service not installed\n\r";
1696 serge 38
        goto exit_whith_error;
39
    };
2349 Serge 40
41
 
42
43
 
1696 serge 44
45
 
46
        (SOUND_VERSION<(version >> 16)))
47
    {
48
        errstr = "Sound service version mismatch\n\r";
49
        goto exit_whith_error;
50
    }
51
52
 
53
54
 
55
56
 
57
58
 
59
60
 
61
    return 0;
62
};
63
64
 
65
static double  audio_delta;
66
67
 
68
{
69
    double tstamp;
70
71
 
72
    return tstamp - audio_delta;
73
};
74
75
 
2349 Serge 76
{
77
    AVPacket   pkt;
78
    AVPacket    pkt_tmp;
79
1696 serge 80
 
2349 Serge 81
    int         audio_size;
82
    int         len;
83
    int         data_size=0;
84
85
 
86
        return 1;
87
88
 
89
        return 0;
90
91
 
92
93
 
94
95
 
96
    {
97
        data_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
98
99
 
100
                                   &data_size, &pkt_tmp);
101
102
 
103
        {
104
            pkt_tmp.data += len;
105
            pkt_tmp.size -= len;
106
107
 
108
            memcpy(astream.buffer+astream.count, decoder_buffer, data_size);
109
            astream.count += data_size;
110
            mutex_unlock(&astream.lock);
111
       }
112
       else pkt_tmp.size = 0;
113
    }
114
    av_free_packet(&pkt);
115
    return 1;
116
};
117
118
 
119
 
120
{
1696 serge 121
    SND_EVENT evnt;
122
    int       buffsize;
123
    int      samples;
124
    int       err;
125
    char     *errstr;
126
127
 
128
 
129
    {
130
        errstr = "Cannot create sound buffer\n\r";
131
        goto exit_whith_error;
132
    };
133
134
 
135
136
 
137
    {
138
        errstr = "Cannot get buffer size\n\r";
139
        goto exit_whith_error;
140
    };
141
142
 
143
144
 
145
146
 
147
               (status != 0) )
148
        yield();
149
150
 
2349 Serge 151
    {
1696 serge 152
        SetBuffer(hBuff, astream.buffer, 0, buffsize);
153
        astream.count -= buffsize;
154
        if(astream.count)
155
            memcpy(astream.buffer, astream.buffer+buffsize, astream.count);
156
        mutex_unlock(&astream.lock);
2349 Serge 157
    };
1696 serge 158
159
 
160
    {
161
        errstr = "Cannot play buffer\n\r";
162
        goto exit_whith_error;
163
    };
164
165
 
166
 
167
168
 
169
    {
170
        uint32_t  offset;
171
172
 
173
174
 
175
        {
176
            printf("invalid event code %d\n\r", evnt.code);
177
            continue;
178
        }
179
180
 
181
        {
182
            printf("invalid stream %x hBuff= %x\n\r",
183
                    evnt.stream, hBuff);
184
            continue;
185
        }
186
187
 
188
        samples_lost = audio_delta*sample_rate/1000;
189
190
 
191
192
 
2349 Serge 193
        {
1696 serge 194
            SetBuffer(hBuff, astream.buffer, offset, buffsize);
195
            astream.count -= buffsize;
196
            if(astream.count)
197
                memcpy(astream.buffer, astream.buffer+buffsize, astream.count);
198
            mutex_unlock(&astream.lock);
2349 Serge 199
        };
1696 serge 200
        break;
201
    };
202
#endif
203
204
 
205
206
 
207
    {
208
        uint32_t  offset;
209
        double    event_stamp, wait_stamp;
210
        int       too_late = 0;
211
212
 
213
214
 
215
        {
216
            printf("invalid event code %d\n\r", evnt.code);
217
            continue;
218
        }
219
220
 
221
        {
222
            printf("invalid stream %x hBuff= %x\n\r",
223
                    evnt.stream, hBuff);
224
            continue;
225
        };
226
227
 
228
229
 
230
231
 
232
               (status != 0) )
233
        {
234
            yield();
235
            GetTimeStamp(hBuff, &wait_stamp);
236
            if( (wait_stamp - event_stamp) >
237
                 samples*1500/sample_rate )
238
            {
239
                samples_lost+= samples;
240
                audio_delta = (double)samples_lost*1000/sample_rate;
241
//                printf("audio delta %f\n", audio_delta);
242
                too_late = 1;
243
                break;
244
            }
245
        };
246
247
 
248
            continue;
249
250
 
2349 Serge 251
        SetBuffer(hBuff, astream.buffer, offset, buffsize);
1696 serge 252
        astream.count -= buffsize;
253
        if(astream.count)
254
            memcpy(astream.buffer, astream.buffer+buffsize, astream.count);
255
        mutex_unlock(&astream.lock);
2349 Serge 256
    }
1696 serge 257
258
 
2349 Serge 259
    DestroyBuffer(hBuff);
260
1696 serge 261
 
2349 Serge 262
263
 
1696 serge 264
265
 
266
    return -1;
2349 Serge 267
1696 serge 268
 
269