Waterfall init re-ordering for gl context sanity
This commit is contained in:
parent
e61caaf5a6
commit
ea7520734c
|
@ -10,6 +10,7 @@ WaterfallPanel::WaterfallPanel() : GLPanel(), fft_size(0), waterfall_lines(0), w
|
|||
void WaterfallPanel::setup(int fft_size_in, int num_waterfall_lines_in) {
|
||||
waterfall_lines = num_waterfall_lines_in;
|
||||
fft_size = fft_size_in;
|
||||
lines_buffered.store(0);
|
||||
|
||||
if (points.size() != fft_size) {
|
||||
points.resize(fft_size);
|
||||
|
@ -23,6 +24,8 @@ void WaterfallPanel::setup(int fft_size_in, int num_waterfall_lines_in) {
|
|||
|
||||
waterfall_ofs[i] = waterfall_lines - 1;
|
||||
}
|
||||
texInitialized.store(false);
|
||||
bufferInitialized.store(false);
|
||||
}
|
||||
|
||||
void WaterfallPanel::refreshTheme() {
|
||||
|
@ -52,7 +55,47 @@ void WaterfallPanel::setPoints(std::vector<float> &points) {
|
|||
void WaterfallPanel::step() {
|
||||
int half_fft_size = fft_size / 2;
|
||||
|
||||
if (!waterfall[0]) {
|
||||
if (!bufferInitialized.load()) {
|
||||
if (waterfall_slice != NULL) {
|
||||
delete waterfall_slice;
|
||||
}
|
||||
waterfall_slice = new unsigned char[half_fft_size];
|
||||
bufferInitialized.store(true);
|
||||
}
|
||||
|
||||
if (!texInitialized.load()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (points.size()) {
|
||||
for (int j = 0; j < 2; j++) {
|
||||
for (int i = 0, iMax = half_fft_size; i < iMax; i++) {
|
||||
float v = points[j * half_fft_size + i];
|
||||
|
||||
float wv = v < 0 ? 0 : (v > 0.99 ? 0.99 : v);
|
||||
|
||||
waterfall_slice[i] = (unsigned char) floor(wv * 255.0);
|
||||
}
|
||||
|
||||
int newBufSize = (half_fft_size*lines_buffered.load()+half_fft_size);
|
||||
if (lineBuffer[j].size() < newBufSize) {
|
||||
lineBuffer[j].resize(newBufSize);
|
||||
rLineBuffer[j].resize(newBufSize);
|
||||
}
|
||||
memcpy(&(lineBuffer[j][half_fft_size*lines_buffered.load()]), waterfall_slice, sizeof(unsigned char) * half_fft_size);
|
||||
}
|
||||
lines_buffered++;
|
||||
}
|
||||
}
|
||||
|
||||
void WaterfallPanel::update() {
|
||||
int half_fft_size = fft_size / 2;
|
||||
|
||||
if (!bufferInitialized.load()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!texInitialized.load()) {
|
||||
glGenTextures(2, waterfall);
|
||||
|
||||
unsigned char *waterfall_tex;
|
||||
|
@ -73,48 +116,21 @@ void WaterfallPanel::step() {
|
|||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, half_fft_size, waterfall_lines, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, (GLvoid *) waterfall_tex);
|
||||
}
|
||||
|
||||
if (waterfall_slice != NULL) {
|
||||
delete waterfall_slice;
|
||||
}
|
||||
waterfall_slice = new unsigned char[half_fft_size];
|
||||
|
||||
delete[] waterfall_tex;
|
||||
|
||||
texInitialized.store(true);
|
||||
}
|
||||
|
||||
if (points.size()) {
|
||||
for (int j = 0; j < 2; j++) {
|
||||
for (int i = 0, iMax = half_fft_size; i < iMax; i++) {
|
||||
float v = points[j * half_fft_size + i];
|
||||
|
||||
float wv = v < 0 ? 0 : (v > 0.99 ? 0.99 : v);
|
||||
|
||||
waterfall_slice[i] = (unsigned char) floor(wv * 255.0);
|
||||
}
|
||||
|
||||
int newBufSize = (half_fft_size*lines_buffered+half_fft_size);
|
||||
if (lineBuffer[j].size() < newBufSize) {
|
||||
lineBuffer[j].resize(newBufSize);
|
||||
rLineBuffer[j].resize(newBufSize);
|
||||
}
|
||||
memcpy(&(lineBuffer[j][half_fft_size*lines_buffered]), waterfall_slice, sizeof(unsigned char) * half_fft_size);
|
||||
}
|
||||
lines_buffered++;
|
||||
}
|
||||
}
|
||||
|
||||
void WaterfallPanel::update() {
|
||||
int half_fft_size = fft_size / 2;
|
||||
|
||||
for (int i = 0; i < lines_buffered; i++) {
|
||||
for (int i = 0, iMax = lines_buffered.load(); i < iMax; i++) {
|
||||
for (int j = 0; j < 2; j++) {
|
||||
memcpy(&(rLineBuffer[j][i*half_fft_size]),
|
||||
&(lineBuffer[j][((lines_buffered-1)*half_fft_size)-(i*half_fft_size)]), sizeof(unsigned char) * half_fft_size);
|
||||
&(lineBuffer[j][((iMax-1)*half_fft_size)-(i*half_fft_size)]), sizeof(unsigned char) * half_fft_size);
|
||||
}
|
||||
}
|
||||
|
||||
int run_ofs = 0;
|
||||
while (lines_buffered) {
|
||||
int run_lines = lines_buffered;
|
||||
while (lines_buffered.load()) {
|
||||
int run_lines = lines_buffered.load();
|
||||
if (run_lines > waterfall_ofs[0]) {
|
||||
run_lines = waterfall_ofs[0];
|
||||
}
|
||||
|
@ -130,7 +146,7 @@ void WaterfallPanel::update() {
|
|||
}
|
||||
}
|
||||
run_ofs += run_lines*half_fft_size;
|
||||
lines_buffered-=run_lines;
|
||||
lines_buffered.store(lines_buffered.load()-run_lines);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -24,7 +24,8 @@ private:
|
|||
unsigned char *waterfall_slice;
|
||||
std::vector<unsigned char> lineBuffer[2];
|
||||
std::vector<unsigned char> rLineBuffer[2];
|
||||
int lines_buffered;
|
||||
std::atomic_int lines_buffered;
|
||||
std::atomic_bool texInitialized, bufferInitialized;
|
||||
|
||||
ColorTheme *activeTheme;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue