As soon as you know how to use libaudioverse, which can be kind of difficult to understand if you don't know the node structure used in this library, you can sounds in 3D, as well as non-3D. You just have to connect nodes differently. Of course, if you want to play sounds 3D, you'll have to connect the node to a source which can then be positioned in space. But if you don't want this to happen, you can just connect the BufferNode directly to the audio server without further processing with a source and you'r good to go:
import libaudioverse
import multiprocessing # required to count the available cpu threads for best performance
libaudioverse.initialize()
AudioServer=libaudioverse.Server()
AudioServer.threads = multiprocessing.cpu_count()
AudioServer.set_output_device(-1)
File=libaudioverse.BufferNode(AudioServer)
Buffer=libaudioverse.Buffer(AudioServer)
Buffer.load_from_file("path/to/my/audio/file") # or some other way of loading data, e.g. decode_from_array() if you're actually using some in-memory encryption
File.buffer = Buffer
File.connect(0, File.server)
Hope that helps.
The actually great thing with libaudioverse is that you can even use some strange or not widely known encoders, which actually fit your situation better than just ogg or mp3 or something, just by implementing a decoding algorithm (or wrapping an external decoder) and forwarding the decoded data (most likely in 32-bit floating-point data) into libaudioverse, either at once or just parts of it as they are requested. That's the only negative side of libaudioverse. It decodes first and stores all data internally as PCM uncompressed audio data, which blows the used memory up by gigabytes if you don't actually keep an eye on it. That's why I came up with the solution to just store small sounds internally and decode e.g. music and background sounds on the run while playing them back, which reduces my memory consumption to under 100 megabytes.
Best Regards.
Hijacker