From 3db5111a3ac68e4559a739e02ea739e46381f653 Mon Sep 17 00:00:00 2001
From: Jason Flatt <jflatt@cox.net>
Date: Fri, 14 Oct 2022 09:52:56 -0700
Subject: [PATCH] Avoid position > end for floppy sample playback

---
 floppy.patch          | 41 +++++++++++++++++++++++++++++++++++++++++
 org.mamedev.MAME.yaml |  2 ++
 2 files changed, 43 insertions(+)
 create mode 100644 floppy.patch

diff --git a/floppy.patch b/floppy.patch
new file mode 100644
index 0000000..b80d0a2
--- /dev/null
+++ b/floppy.patch
@@ -0,0 +1,41 @@
+diff --git a/src/devices/imagedev/floppy.cpp b/src/devices/imagedev/floppy.cpp
+index 3c00336d..cda94d92 100644
+--- a/src/devices/imagedev/floppy.cpp
++++ b/src/devices/imagedev/floppy.cpp
+@@ -1707,9 +1707,10 @@ void floppy_sound_device::sound_stream_update(sound_stream &stream, std::vector<
+ 		{
+ 			idx = m_spin_playback_sample;
+ 			sampleend = m_sample[idx].data.size();
+-			out = m_sample[idx].data[m_spin_samplepos++];
+-
+-			if (m_spin_samplepos >= sampleend)
++			m_spin_samplepos++;
++			if (m_spin_samplepos < sampleend)
++				out = m_sample[idx].data[m_spin_samplepos];
++			else
+ 			{
+ 				// Motor sample has completed
+ 				switch (m_spin_playback_sample)
+@@ -1763,7 +1764,8 @@ void floppy_sound_device::sound_stream_update(sound_stream &stream, std::vector<
+ 			idx = m_step_base + m_seek_playback_sample;
+ 			sampleend = m_sample[idx].data.size();
+ 			// Mix it into the stream value
+-			out += m_sample[idx].data[(int)m_seek_samplepos];
++			if (m_seek_samplepos < sampleend)
++				out += m_sample[idx].data[(int)m_seek_samplepos];
+ 			// By adding different values than 1, we can change the playback speed
+ 			// This will be used to adjust the seek sound
+ 			m_seek_samplepos += m_seek_pitch;
+@@ -1781,8 +1783,10 @@ void floppy_sound_device::sound_stream_update(sound_stream &stream, std::vector<
+ 				sampleend = m_sample[idx].data.size();
+ 
+ 				// Mix it into the stream value
+-				out += m_sample[idx].data[m_step_samplepos++];
+-				if (m_step_samplepos >= sampleend)
++				m_step_samplepos++;
++				if (m_step_samplepos < sampleend)
++					out += m_sample[idx].data[m_step_samplepos];
++				else
+ 				{
+ 					// Step sample done
+ 					m_step_samplepos = 0;
diff --git a/org.mamedev.MAME.yaml b/org.mamedev.MAME.yaml
index 1fc8d74..6f85ed5 100644
--- a/org.mamedev.MAME.yaml
+++ b/org.mamedev.MAME.yaml
@@ -79,3 +79,5 @@ modules:
         path: org.mamedev.MAME.metainfo.xml
       - type: file
         path: mame.ini
+      - type: patch
+        path: floppy.patch