diff --git a/SabreTools.Library/DatFiles/ItemDictionary.cs b/SabreTools.Library/DatFiles/ItemDictionary.cs
index f39e2599..d12309dd 100644
--- a/SabreTools.Library/DatFiles/ItemDictionary.cs
+++ b/SabreTools.Library/DatFiles/ItemDictionary.cs
@@ -167,6 +167,12 @@ namespace SabreTools.Library.DatFiles
[JsonIgnore]
public long SoftwareListCount { get; private set; } = 0;
+ ///
+ /// Number of Sound items
+ ///
+ [JsonIgnore]
+ public long SoundCount { get; private set; } = 0;
+
///
/// Number of machines
///
@@ -569,6 +575,9 @@ namespace SabreTools.Library.DatFiles
case ItemType.SoftwareList:
SoftwareListCount++;
break;
+ case ItemType.Sound:
+ SoundCount++;
+ break;
}
}
@@ -719,6 +728,9 @@ namespace SabreTools.Library.DatFiles
case ItemType.SoftwareList:
SoftwareListCount--;
break;
+ case ItemType.Sound:
+ SoundCount--;
+ break;
}
}
diff --git a/SabreTools.Library/DatFiles/Json.cs b/SabreTools.Library/DatFiles/Json.cs
index 1dd426e8..7aaa8be0 100644
--- a/SabreTools.Library/DatFiles/Json.cs
+++ b/SabreTools.Library/DatFiles/Json.cs
@@ -256,6 +256,9 @@ namespace SabreTools.Library.DatFiles
case ItemType.SoftwareList:
datItem = datItemObj.ToObject();
break;
+ case ItemType.Sound:
+ datItem = datItemObj.ToObject();
+ break;
}
}
diff --git a/SabreTools.Library/DatFiles/Listxml.cs b/SabreTools.Library/DatFiles/Listxml.cs
index e66526c2..d2e8d5c4 100644
--- a/SabreTools.Library/DatFiles/Listxml.cs
+++ b/SabreTools.Library/DatFiles/Listxml.cs
@@ -369,7 +369,21 @@ namespace SabreTools.Library.DatFiles
});
reader.Read();
+ break;
+ case "sound":
+ datItems.Add(new Sound
+ {
+ Channels = reader.GetAttribute("channels"),
+
+ Source = new Source
+ {
+ Index = indexId,
+ Name = filename,
+ },
+ });
+
+ reader.Read();
break;
case "display":
@@ -398,19 +412,6 @@ namespace SabreTools.Library.DatFiles
reader.Read();
break;
- case "sound":
- var sound = new Sound();
- sound.Channels = reader.GetAttribute("channels");
-
- // Ensure the list exists
- if (machine.Sounds == null)
- machine.Sounds = new List();
-
- machine.Sounds.Add(sound);
-
- reader.Read();
- break;
-
case "condition":
var condition = new Condition();
condition.Tag = reader.GetAttribute("tag");
@@ -1223,18 +1224,6 @@ namespace SabreTools.Library.DatFiles
xtw.WriteEndElement();
}
}
- if (datItem.Machine.Sounds != null)
- {
- foreach (var sound in datItem.Machine.Sounds)
- {
- xtw.WriteStartElement("sound");
-
- xtw.WriteOptionalAttributeString("channels", sound.Channels);
-
- // End sound
- xtw.WriteEndElement();
- }
- }
if (datItem.Machine.Conditions != null)
{
foreach (var condition in datItem.Machine.Conditions)
@@ -1653,6 +1642,13 @@ namespace SabreTools.Library.DatFiles
xtw.WriteOptionalAttributeString("filter", softwareList.Filter);
xtw.WriteEndElement();
break;
+
+ case ItemType.Sound:
+ var sound = datItem as Sound;
+ xtw.WriteStartElement("sound");
+ xtw.WriteOptionalAttributeString("channels", sound.Channels);
+ xtw.WriteEndElement();
+ break;
}
xtw.Flush();
diff --git a/SabreTools.Library/DatFiles/SabreDat.cs b/SabreTools.Library/DatFiles/SabreDat.cs
index 758b0b41..8deb4728 100644
--- a/SabreTools.Library/DatFiles/SabreDat.cs
+++ b/SabreTools.Library/DatFiles/SabreDat.cs
@@ -1489,6 +1489,14 @@ namespace SabreTools.Library.DatFiles
xtw.WriteOptionalAttributeString("sha512", softwareList.Filter);
xtw.WriteEndElement();
break;
+
+ case ItemType.Sound:
+ var sound = datItem as Sound;
+ xtw.WriteStartElement("file");
+ xtw.WriteAttributeString("type", "sound");
+ xtw.WriteOptionalAttributeString("channels", sound.Channels);
+ xtw.WriteEndElement();
+ break;
}
xtw.Flush();
diff --git a/SabreTools.Library/DatItems/Auxiliary.cs b/SabreTools.Library/DatItems/Auxiliary.cs
index c1df539a..f42cedb2 100644
--- a/SabreTools.Library/DatItems/Auxiliary.cs
+++ b/SabreTools.Library/DatItems/Auxiliary.cs
@@ -311,17 +311,6 @@ namespace SabreTools.Library.DatItems
public bool? Default { get; set; }
}
- ///
- /// Represents one ListXML sound
- ///
- /// TODO: Promote to DatItem level
- [JsonObject("sound")]
- public class Sound
- {
- [JsonProperty("channels")]
- public string Channels { get; set; } // TODO: Int32?
- }
-
#endregion
#region OpenMSX
diff --git a/SabreTools.Library/DatItems/DatItem.cs b/SabreTools.Library/DatItems/DatItem.cs
index dd9a6364..0b76e491 100644
--- a/SabreTools.Library/DatItems/DatItem.cs
+++ b/SabreTools.Library/DatItems/DatItem.cs
@@ -503,6 +503,9 @@ namespace SabreTools.Library.DatItems
case ItemType.SoftwareList:
return new SoftwareList();
+ case ItemType.Sound:
+ return new Sound();
+
default:
return new Rom();
}
@@ -525,6 +528,7 @@ namespace SabreTools.Library.DatItems
ItemType.Sample => new Sample(),
ItemType.Slot => new Slot(),
ItemType.SoftwareList => new SoftwareList(),
+ ItemType.Sound => new Sound(),
_ => new Rom(),
};
#endif
diff --git a/SabreTools.Library/DatItems/Enums.cs b/SabreTools.Library/DatItems/Enums.cs
index b7df48a6..5b8bb133 100644
--- a/SabreTools.Library/DatItems/Enums.cs
+++ b/SabreTools.Library/DatItems/Enums.cs
@@ -146,10 +146,6 @@ namespace SabreTools.Library.DatItems
Machine_Display_VBEnd,
Machine_Display_VBStart,
- // Sounds
- Machine_Sounds,
- Machine_Sound_Channels,
-
// Conditions
Machine_Conditions,
Machine_Condition_Tag,
@@ -398,6 +394,9 @@ namespace SabreTools.Library.DatItems
DatItem_SoftwareListStatus,
DatItem_Filter,
+ // Sounds
+ DatItem_Channels,
+
#endregion
#endregion // Item-Specific
@@ -446,6 +445,7 @@ namespace SabreTools.Library.DatItems
Sample,
Slot,
SoftwareList,
+ Sound,
Blank = 99, // This is not a real type, only used internally
}
diff --git a/SabreTools.Library/DatItems/Machine.cs b/SabreTools.Library/DatItems/Machine.cs
index 45c88cf0..58a9b3df 100644
--- a/SabreTools.Library/DatItems/Machine.cs
+++ b/SabreTools.Library/DatItems/Machine.cs
@@ -158,12 +158,6 @@ namespace SabreTools.Library.DatItems
[JsonProperty("displays", DefaultValueHandling = DefaultValueHandling.Ignore)]
public List Displays { get; set; } = null;
- ///
- /// List of associated sounds
- ///
- [JsonProperty("sounds", DefaultValueHandling = DefaultValueHandling.Ignore)]
- public List Sounds { get; set; } = null;
-
///
/// List of associated conditions
///
@@ -553,7 +547,6 @@ namespace SabreTools.Library.DatItems
SourceFile = this.SourceFile,
Runnable = this.Runnable,
Displays = this.Displays,
- Sounds = this.Sounds,
Conditions = this.Conditions,
Inputs = this.Inputs,
Ports = this.Ports,
@@ -1039,34 +1032,6 @@ namespace SabreTools.Library.DatItems
#endregion
- #region Sounds
-
- // Machine_Sounds
- if (filter.Machine_Sounds.MatchesNeutral(null, Sounds?.Any() ?? null) == false)
- return false;
-
- // Machine_Sound_Channels
- if (Sounds?.Any() == true)
- {
- bool anyPositive = false;
- bool anyNegative = false;
-
- foreach (var sound in Sounds)
- {
- if (filter.Machine_Sound_Channels.MatchesPositiveSet(sound?.Channels) != false)
- anyPositive = true;
- if (filter.Machine_Sound_Channels.MatchesNegativeSet(sound?.Channels) == true)
- anyNegative = true;
- }
-
- if (!anyPositive)
- return false;
- if (anyNegative)
- return false;
- }
-
- #endregion
-
#region Conditions
// Machine_Conditions
diff --git a/SabreTools.Library/DatItems/Sound.cs b/SabreTools.Library/DatItems/Sound.cs
new file mode 100644
index 00000000..16d9bb6c
--- /dev/null
+++ b/SabreTools.Library/DatItems/Sound.cs
@@ -0,0 +1,173 @@
+using System.Collections.Generic;
+using System.Linq;
+
+using SabreTools.Library.Filtering;
+using Newtonsoft.Json;
+
+namespace SabreTools.Library.DatItems
+{
+ ///
+ /// Represents the sound output for a machine
+ ///
+ [JsonObject("sound")]
+ public class Sound : DatItem
+ {
+ #region Fields
+
+ ///
+ /// Number of channels
+ ///
+ [JsonProperty("channels")]
+ public string Channels { get; set; } // TODO: Int32?
+
+ #endregion
+
+ #region Accessors
+
+ ///
+ /// Set fields with given values
+ ///
+ /// Mappings dictionary
+ public override void SetFields(Dictionary mappings)
+ {
+ // Set base fields
+ base.SetFields(mappings);
+
+ // Handle Sample-specific fields
+ if (mappings.Keys.Contains(Field.DatItem_Channels))
+ Channels = mappings[Field.DatItem_Channels];
+ }
+
+ #endregion
+
+ #region Constructors
+
+ ///
+ /// Create a default, empty Sound object
+ ///
+ public Sound()
+ {
+ ItemType = ItemType.Sound;
+ }
+
+ #endregion
+
+ #region Cloning Methods
+
+ public override object Clone()
+ {
+ return new Sound()
+ {
+ ItemType = this.ItemType,
+ DupeType = this.DupeType,
+
+ AltName = this.AltName,
+ AltTitle = this.AltTitle,
+
+ Original = this.Original,
+ OpenMSXSubType = this.OpenMSXSubType,
+ OpenMSXType = this.OpenMSXType,
+ Remark = this.Remark,
+ Boot = this.Boot,
+
+ Part = this.Part,
+ Features = this.Features,
+ AreaName = this.AreaName,
+ AreaSize = this.AreaSize,
+ AreaWidth = this.AreaWidth,
+ AreaEndianness = this.AreaEndianness,
+ Value = this.Value,
+ LoadFlag = this.LoadFlag,
+
+ Machine = this.Machine.Clone() as Machine,
+ Source = this.Source.Clone() as Source,
+ Remove = this.Remove,
+
+ Channels = this.Channels,
+ };
+ }
+
+ #endregion
+
+ #region Comparision Methods
+
+ public override bool Equals(DatItem other)
+ {
+ // If we don't have a Sound, return false
+ if (ItemType != other.ItemType)
+ return false;
+
+ // Otherwise, treat it as a Sound
+ Sound newOther = other as Sound;
+
+ // If the Sound information matches
+ return (Channels == newOther.Channels);
+ }
+
+ #endregion
+
+ #region Filtering
+
+ ///
+ /// Check to see if a DatItem passes the filter
+ ///
+ /// Filter to check against
+ /// True if the item passed the filter, false otherwise
+ public override bool PassesFilter(Filter filter)
+ {
+ // Check common fields first
+ if (!base.PassesFilter(filter))
+ return false;
+
+ // Filter on channels
+ if (filter.DatItem_Channels.MatchesPositiveSet(Channels) == false)
+ return false;
+ if (filter.DatItem_Channels.MatchesNegativeSet(Channels) == true)
+ return false;
+
+ return true;
+ }
+
+ ///
+ /// Remove fields from the DatItem
+ ///
+ /// List of Fields to remove
+ public override void RemoveFields(List fields)
+ {
+ // Remove common fields first
+ base.RemoveFields(fields);
+
+ // Remove the fields
+ if (fields.Contains(Field.DatItem_Channels))
+ Channels = null;
+ }
+
+ #endregion
+
+ #region Sorting and Merging
+
+ ///
+ /// Replace fields from another item
+ ///
+ /// DatItem to pull new information from
+ /// List of Fields representing what should be updated
+ public override void ReplaceFields(DatItem item, List fields)
+ {
+ // Replace common fields first
+ base.ReplaceFields(item, fields);
+
+ // If we don't have a Sound to replace from, ignore specific fields
+ if (item.ItemType != ItemType.Sound)
+ return;
+
+ // Cast for easier access
+ Sound newItem = item as Sound;
+
+ // Replace the fields
+ if (fields.Contains(Field.DatItem_Channels))
+ Channels = newItem.Channels;
+ }
+
+ #endregion
+ }
+}
diff --git a/SabreTools.Library/Filtering/Filter.cs b/SabreTools.Library/Filtering/Filter.cs
index c6001628..2eac69ee 100644
--- a/SabreTools.Library/Filtering/Filter.cs
+++ b/SabreTools.Library/Filtering/Filter.cs
@@ -68,10 +68,6 @@ namespace SabreTools.Library.Filtering
public FilterItem Machine_Display_VBEnd { get; private set; } = new FilterItem();
public FilterItem Machine_Display_VBStart { get; private set; } = new FilterItem();
- // Sounds
- public FilterItem Machine_Sounds { get; private set; } = new FilterItem() { Neutral = null };
- public FilterItem Machine_Sound_Channels { get; private set; } = new FilterItem();
-
// Conditions
public FilterItem Machine_Conditions { get; private set; } = new FilterItem() { Neutral = null };
public FilterItem Machine_Condition_Tag { get; private set; } = new FilterItem();
@@ -320,6 +316,9 @@ namespace SabreTools.Library.Filtering
public FilterItem DatItem_SoftwareListStatus { get; private set; } = new FilterItem() { Positive = SoftwareListStatus.NULL, Negative = SoftwareListStatus.NULL };
public FilterItem DatItem_Filter { get; private set; } = new FilterItem();
+ // Sound
+ public FilterItem DatItem_Channels { get; private set; } = new FilterItem();
+
#endregion
#endregion // Item-Specific
@@ -653,21 +652,6 @@ namespace SabreTools.Library.Filtering
Machine_Display_VBStart.PositiveSet.Add(value);
break;
- // Sounds
- case Field.Machine_Sounds:
- if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase))
- Machine_Sounds.Neutral = false;
- else
- Machine_Sounds.Neutral = true;
- break;
-
- case Field.Machine_Sound_Channels:
- if (negate)
- Machine_Sound_Channels.NegativeSet.Add(value);
- else
- Machine_Sound_Channels.PositiveSet.Add(value);
- break;
-
// Conditions
case Field.Machine_Conditions:
if (negate || value.Equals("false", StringComparison.OrdinalIgnoreCase))
@@ -1802,11 +1786,19 @@ namespace SabreTools.Library.Filtering
DatItem_Filter.PositiveSet.Add(value);
break;
- #endregion
+ // Sound
+ case Field.DatItem_Channels:
+ if (negate)
+ DatItem_Channels.NegativeSet.Add(value);
+ else
+ DatItem_Channels.PositiveSet.Add(value);
+ break;
- #endregion // Item-Specifics
+ #endregion
- #endregion // DatItem Filters
+ #endregion // Item-Specifics
+
+ #endregion // DatItem Filters
}
}
diff --git a/SabreTools.Library/Tools/Converters.cs b/SabreTools.Library/Tools/Converters.cs
index a211b96c..ab95deb6 100644
--- a/SabreTools.Library/Tools/Converters.cs
+++ b/SabreTools.Library/Tools/Converters.cs
@@ -500,12 +500,6 @@ namespace SabreTools.Library.Tools
case "display_vbstart":
return Field.Machine_Display_VBStart;
- case "sounds":
- return Field.Machine_Sounds;
-
- case "sound_channels":
- return Field.Machine_Sound_Channels;
-
case "conditions":
return Field.Machine_Conditions;
@@ -1049,9 +1043,13 @@ namespace SabreTools.Library.Tools
case "filter":
return Field.DatItem_Filter;
- #endregion
+ // Sound
+ case "channels":
+ return Field.DatItem_Channels;
- #endregion // Item-Specific
+ #endregion
+
+ #endregion // Item-Specific
}
}
@@ -1584,6 +1582,8 @@ namespace SabreTools.Library.Tools
return ItemType.Slot;
case "softwarelist":
return ItemType.SoftwareList;
+ case "sound":
+ return ItemType.Sound;
default:
return null;
}
@@ -1606,6 +1606,7 @@ namespace SabreTools.Library.Tools
"sample" => ItemType.Sample,
"slot" => ItemType.Slot,
"softwarelist" => ItemType.SoftwareList,
+ "sound" => ItemType.Sound,
_ => null,
};
#endif
@@ -2029,6 +2030,8 @@ namespace SabreTools.Library.Tools
return "slot";
case ItemType.SoftwareList:
return "softwarelist";
+ case ItemType.Sound:
+ return "sound";
default:
return null;
}
@@ -2051,6 +2054,7 @@ namespace SabreTools.Library.Tools
ItemType.Sample => "sample",
ItemType.Slot => "slot",
ItemType.SoftwareList => "softwarelist",
+ ItemType.Sound => "sound",
_ => null,
};
#endif