reafactor wave_buffer

This commit is contained in:
idea4good 2019-01-17 14:39:18 +08:00
parent f6fbf66e58
commit b8c67ec55a
3 changed files with 31 additions and 36 deletions

View File

@ -2,7 +2,7 @@
#define _WAVE_BUFFER_H_ #define _WAVE_BUFFER_H_
#define WAVE_BUFFER_LEN 1024 #define WAVE_BUFFER_LEN 1024
#define WAVE_FRAME_LEN 8 #define WAVE_READ_CACHE_LEN 8
#define BUFFER_EMPTY -1111 #define BUFFER_EMPTY -1111
#define BUFFER_FULL -2222; #define BUFFER_FULL -2222;
class c_wave_buffer class c_wave_buffer
@ -10,7 +10,7 @@ class c_wave_buffer
public: public:
c_wave_buffer(); c_wave_buffer();
int write_wave_data(short data); int write_wave_data(short data);
int read_wave_data_by_frame(short &max, short &min, short len, unsigned int seq); int read_wave_data_by_frame(short &max, short &min, short frame_len, unsigned int sequence, short offset);
void reset(); void reset();
void clear_data(); void clear_data();
short get_cnt(); short get_cnt();
@ -26,10 +26,11 @@ private:
int m_max_older; int m_max_older;
int m_last_data; int m_last_data;
short m_fb_min[WAVE_FRAME_LEN]; short m_read_cache_min[WAVE_READ_CACHE_LEN];
short m_fb_mid[WAVE_FRAME_LEN]; short m_read_cache_mid[WAVE_READ_CACHE_LEN];
short m_fb_max[WAVE_FRAME_LEN]; short m_read_cache_max[WAVE_READ_CACHE_LEN];
unsigned int m_refresh_sqence; short m_read_cache_sum;
unsigned int m_refresh_sequence;
}; };
#endif #endif

View File

@ -9,13 +9,11 @@
c_wave_buffer::c_wave_buffer() c_wave_buffer::c_wave_buffer()
{ {
m_head = m_tail = m_min_old = m_max_old = m_head = m_tail = m_min_old = m_max_old =
m_min_older = m_max_older = m_last_data = m_min_older = m_max_older = m_last_data = m_read_cache_sum = m_refresh_sequence = 0;
m_refresh_sqence = 0;
memset(m_wave_buf, 0, sizeof(m_wave_buf)); memset(m_wave_buf, 0, sizeof(m_wave_buf));
memset(m_fb_min, 0, sizeof(m_fb_min)); memset(m_read_cache_min, 0, sizeof(m_read_cache_min));
memset(m_fb_mid, 0, sizeof(m_fb_mid)); memset(m_read_cache_mid, 0, sizeof(m_read_cache_mid));
memset(m_fb_max, 0, sizeof(m_fb_max)); memset(m_read_cache_max, 0, sizeof(m_read_cache_max));
} }
short c_wave_buffer::get_cnt() short c_wave_buffer::get_cnt()
@ -27,8 +25,7 @@ int c_wave_buffer::write_wave_data(short data)
{ {
if ((m_tail + 1) % WAVE_BUFFER_LEN == m_head) if ((m_tail + 1) % WAVE_BUFFER_LEN == m_head)
{//full {//full
//printf("full\n"); log_out("wave buf full\n");
//fflush(stdout);
return BUFFER_FULL; return BUFFER_FULL;
} }
m_wave_buf[m_tail] = data; m_wave_buf[m_tail] = data;
@ -40,8 +37,7 @@ int c_wave_buffer::read_data()
{ {
if (m_head == m_tail) if (m_head == m_tail)
{//empty {//empty
//printf("empty\n"); log_out("wave buf empty\n");
//fflush(stdout);
return BUFFER_EMPTY; return BUFFER_EMPTY;
} }
int ret = m_wave_buf[m_head]; int ret = m_wave_buf[m_head];
@ -49,30 +45,29 @@ int c_wave_buffer::read_data()
return ret; return ret;
} }
int c_wave_buffer::read_wave_data_by_frame(short &max, short &min, short len, unsigned int seq) int c_wave_buffer::read_wave_data_by_frame(short &max, short &min, short frame_len, unsigned int sequence, short offset)
{ {
unsigned int offset = (seq >> 8) & 0xff; if (m_refresh_sequence != sequence)
if(offset > WAVE_FRAME_LEN)
{ {
ASSERT(FALSE); m_refresh_sequence = sequence;
m_read_cache_sum = 0;
}
else if(offset < m_read_cache_sum)//(m_refresh_sequence == sequence && offset < m_fb_sum)
{
max = m_read_cache_max[offset];
min = m_read_cache_min[offset];
return m_read_cache_mid[offset];
} }
if(((m_refresh_sqence & 0xff) == (seq & 0xff))) m_read_cache_sum++;
{ ASSERT(m_read_cache_sum <= WAVE_READ_CACHE_LEN);
max = m_fb_max[offset];
min = m_fb_min[offset];
return m_fb_mid[offset];
}
m_refresh_sqence = seq;
int i, data; int i, data;
int tmp_min = m_last_data; int tmp_min = m_last_data;
int tmp_max = m_last_data; int tmp_max = m_last_data;
int mid = (m_min_old + m_max_old)>>1; int mid = (m_min_old + m_max_old)>>1;
i = 0; i = 0;
while(i++ < len) while(i++ < frame_len)
{ {
data = read_data(); data = read_data();
if(BUFFER_EMPTY == data) if(BUFFER_EMPTY == data)
@ -85,14 +80,14 @@ int c_wave_buffer::read_wave_data_by_frame(short &max, short &min, short len, un
if(data > tmp_max){tmp_max = data;} if(data > tmp_max){tmp_max = data;}
} }
min = m_fb_min[offset] = MIN(m_min_old, MIN(tmp_min, m_min_older)); min = m_read_cache_min[offset] = MIN(m_min_old, MIN(tmp_min, m_min_older));
max = m_fb_max[offset] = MAX(m_max_old, MAX(tmp_max, m_max_older)); max = m_read_cache_max[offset] = MAX(m_max_old, MAX(tmp_max, m_max_older));
m_min_older = m_min_old; m_min_older = m_min_old;
m_max_older = m_max_old; m_max_older = m_max_old;
m_min_old = tmp_min; m_min_old = tmp_min;
m_max_old = tmp_max; m_max_old = tmp_max;
return (m_fb_mid[offset] = mid); return (m_read_cache_mid[offset] = mid);
} }
void c_wave_buffer::clear_data() void c_wave_buffer::clear_data()

View File

@ -115,14 +115,13 @@ void c_wave_ctrl::refresh_wave(unsigned char frame)
return; return;
} }
short max, min, mid, offset; short max, min, mid;
offset = m_wave_speed; for(short offset = 0; offset < m_wave_speed; offset++)
while(--offset >= 0)
{ {
//get wave value //get wave value
mid = m_wave->read_wave_data_by_frame(max, min, mid = m_wave->read_wave_data_by_frame(max, min,
m_frame_len_map[m_frame_len_map_index++], m_frame_len_map[m_frame_len_map_index++],
(frame | (offset << 8))); frame, offset);
m_frame_len_map_index %= sizeof(m_frame_len_map); m_frame_len_map_index %= sizeof(m_frame_len_map);
//map to wave ctrl //map to wave ctrl