Fix looping for ZSM files
This commit is contained in:
parent
e35316fc58
commit
1372b758ee
3 changed files with 17 additions and 6 deletions
|
@ -40,7 +40,7 @@
|
||||||
</TabInfo>
|
</TabInfo>
|
||||||
<TabInfo>
|
<TabInfo>
|
||||||
<wxString Value="/home/catmeow/neko-player/backends/playback/zsm/zsm_backend.cpp" Name="FileName"/>
|
<wxString Value="/home/catmeow/neko-player/backends/playback/zsm/zsm_backend.cpp" Name="FileName"/>
|
||||||
<int Value="0" Name="FirstVisibleLine"/>
|
<int Value="228" Name="FirstVisibleLine"/>
|
||||||
<int Value="0" Name="CurrentLine"/>
|
<int Value="0" Name="CurrentLine"/>
|
||||||
<wxArrayString Name="Bookmarks"/>
|
<wxArrayString Name="Bookmarks"/>
|
||||||
<IntVector Name="CollapsedFolds"/>
|
<IntVector Name="CollapsedFolds"/>
|
||||||
|
@ -131,8 +131,8 @@
|
||||||
</TabInfo>
|
</TabInfo>
|
||||||
<TabInfo>
|
<TabInfo>
|
||||||
<wxString Value="/home/catmeow/neko-player/backends/playback/zsm/zsm_backend.hpp" Name="FileName"/>
|
<wxString Value="/home/catmeow/neko-player/backends/playback/zsm/zsm_backend.hpp" Name="FileName"/>
|
||||||
<int Value="54" Name="FirstVisibleLine"/>
|
<int Value="60" Name="FirstVisibleLine"/>
|
||||||
<int Value="74" Name="CurrentLine"/>
|
<int Value="77" Name="CurrentLine"/>
|
||||||
<wxArrayString Name="Bookmarks"/>
|
<wxArrayString Name="Bookmarks"/>
|
||||||
<IntVector Name="CollapsedFolds"/>
|
<IntVector Name="CollapsedFolds"/>
|
||||||
</TabInfo>
|
</TabInfo>
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "zsm_backend.hpp"
|
#include "zsm_backend.hpp"
|
||||||
|
#include <algorithm>
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include "x16emu/glue.h"
|
#include "x16emu/glue.h"
|
||||||
#include "x16emu/vera_pcm.h"
|
#include "x16emu/vera_pcm.h"
|
||||||
|
@ -47,12 +48,17 @@ void ZsmBackend::load(const char *filename) {
|
||||||
pcm_offset++;
|
pcm_offset++;
|
||||||
pcm_data_offs = (loop_point[0] * 16) + pcm_offset;
|
pcm_data_offs = (loop_point[0] * 16) + pcm_offset;
|
||||||
file->seek(music_data_start, SeekType::SET);
|
file->seek(music_data_start, SeekType::SET);
|
||||||
|
this->loop_point = std::max(this->loop_point, (uint32_t)music_data_start);
|
||||||
double time = 0.0;
|
double time = 0.0;
|
||||||
double tmpDelayTicks = 0.0;
|
double tmpDelayTicks = 0.0;
|
||||||
|
loop_pos = -1.0;
|
||||||
while (true) {
|
while (true) {
|
||||||
tmpDelayTicks -= get_delay_per_frame();
|
tmpDelayTicks -= get_delay_per_frame();
|
||||||
if (tmpDelayTicks < 0.0) {
|
if (tmpDelayTicks < 0.0) {
|
||||||
if (file->get_pos() == this->loop_point) loop_pos = time;
|
if (file->get_pos() >= this->loop_point && this->loop_pos < 0) {
|
||||||
|
loop_pos = time;
|
||||||
|
this->loop_point = file->get_pos();
|
||||||
|
}
|
||||||
ZsmCommand cmd = get_command();
|
ZsmCommand cmd = get_command();
|
||||||
if (cmd.id == ZsmEOF) {
|
if (cmd.id == ZsmEOF) {
|
||||||
break;
|
break;
|
||||||
|
@ -62,6 +68,10 @@ void ZsmBackend::load(const char *filename) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (this->loop_pos < 0.0) {
|
||||||
|
this->loop_pos = 0.0;
|
||||||
|
this->loop_point = music_data_start;
|
||||||
|
}
|
||||||
length = time;
|
length = time;
|
||||||
music_data_len = file->get_pos();
|
music_data_len = file->get_pos();
|
||||||
switch_stream(0);
|
switch_stream(0);
|
||||||
|
@ -101,7 +111,7 @@ void ZsmBackend::tick(bool step) {
|
||||||
case ZsmEOF: {
|
case ZsmEOF: {
|
||||||
if (step) {
|
if (step) {
|
||||||
file->seek(this->loop_point, SeekType::SET);
|
file->seek(this->loop_point, SeekType::SET);
|
||||||
this->position = this->loop_pos;
|
this->position = loop_pos;
|
||||||
} else {
|
} else {
|
||||||
throw std::exception();
|
throw std::exception();
|
||||||
}
|
}
|
||||||
|
@ -352,7 +362,7 @@ void ZsmBackend::seek_internal(double position, bool loop) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
size_t samples = (this->position - position) * PSG_FREQ;
|
size_t samples = std::min((size_t)((this->position - position) * PSG_FREQ), audio_buf.size());
|
||||||
while (samples--) {
|
while (samples--) {
|
||||||
audio_buf.pop();
|
audio_buf.pop();
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,6 +72,7 @@ class ZsmBackend : public PlaybackBackend {
|
||||||
uint8_t ym_data[256];
|
uint8_t ym_data[256];
|
||||||
uint32_t loop_rem;
|
uint32_t loop_rem;
|
||||||
uint32_t pcm_data_offs;
|
uint32_t pcm_data_offs;
|
||||||
|
uint8_t pcm_data_instruments;
|
||||||
uint32_t loop;
|
uint32_t loop;
|
||||||
bool islooped;
|
bool islooped;
|
||||||
uint32_t remain;
|
uint32_t remain;
|
||||||
|
|
Loading…
Reference in a new issue