Subversion Repositories Kolibri OS

Rev

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