У тебя вывод происходит одним куском.
Система совершенно не гарантирует, что весь его за раз примет. Надо писать до тех пор, пока у тебя не закончится буфер:Код:void oss_play() {
if (snd->audio!=0) write(snd->audio, &snd->sndbuf[0], snd->sbptr - &snd->sndbuf[0]);
}
Код:std::size_t toWrite(buf.size() * sizeof(buf.front()));
const uint8_t* data(safe_ptr_cast<const uint8_t*>(&buf[0]));
while (toWrite)
{
int res(::write(DevHandle.Get(), data, toWrite * sizeof(*data)));
DevHandle.CheckResult(res >= 0, THIS_LINE);
toWrite -= res;
data += res;
}

