Subversion Repositories Kolibri OS

Rev

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