14,8 → 14,13 |
astream_t astream; |
|
extern uint8_t *decoder_buffer; |
int resampler_size; |
volatile int sound_level_0; |
volatile int sound_level_1; |
|
extern volatile enum player_state player_state; |
volatile enum player_state player_state; |
volatile enum player_state decoder_state; |
volatile enum player_state sound_state; |
|
extern volatile uint32_t driver_lock; |
|
46,7 → 51,7 |
|
mutex_unlock(&driver_lock); |
|
printf("sound version 0x%x\n", version); |
// printf("sound version 0x%x\n", version); |
|
if( (SOUND_VERSION>(version&0xFFFF)) || |
(SOUND_VERSION<(version >> 16))) |
67,6 → 72,11 |
return 0; |
}; |
|
void set_audio_volume(int left, int right) |
{ |
SetVolume(hBuff, left, right); |
}; |
|
static uint64_t samples_lost; |
static double audio_delta; |
static double last_time_stamp; |
89,7 → 99,7 |
int data_size=0; |
|
if( astream.count > AVCODEC_MAX_AUDIO_FRAME_SIZE*7) |
return 1; |
return -1; |
|
if( get_packet(qa, &pkt) == 0 ) |
return 0; |
161,8 → 171,16 |
|
mutex_lock(&astream.lock); |
{ |
if(astream.count < buffsize) |
{ |
memset(astream.buffer+astream.count, |
0, buffsize-astream.count); |
astream.count = buffsize; |
}; |
|
SetBuffer(hbuff, astream.buffer, offset, buffsize); |
samples_written+= buffsize/4; |
|
astream.count -= buffsize; |
if(astream.count) |
memcpy(astream.buffer, astream.buffer+buffsize, astream.count); |
174,7 → 192,6 |
|
}; |
|
|
int audio_thread(void *param) |
{ |
SND_EVENT evnt; |
192,7 → 209,7 |
goto exit_whith_error; |
}; |
|
SetVolume(hBuff,-1000,-1000); |
SetVolume(hBuff,-1875,-1875); |
|
if((err = GetBufferSize(hBuff, &buffsize)) != 0) |
{ |
200,24 → 217,10 |
goto exit_whith_error; |
}; |
|
buffsize = buffsize/2; |
resampler_size = buffsize = buffsize/2; |
|
samples = buffsize/4; |
|
while( (astream.count < buffsize*2) && |
(player_state != CLOSED) ) |
yield(); |
|
mutex_lock(&astream.lock); |
{ |
SetBuffer(hBuff, astream.buffer, 0, buffsize); |
samples_written+= buffsize/4; |
astream.count -= buffsize; |
if(astream.count) |
memcpy(astream.buffer, astream.buffer+buffsize, astream.count); |
mutex_unlock(&astream.lock); |
}; |
|
while( player_state != CLOSED) |
{ |
uint32_t offset; |
224,55 → 227,29 |
double event_stamp, wait_stamp; |
int too_late = 0; |
|
if((player_state == PAUSE) || |
(player_state == PLAY_INIT) ) |
switch(sound_state) |
{ |
if( active ) |
case PREPARE: |
|
mutex_lock(&astream.lock); |
if(astream.count < buffsize*2) |
{ |
StopBuffer(hBuff); |
active = 0; |
memset(astream.buffer+astream.count, |
0, buffsize*2-astream.count); |
astream.count = buffsize*2; |
}; |
delay(1); |
continue; |
} |
else if(player_state == REWIND) |
{ |
if( active ) |
{ |
StopBuffer(hBuff); |
active = 0; |
}; |
mutex_lock(&astream.lock); |
astream.count = 0; |
|
SetBuffer(hBuff, astream.buffer, 0, buffsize*2); |
astream.count -= buffsize*2; |
if(astream.count) |
memcpy(astream.buffer, astream.buffer+buffsize*2, astream.count); |
mutex_unlock(&astream.lock); |
delay(1); |
continue; |
} |
else if(player_state == PAUSE_2_PLAY) |
{ |
// SetTimeBase(hBuff, audio_base); |
GetTimeStamp(hBuff, &last_time_stamp); |
// printf("last_time_stamp %f\n", last_time_stamp); |
|
if((err = PlayBuffer(hBuff, 0)) !=0 ) |
{ |
errstr = "Cannot play buffer\n\r"; |
goto exit_whith_error; |
}; |
active = 1; |
sync_audio(hBuff, buffsize); |
player_state = PLAY; |
printf("render: set audio latency to %f\n", audio_delta); |
} |
else if(player_state == REWIND_2_PLAY) |
{ |
while( (astream.count < buffsize*2) && |
(player_state != CLOSED) ) |
yield(); |
SetTimeBase(hBuff, audio_base); |
|
SetTimeBase(hBuff, audio_base); |
case PAUSE_2_PLAY: |
GetTimeStamp(hBuff, &last_time_stamp); |
printf("last audio time stamp %f\n", last_time_stamp); |
// printf("last audio time stamp %f\n", last_time_stamp); |
|
if((err = PlayBuffer(hBuff, 0)) !=0 ) |
{ |
281,10 → 258,12 |
}; |
active = 1; |
sync_audio(hBuff, buffsize); |
player_state = PLAY; |
printf("render: set audio latency to %f\n", audio_delta); |
}; |
sound_state = PLAY; |
// printf("render: set audio latency to %f\n", audio_delta); |
|
/* breaktrough */ |
|
case PLAY: |
GetNotify(&evnt); |
|
if(evnt.code != 0xFF000001) |
300,42 → 279,71 |
continue; |
}; |
|
GetTimeStamp(hBuff, &event_stamp); |
|
offset = evnt.offset; |
|
while( (astream.count < buffsize) && |
(player_state != CLOSED) ) |
mutex_lock(&astream.lock); |
if(astream.count < buffsize) |
{ |
yield(); |
GetTimeStamp(hBuff, &wait_stamp); |
if( (wait_stamp - event_stamp) > |
samples*1500/sample_rate ) |
{ |
samples_lost+= samples; |
audio_delta = (double)samples_lost*1000/sample_rate; |
// printf("audio delta %f\n", audio_delta); |
too_late = 1; |
break; |
} |
memset(astream.buffer+astream.count, |
0, buffsize-astream.count); |
astream.count = buffsize; |
}; |
|
if((too_late == 1) || (player_state == CLOSED)) |
SetBuffer(hBuff, astream.buffer, offset, buffsize); |
|
{ |
too_late = 0; |
continue; |
double val = 0; |
int16_t *src = (int16_t*)astream.buffer; |
int samples = buffsize/2; |
int i; |
|
for(i = 0, val = 0; i < samples/2; i++, src++) |
if(val < abs(*src)) |
val= abs(*src); // * *src; |
|
sound_level_0 = val; //sqrt(val / (samples/2)); |
|
for(i = 0, val = 0; i < samples/2; i++, src++) |
if(val < abs(*src)) |
val= abs(*src); // * *src; |
|
sound_level_1 = val; //sqrt(val / (samples/2)); |
|
// printf("%d\n", sound_level); |
}; |
|
mutex_lock(&astream.lock); |
SetBuffer(hBuff, astream.buffer, offset, buffsize); |
samples_written+= buffsize/4; |
|
astream.count -= buffsize; |
if(astream.count) |
memcpy(astream.buffer, astream.buffer+buffsize, astream.count); |
mutex_unlock(&astream.lock); |
break; |
|
case PLAY_2_STOP: |
if( active ) |
{ |
ResetBuffer(hBuff, SND_RESET_ALL); |
audio_base = -1.0; |
active = 0; |
} |
sound_state = STOP; |
break; |
|
case PLAY_2_PAUSE: |
if( active ) |
{ |
StopBuffer(hBuff); |
}; |
sound_state = PAUSE; |
|
case PAUSE: |
case STOP: |
delay(1); |
}; |
} |
|
StopBuffer(hBuff); |
DestroyBuffer(hBuff); |
|
return 0; |