Subversion Repositories Kolibri OS

Rev

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