Subversion Repositories Kolibri OS

Rev

Rev 2427 | 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 "../winlib/winlib.h"
2427 Serge 9
#include "sound.h"
1696 serge 10
#include "fplay.h"
11
12
 
13
 
14
15
 
2349 Serge 16
17
 
2427 Serge 18
1696 serge 19
 
2349 Serge 20
1696 serge 21
 
2427 Serge 22
1696 serge 23
 
24
int sample_rate;
25
26
 
2427 Serge 27
double audio_base = -1.0;
2693 Serge 28
2427 Serge 29
 
2693 Serge 30
31
 
1696 serge 32
{
33
    int    err;
34
    int    version =-1;
35
    char  *errstr;
36
37
 
2349 Serge 38
39
 
1696 serge 40
    {
41
        mutex_unlock(&driver_lock);
2349 Serge 42
        errstr = "Sound service not installed\n\r";
1696 serge 43
        goto exit_whith_error;
44
    };
2349 Serge 45
46
 
47
48
 
1696 serge 49
50
 
51
        (SOUND_VERSION<(version >> 16)))
52
    {
53
        errstr = "Sound service version mismatch\n\r";
54
        goto exit_whith_error;
55
    }
56
57
 
58
59
 
60
61
 
62
63
 
64
65
 
66
    return 0;
67
};
68
69
 
70
static double  audio_delta;
71
static double  last_time_stamp;
2427 Serge 72
1696 serge 73
 
2427 Serge 74
 
75
{
1696 serge 76
    double tstamp;
77
78
 
79
    return tstamp - audio_delta;
80
};
81
82
 
2349 Serge 83
{
84
    AVPacket   pkt;
85
    AVPacket    pkt_tmp;
86
1696 serge 87
 
2349 Serge 88
    int         data_size=0;
89
90
 
91
        return 1;
92
93
 
94
        return 0;
95
96
 
97
98
 
99
100
 
101
    {
102
        data_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
103
104
 
105
                                   &data_size, &pkt_tmp);
106
107
 
108
        {
109
//            if(audio_base == -1.0)
2693 Serge 110
//            {
111
//                if (pkt.pts != AV_NOPTS_VALUE)
112
//                    audio_base = get_audio_base() * pkt.pts;
113
//                printf("audio base %f\n", audio_base);
114
//            };
115
116
 
2349 Serge 117
            pkt_tmp.size -= len;
118
119
 
120
            memcpy(astream.buffer+astream.count, decoder_buffer, data_size);
121
            astream.count += data_size;
122
            mutex_unlock(&astream.lock);
123
       }
124
       else pkt_tmp.size = 0;
125
    }
126
    av_free_packet(&pkt);
127
    return 1;
128
};
129
130
 
131
 
