Wow... are there really people in the world who program in good old ncurses?

This is typically one of those last little things which cost you a week or so to solve.
Now I have written multithreaded programs which used ncurses, but I always had only one thread accessing the screen. And it is quite some time ago that I wrote any c code at all, but let's try:
Apparently the current item is updated. You request it, and use it to select the next song, correct? That means that the menu itself is handled correctly, but that the screen update is postponed for some reason.
Have you tried to issue an explicit window refresh?
So to see you are using the menu without an associated window. Have you tried to associate a window with the menu and issue an explicit refresh?
To debug, you could start gdb in a different terminal, and attach to the main thread, and set a breakpoint in the screen refresh routine of ncurses. The second thread would just continue to run, but your program would stop in the debugger when the breakpoint is hit. You then could see if the refresh function is not called at all, or refuses to refresh for some reason.
If this all fails, you could make getch() non-blocking in the main loop in your main program. Then you could use a variable to signal when a track is finished, and advance the menu pointer. But then, you would not need the multi-threaded approach at all.
That would be a pity because this multi-threaded approach is quite elegant.
jlinkels