Well, I'm still playing with framebuffer graphics. I have 4 threads (so far) for getting data from the RTL2832 dongle over USB, putting it through FFTWF, plotting the spectrum (top part) and another for scrolling the waterfall. I can actually see real-world signals out there but I'm still trying to make sense of what they are. I haven't dug out a signal generator yet, just guessing at over the air stuff I can think of.
These (image scaled down for this board) are National Weather Service transmitters. They operate on a nationally-allocated set of frequencies every 25 KHz from 162.400 MHz up so they make good test signals. Putting timestamps in the waterfall is an idea I borrowed from Hdsdr (every 15 seconds here). I'm using librtlsdr and there's a function to set the "center" frequency. That probably means the local oscillator frequency but it's a little weird. This is running under X, but it also works from a console. The CPU load, clock, Bitcoin price come through because they update. But now I'm in a quandary because mouse clicks anywhere get picked up by X and bring the underlying windows to the foreground. I think I can figure a way around that using Xlib to capture mouse events. Console mode is worse, I need to use curses to capture keypresses and mouse clicks, so that means GPM, with this rectangular block cursor. It's still the same problem of wanting framebuffer graphics to be housebroken, maybe I can use GLFW, I haven't looked. The text method I borrowed from an old Giflib, it makes 8x8 pixel characters.
Performance, well, I'm doing a full 1920x1080 screen. I draw the spectrum at top using XOR to write into memory, then I draw the same thing again on the next pass to erase it before the new one. I'm writing uint32_ts directly to the screen, which is handy, 1 per pixel, it's 32 BPP ARGB. For the waterfall I draw a line of colors where the color shows signal intensity, then I use memcpy to copy the whole waterfall down 1 pixel row. My decimation is broken (stuck at 8 max), but I count screen update cycles and I hit 45 updates/second at times. 77% CPU above, but Firefox is also running. I could live with about 1/3 that update frequency. I haven't done any profiling yet but noise in the spectrum causes the Bresenham line drawing to do a lot more work. I'm also using an FFT size of 4096, in the spectrum pixels get scaled into the screen resolution, in the waterfall there's the same scaling with some averaging going on. Spectrum pixels can overwrite each other, but not in the waterfall. I can see there's modulation there but I haven't tried any demodulation yet. The automated voice reads a weather forecast over and over.