2427 Serge 132
{
133
    SND_EVENT   evnt;
134
    uint32_t    offset;
135
    double      time_stamp;
136
137
 
138
139
 
140
    {
141
        GetNotify(&evnt);
142
143
 
144
        {
145
            printf("invalid event code %d\n\r", evnt.code);
146
            continue;
147
        }
148
149
 
150
        {
151
            printf("invalid stream %x hBuff= %x\n\r",
152
                    evnt.stream, hbuff);
153
            continue;
154
        }
155
156
 
157
        audio_delta = time_stamp - last_time_stamp;
158
159
 
160
161
 
162
        {
163
            SetBuffer(hbuff, astream.buffer, offset, buffsize);
164
            samples_written+= buffsize/4;
165
            astream.count -= buffsize;
166
            if(astream.count)
167
                memcpy(astream.buffer, astream.buffer+buffsize, astream.count);
168
            mutex_unlock(&astream.lock);
169
        };
170
        break;
171
    };
172
#endif
173
174
 
175
176
 
177
 
2349 Serge 178
{
1696 serge 179
    SND_EVENT evnt;
180
2427 Serge 181
 
1696 serge 182
    int      samples;
183
    int       err;
184
    char     *errstr;
185
    int       active;
2427 Serge 186
1696 serge 187
 
188
 
189
    {
190
        errstr = "Cannot create sound buffer\n\r";
191
        goto exit_whith_error;
192
    };
193
194
 
195
196
 
197
    {
198
        errstr = "Cannot get buffer size\n\r";
199
        goto exit_whith_error;
200
    };
201
202
 
203
204
 
205
206
 
207
               (player_state != CLOSED) )
2427 Serge 208
        yield();
1696 serge 209
210
 
2349 Serge 211
    {
1696 serge 212
        SetBuffer(hBuff, astream.buffer, 0, buffsize);
213
        samples_written+= buffsize/4;
2427 Serge 214
        astream.count -= buffsize;
1696 serge 215
        if(astream.count)
216
            memcpy(astream.buffer, astream.buffer+buffsize, astream.count);
217
        mutex_unlock(&astream.lock);
2349 Serge 218
    };
1696 serge 219
220
 
2427 Serge 221
    {
1696 serge 222
        uint32_t  offset;
223
        double    event_stamp, wait_stamp;
2427 Serge 224
        int       too_late = 0;
225
1696 serge 226
 
2693 Serge 227
           (player_state == PLAY_INIT) )
228
        {
1696 serge 229
            if( active )
2427 Serge 230
            {
231
                StopBuffer(hBuff);
232
                active = 0;
233
            };
2693 Serge 234
            delay(1);
2427 Serge 235
            continue;
1696 serge 236
        }
237
        else if(player_state == REWIND)
2693 Serge 238
        {
1696 serge 239
            if( active )
2693 Serge 240
            {
241
                StopBuffer(hBuff);
242
                active = 0;
243
            };
244
            mutex_lock(&astream.lock);
245
            astream.count = 0;
246
            mutex_unlock(&astream.lock);
247
            delay(1);
248
            continue;
249
        }
250
        else if(player_state == PAUSE_2_PLAY)
251
        {
252
//            SetTimeBase(hBuff, audio_base);
253
            GetTimeStamp(hBuff, &last_time_stamp);
2427 Serge 254
//            printf("last_time_stamp %f\n", last_time_stamp);
2693 Serge 255
256
 
2427 Serge 257
            {
258
                errstr = "Cannot play buffer\n\r";
259
                goto exit_whith_error;
260
            };
261
            active = 1;
262
            sync_audio(hBuff, buffsize);
263
            player_state = PLAY;
264
            printf("render: set audio latency to %f\n", audio_delta);
2693 Serge 265
        }
266
        else if(player_state == REWIND_2_PLAY)
267
        {
268
            while( (astream.count < buffsize*2) &&
269
                   (player_state != CLOSED) )
270
            yield();
271
272
 
273
            GetTimeStamp(hBuff, &last_time_stamp);
274
            printf("last audio time stamp %f\n", last_time_stamp);
275
276
 
277
            {
278
                errstr = "Cannot play buffer\n\r";
279
                goto exit_whith_error;
280
            };
281
            active = 1;
282
            sync_audio(hBuff, buffsize);
283
            player_state = PLAY;
284
            printf("render: set audio latency to %f\n", audio_delta);
285
        };
1696 serge 286
287
 
288
289
 
290
        {
291
            printf("invalid event code %d\n\r", evnt.code);
292
            continue;
293
        }
294
295
 
296
        {
297
            printf("invalid stream %x hBuff= %x\n\r",
298
                    evnt.stream, hBuff);
299
            continue;
300
        };
301
302
 
303
304
 
305
306
 
307
               (player_state != CLOSED) )
2427 Serge 308
        {
1696 serge 309
            yield();
310
            GetTimeStamp(hBuff, &wait_stamp);
311
            if( (wait_stamp - event_stamp) >
312
                 samples*1500/sample_rate )
313
            {
314
                samples_lost+= samples;
315
                audio_delta = (double)samples_lost*1000/sample_rate;
316
//                printf("audio delta %f\n", audio_delta);
317
                too_late = 1;
318
                break;
319
            }
320
        };
321
322
 
2427 Serge 323
        {
324
            too_late = 0;
325
            continue;
1696 serge 326
        };
2427 Serge 327
1696 serge 328
 
2349 Serge 329
        SetBuffer(hBuff, astream.buffer, offset, buffsize);
1696 serge 330
        samples_written+= buffsize/4;
2427 Serge 331
        astream.count -= buffsize;
1696 serge 332
        if(astream.count)
333
            memcpy(astream.buffer, astream.buffer+buffsize, astream.count);
334
        mutex_unlock(&astream.lock);
2349 Serge 335
    }
1696 serge 336
337
 
2349 Serge 338
    DestroyBuffer(hBuff);
339
1696 serge 340
 
2349 Serge 341
342
 
1696 serge 343
344
 
345
    return -1;
2349 Serge 346
1696 serge 347
 
348