diff --git a/SabreTools.Data.Extensions/MetadataExtensions.cs b/SabreTools.Data.Extensions/MetadataExtensions.cs
index 89b1116e..77d4714f 100644
--- a/SabreTools.Data.Extensions/MetadataExtensions.cs
+++ b/SabreTools.Data.Extensions/MetadataExtensions.cs
@@ -369,6 +369,10 @@ namespace SabreTools.Data.Extensions
cloneSoftwareList.Status = selfSoftwareList.Status;
cloneSoftwareList.Tag = selfSoftwareList.Tag;
}
+ else if (self is Sound selfSound && clone is Sound cloneSound)
+ {
+ cloneSound.Channels = selfSound.Channels;
+ }
else if (self is Video selfVideo && clone is Video cloneVideo)
{
cloneVideo.Screen = selfVideo.Screen;
diff --git a/SabreTools.Data.Models/ClrMamePro/Sound.cs b/SabreTools.Data.Models/ClrMamePro/Sound.cs
index 4af5f9ce..1ffa6fc0 100644
--- a/SabreTools.Data.Models/ClrMamePro/Sound.cs
+++ b/SabreTools.Data.Models/ClrMamePro/Sound.cs
@@ -6,6 +6,6 @@ namespace SabreTools.Data.Models.ClrMamePro
{
/// channels, Numeric?
[Required]
- public string? Channels { get; set; }
+ public long? Channels { get; set; }
}
}
diff --git a/SabreTools.Data.Models/Listxml/Sound.cs b/SabreTools.Data.Models/Listxml/Sound.cs
index 7f616c72..2600d84c 100644
--- a/SabreTools.Data.Models/Listxml/Sound.cs
+++ b/SabreTools.Data.Models/Listxml/Sound.cs
@@ -9,6 +9,6 @@ namespace SabreTools.Data.Models.Listxml
/// Numeric
[Required]
[XmlAttribute("channels")]
- public string? Channels { get; set; }
+ public long? Channels { get; set; }
}
}
diff --git a/SabreTools.Data.Models/Metadata/Sound.cs b/SabreTools.Data.Models/Metadata/Sound.cs
index 480d1537..2d14fee5 100644
--- a/SabreTools.Data.Models/Metadata/Sound.cs
+++ b/SabreTools.Data.Models/Metadata/Sound.cs
@@ -6,10 +6,9 @@ namespace SabreTools.Data.Models.Metadata
[JsonObject("sound"), XmlRoot("sound")]
public class Sound : DatItem
{
- #region Keys
+ #region Properties
- /// long
- public const string ChannelsKey = "channels";
+ public long? Channels { get; set; }
#endregion
diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs
index 7bbcd309..947c6f36 100644
--- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs
+++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs
@@ -961,7 +961,7 @@ namespace SabreTools.Metadata.DatFiles.Test
{
return new Data.Models.Metadata.Sound
{
- [Data.Models.Metadata.Sound.ChannelsKey] = 12345L,
+ Channels = 12345L,
};
}
@@ -1635,7 +1635,7 @@ namespace SabreTools.Metadata.DatFiles.Test
private static void ValidateSound(Sound? sound)
{
Assert.NotNull(sound);
- Assert.Equal(12345L, sound.ReadLong(Data.Models.Metadata.Sound.ChannelsKey));
+ Assert.Equal(12345L, sound.Channels);
}
// TODO: Figure out why so many fields are omitted
diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs
index 9345937e..d12014b2 100644
--- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs
+++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs
@@ -1200,7 +1200,7 @@ namespace SabreTools.Metadata.DatFiles.Test
private static void ValidateMetadataSound(Data.Models.Metadata.Sound? sound)
{
Assert.NotNull(sound);
- Assert.Equal(12345, sound.ReadLong(Data.Models.Metadata.Sound.ChannelsKey));
+ Assert.Equal(12345, sound.Channels);
}
private static void ValidateMetadataSourceDetails(Data.Models.Metadata.SourceDetails? sourceDetails)
diff --git a/SabreTools.Metadata.DatFiles.Test/FormatsTests.cs b/SabreTools.Metadata.DatFiles.Test/FormatsTests.cs
index 35439552..5e0d3f74 100644
--- a/SabreTools.Metadata.DatFiles.Test/FormatsTests.cs
+++ b/SabreTools.Metadata.DatFiles.Test/FormatsTests.cs
@@ -215,7 +215,7 @@ namespace SabreTools.Metadata.DatFiles.Test
Assert.NotNull(actual);
Assert.True(actual.SequenceEqual([
- Data.Models.Metadata.Sound.ChannelsKey,
+ nameof(Data.Models.Metadata.Sound.Channels),
]));
}
@@ -894,7 +894,7 @@ namespace SabreTools.Metadata.DatFiles.Test
Assert.NotNull(actual);
Assert.True(actual.SequenceEqual([
- Data.Models.Metadata.Sound.ChannelsKey,
+ nameof(Data.Models.Metadata.Sound.Channels),
]));
}
diff --git a/SabreTools.Metadata.DatFiles/Formats/ClrMamePro.cs b/SabreTools.Metadata.DatFiles/Formats/ClrMamePro.cs
index e4f16d58..c11b02e0 100644
--- a/SabreTools.Metadata.DatFiles/Formats/ClrMamePro.cs
+++ b/SabreTools.Metadata.DatFiles/Formats/ClrMamePro.cs
@@ -147,8 +147,8 @@ namespace SabreTools.Metadata.DatFiles.Formats
break;
case Sound sound:
- if (sound.ReadLong(Data.Models.Metadata.Sound.ChannelsKey) is null)
- missingFields.Add(Data.Models.Metadata.Sound.ChannelsKey);
+ if (sound.Channels is null)
+ missingFields.Add(nameof(Data.Models.Metadata.Sound.Channels));
break;
case Input input:
diff --git a/SabreTools.Metadata.DatFiles/Formats/Listxml.cs b/SabreTools.Metadata.DatFiles/Formats/Listxml.cs
index fbdc657a..27e985fe 100644
--- a/SabreTools.Metadata.DatFiles/Formats/Listxml.cs
+++ b/SabreTools.Metadata.DatFiles/Formats/Listxml.cs
@@ -315,8 +315,8 @@ namespace SabreTools.Metadata.DatFiles.Formats
break;
case Sound sound:
- if (sound.ReadLong(Data.Models.Metadata.Sound.ChannelsKey) is null)
- missingFields.Add(Data.Models.Metadata.Sound.ChannelsKey);
+ if (sound.Channels is null)
+ missingFields.Add(nameof(Data.Models.Metadata.Sound.Channels));
break;
case Input input:
diff --git a/SabreTools.Metadata.DatItems/Formats/Sound.cs b/SabreTools.Metadata.DatItems/Formats/Sound.cs
index e726ff69..f5db3d17 100644
--- a/SabreTools.Metadata.DatItems/Formats/Sound.cs
+++ b/SabreTools.Metadata.DatItems/Formats/Sound.cs
@@ -12,6 +12,12 @@ namespace SabreTools.Metadata.DatItems.Formats
{
#region Fields
+ public long? Channels
+ {
+ get => (_internal as Data.Models.Metadata.Sound)?.Channels;
+ set => (_internal as Data.Models.Metadata.Sound)?.Channels = value;
+ }
+
/// />
public override Data.Models.Metadata.ItemType ItemType
=> Data.Models.Metadata.ItemType.Sound;
@@ -22,13 +28,7 @@ namespace SabreTools.Metadata.DatItems.Formats
public Sound() : base() { }
- public Sound(Data.Models.Metadata.Sound item) : base(item)
- {
- // Process flag values
- long? channels = ReadLong(Data.Models.Metadata.Sound.ChannelsKey);
- if (channels is not null)
- Write(Data.Models.Metadata.Sound.ChannelsKey, channels.ToString());
- }
+ public Sound(Data.Models.Metadata.Sound item) : base(item) { }
public Sound(Data.Models.Metadata.Sound item, Machine machine, Source source) : this(item)
{
diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs
index e3ab5156..aa13aa9a 100644
--- a/SabreTools.Metadata.Filter/FilterObject.cs
+++ b/SabreTools.Metadata.Filter/FilterObject.cs
@@ -739,6 +739,10 @@ namespace SabreTools.Metadata.Filter
checkValue = item.Tag;
return true;
+ case Sound item when fieldName == "channels":
+ checkValue = item.Channels?.ToString();
+ return true;
+
case Video item when fieldName == "screen":
checkValue = item.Screen?.AsStringValue();
return true;
diff --git a/SabreTools.Serialization.CrossModel.Test/ClrMameProTests.cs b/SabreTools.Serialization.CrossModel.Test/ClrMameProTests.cs
index 8660b78e..14ff0570 100644
--- a/SabreTools.Serialization.CrossModel.Test/ClrMameProTests.cs
+++ b/SabreTools.Serialization.CrossModel.Test/ClrMameProTests.cs
@@ -175,7 +175,7 @@ namespace SabreTools.Serialization.CrossModel.Test
var sound = new Data.Models.ClrMamePro.Sound
{
- Channels = "XXXXXX",
+ Channels = 12345L,
};
var input = new Data.Models.ClrMamePro.Input
@@ -466,7 +466,7 @@ namespace SabreTools.Serialization.CrossModel.Test
private static void Validate(Data.Models.ClrMamePro.Sound? sound)
{
Assert.NotNull(sound);
- Assert.Equal("XXXXXX", sound.Channels);
+ Assert.Equal(12345L, sound.Channels);
}
///
diff --git a/SabreTools.Serialization.CrossModel.Test/ListxmlTests.cs b/SabreTools.Serialization.CrossModel.Test/ListxmlTests.cs
index 3783410d..f8d265c8 100644
--- a/SabreTools.Serialization.CrossModel.Test/ListxmlTests.cs
+++ b/SabreTools.Serialization.CrossModel.Test/ListxmlTests.cs
@@ -149,7 +149,7 @@ namespace SabreTools.Serialization.CrossModel.Test
var sound = new Data.Models.Listxml.Sound
{
- Channels = "XXXXXX",
+ Channels = 12345L,
};
var control = new Data.Models.Listxml.Control
@@ -589,7 +589,7 @@ namespace SabreTools.Serialization.CrossModel.Test
private static void Validate(Data.Models.Listxml.Sound? sound)
{
Assert.NotNull(sound);
- Assert.Equal("XXXXXX", sound.Channels);
+ Assert.Equal(12345L, sound.Channels);
}
///
diff --git a/SabreTools.Serialization.CrossModel.Test/M1Tests.cs b/SabreTools.Serialization.CrossModel.Test/M1Tests.cs
index 4bd22fb2..d3b3bbda 100644
--- a/SabreTools.Serialization.CrossModel.Test/M1Tests.cs
+++ b/SabreTools.Serialization.CrossModel.Test/M1Tests.cs
@@ -145,7 +145,7 @@ namespace SabreTools.Serialization.CrossModel.Test
var sound = new Data.Models.Listxml.Sound
{
- Channels = "XXXXXX",
+ Channels = 12345L,
};
var control = new Data.Models.Listxml.Control
@@ -583,7 +583,7 @@ namespace SabreTools.Serialization.CrossModel.Test
private static void Validate(Data.Models.Listxml.Sound? sound)
{
Assert.NotNull(sound);
- Assert.Equal("XXXXXX", sound.Channels);
+ Assert.Equal(12345L, sound.Channels);
}
///
diff --git a/SabreTools.Serialization.CrossModel.Test/MessTests.cs b/SabreTools.Serialization.CrossModel.Test/MessTests.cs
index e0f8517d..d8107b27 100644
--- a/SabreTools.Serialization.CrossModel.Test/MessTests.cs
+++ b/SabreTools.Serialization.CrossModel.Test/MessTests.cs
@@ -145,7 +145,7 @@ namespace SabreTools.Serialization.CrossModel.Test
var sound = new Data.Models.Listxml.Sound
{
- Channels = "XXXXXX",
+ Channels = 12345L,
};
var control = new Data.Models.Listxml.Control
@@ -583,7 +583,7 @@ namespace SabreTools.Serialization.CrossModel.Test
private static void Validate(Data.Models.Listxml.Sound? sound)
{
Assert.NotNull(sound);
- Assert.Equal("XXXXXX", sound.Channels);
+ Assert.Equal(12345L, sound.Channels);
}
///
diff --git a/SabreTools.Serialization.CrossModel/ClrMamePro.Deserializer.cs b/SabreTools.Serialization.CrossModel/ClrMamePro.Deserializer.cs
index 24a7ed8f..abc250fb 100644
--- a/SabreTools.Serialization.CrossModel/ClrMamePro.Deserializer.cs
+++ b/SabreTools.Serialization.CrossModel/ClrMamePro.Deserializer.cs
@@ -328,7 +328,7 @@ namespace SabreTools.Serialization.CrossModel
{
var sound = new Sound
{
- Channels = item.ReadString(Data.Models.Metadata.Sound.ChannelsKey),
+ Channels = item.Channels,
};
return sound;
}
diff --git a/SabreTools.Serialization.CrossModel/ClrMamePro.Serializer.cs b/SabreTools.Serialization.CrossModel/ClrMamePro.Serializer.cs
index 3e3a1b30..99b281ce 100644
--- a/SabreTools.Serialization.CrossModel/ClrMamePro.Serializer.cs
+++ b/SabreTools.Serialization.CrossModel/ClrMamePro.Serializer.cs
@@ -341,7 +341,7 @@ namespace SabreTools.Serialization.CrossModel
{
var sound = new Data.Models.Metadata.Sound
{
- [Data.Models.Metadata.Sound.ChannelsKey] = item.Channels,
+ Channels = item.Channels,
};
return sound;
}
diff --git a/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs b/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs
index e36a8a08..15058bcd 100644
--- a/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs
+++ b/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs
@@ -646,7 +646,7 @@ namespace SabreTools.Serialization.CrossModel
{
var sound = new Sound
{
- Channels = item.ReadString(Data.Models.Metadata.Sound.ChannelsKey),
+ Channels = item.Channels,
};
return sound;
}
diff --git a/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs b/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs
index 6cd096b6..c4687ff2 100644
--- a/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs
+++ b/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs
@@ -687,7 +687,7 @@ namespace SabreTools.Serialization.CrossModel
{
var sound = new Data.Models.Metadata.Sound
{
- [Data.Models.Metadata.Sound.ChannelsKey] = item.Channels,
+ Channels = item.Channels,
};
return sound;
}
diff --git a/SabreTools.Serialization.Readers.Test/ClrMameProTests.cs b/SabreTools.Serialization.Readers.Test/ClrMameProTests.cs
index 731bfba5..afe24853 100644
--- a/SabreTools.Serialization.Readers.Test/ClrMameProTests.cs
+++ b/SabreTools.Serialization.Readers.Test/ClrMameProTests.cs
@@ -292,7 +292,7 @@ namespace SabreTools.Serialization.Readers.Test
var sound = new Data.Models.ClrMamePro.Sound
{
- Channels = "XXXXXX",
+ Channels = 12345L,
};
var input = new Data.Models.ClrMamePro.Input
@@ -583,7 +583,7 @@ namespace SabreTools.Serialization.Readers.Test
private static void Validate(Data.Models.ClrMamePro.Sound? sound)
{
Assert.NotNull(sound);
- Assert.Equal("XXXXXX", sound.Channels);
+ Assert.Equal(12345L, sound.Channels);
}
///
diff --git a/SabreTools.Serialization.Readers.Test/ListxmlTests.cs b/SabreTools.Serialization.Readers.Test/ListxmlTests.cs
index c317c05c..de443527 100644
--- a/SabreTools.Serialization.Readers.Test/ListxmlTests.cs
+++ b/SabreTools.Serialization.Readers.Test/ListxmlTests.cs
@@ -216,7 +216,7 @@ namespace SabreTools.Serialization.Readers.Test
var sound = new Data.Models.Listxml.Sound
{
- Channels = "XXXXXX",
+ Channels = 12345L,
};
var control = new Data.Models.Listxml.Control
@@ -656,7 +656,7 @@ namespace SabreTools.Serialization.Readers.Test
private static void Validate(Data.Models.Listxml.Sound? sound)
{
Assert.NotNull(sound);
- Assert.Equal("XXXXXX", sound.Channels);
+ Assert.Equal(12345L, sound.Channels);
}
///
diff --git a/SabreTools.Serialization.Readers.Test/M1Tests.cs b/SabreTools.Serialization.Readers.Test/M1Tests.cs
index 21c4a6eb..64c85fea 100644
--- a/SabreTools.Serialization.Readers.Test/M1Tests.cs
+++ b/SabreTools.Serialization.Readers.Test/M1Tests.cs
@@ -212,7 +212,7 @@ namespace SabreTools.Serialization.Readers.Test
var sound = new Data.Models.Listxml.Sound
{
- Channels = "XXXXXX",
+ Channels = 12345L,
};
var control = new Data.Models.Listxml.Control
@@ -650,7 +650,7 @@ namespace SabreTools.Serialization.Readers.Test
private static void Validate(Data.Models.Listxml.Sound? sound)
{
Assert.NotNull(sound);
- Assert.Equal("XXXXXX", sound.Channels);
+ Assert.Equal(12345L, sound.Channels);
}
///
diff --git a/SabreTools.Serialization.Readers.Test/MessTests.cs b/SabreTools.Serialization.Readers.Test/MessTests.cs
index 6e6d0895..5570a6b8 100644
--- a/SabreTools.Serialization.Readers.Test/MessTests.cs
+++ b/SabreTools.Serialization.Readers.Test/MessTests.cs
@@ -212,7 +212,7 @@ namespace SabreTools.Serialization.Readers.Test
var sound = new Data.Models.Listxml.Sound
{
- Channels = "XXXXXX",
+ Channels = 12345L,
};
var control = new Data.Models.Listxml.Control
@@ -650,7 +650,7 @@ namespace SabreTools.Serialization.Readers.Test
private static void Validate(Data.Models.Listxml.Sound? sound)
{
Assert.NotNull(sound);
- Assert.Equal("XXXXXX", sound.Channels);
+ Assert.Equal(12345L, sound.Channels);
}
///
diff --git a/SabreTools.Serialization.Readers/ClrMamePro.cs b/SabreTools.Serialization.Readers/ClrMamePro.cs
index 0ce08e58..2761c576 100644
--- a/SabreTools.Serialization.Readers/ClrMamePro.cs
+++ b/SabreTools.Serialization.Readers/ClrMamePro.cs
@@ -5,6 +5,7 @@ using System.Text;
using SabreTools.Data.Extensions;
using SabreTools.Data.Models.ClrMamePro;
using SabreTools.Text.ClrMamePro;
+using SabreTools.Text.Extensions;
#pragma warning disable CA1822 // Mark members as static
namespace SabreTools.Serialization.Readers
@@ -847,7 +848,7 @@ namespace SabreTools.Serialization.Readers
switch (kvp.Key?.ToLowerInvariant())
{
case "channels":
- sound.Channels = kvp.Value;
+ sound.Channels = NumberHelper.ConvertToInt64(kvp.Value);
break;
default:
// TODO: Log invalid values
diff --git a/SabreTools.Serialization.Readers/Listxml.cs b/SabreTools.Serialization.Readers/Listxml.cs
index 9e38ba06..aaa70299 100644
--- a/SabreTools.Serialization.Readers/Listxml.cs
+++ b/SabreTools.Serialization.Readers/Listxml.cs
@@ -4,6 +4,7 @@ using System.IO;
using System.Xml;
using SabreTools.Data.Extensions;
using SabreTools.Data.Models.Listxml;
+using SabreTools.Text.Extensions;
namespace SabreTools.Serialization.Readers
{
@@ -1160,7 +1161,7 @@ namespace SabreTools.Serialization.Readers
{
var obj = new Sound();
- obj.Channels = reader.GetAttribute("channels");
+ obj.Channels = NumberHelper.ConvertToInt64(reader.GetAttribute("channels"));
return obj;
}
diff --git a/SabreTools.Serialization.Readers/M1.cs b/SabreTools.Serialization.Readers/M1.cs
index 154c9aab..5a2b94df 100644
--- a/SabreTools.Serialization.Readers/M1.cs
+++ b/SabreTools.Serialization.Readers/M1.cs
@@ -4,6 +4,7 @@ using System.IO;
using System.Xml;
using SabreTools.Data.Extensions;
using SabreTools.Data.Models.Listxml;
+using SabreTools.Text.Extensions;
namespace SabreTools.Serialization.Readers
{
@@ -1158,7 +1159,7 @@ namespace SabreTools.Serialization.Readers
{
var obj = new Sound();
- obj.Channels = reader.GetAttribute("channels");
+ obj.Channels = NumberHelper.ConvertToInt64(reader.GetAttribute("channels"));
return obj;
}
diff --git a/SabreTools.Serialization.Readers/Mess.cs b/SabreTools.Serialization.Readers/Mess.cs
index a39567c4..534a9717 100644
--- a/SabreTools.Serialization.Readers/Mess.cs
+++ b/SabreTools.Serialization.Readers/Mess.cs
@@ -4,6 +4,7 @@ using System.IO;
using System.Xml;
using SabreTools.Data.Extensions;
using SabreTools.Data.Models.Listxml;
+using SabreTools.Text.Extensions;
namespace SabreTools.Serialization.Readers
{
@@ -1158,7 +1159,7 @@ namespace SabreTools.Serialization.Readers
{
var obj = new Sound();
- obj.Channels = reader.GetAttribute("channels");
+ obj.Channels = NumberHelper.ConvertToInt64(reader.GetAttribute("channels"));
return obj;
}
diff --git a/SabreTools.Serialization.Writers/ClrMamePro.cs b/SabreTools.Serialization.Writers/ClrMamePro.cs
index f56bddbc..cd4f9df1 100644
--- a/SabreTools.Serialization.Writers/ClrMamePro.cs
+++ b/SabreTools.Serialization.Writers/ClrMamePro.cs
@@ -435,7 +435,7 @@ namespace SabreTools.Serialization.Writers
return;
writer.WriteStartElement("sound");
- writer.WriteRequiredAttributeString("channels", sound.Channels, throwOnError: true);
+ writer.WriteRequiredAttributeString("channels", sound.Channels?.ToString(), throwOnError: true);
writer.WriteEndElement(); // sound
}
diff --git a/SabreTools.Serialization.Writers/Listxml.cs b/SabreTools.Serialization.Writers/Listxml.cs
index cc458cf6..edb20f88 100644
--- a/SabreTools.Serialization.Writers/Listxml.cs
+++ b/SabreTools.Serialization.Writers/Listxml.cs
@@ -823,7 +823,7 @@ namespace SabreTools.Serialization.Writers
{
writer.WriteStartElement("sound");
- writer.WriteRequiredAttributeString("channels", obj.Channels);
+ writer.WriteRequiredAttributeString("channels", obj.Channels?.ToString());
writer.WriteEndElement();
}
diff --git a/SabreTools.Serialization.Writers/M1.cs b/SabreTools.Serialization.Writers/M1.cs
index 7f4137e6..59599972 100644
--- a/SabreTools.Serialization.Writers/M1.cs
+++ b/SabreTools.Serialization.Writers/M1.cs
@@ -821,7 +821,7 @@ namespace SabreTools.Serialization.Writers
{
writer.WriteStartElement("sound");
- writer.WriteRequiredAttributeString("channels", obj.Channels);
+ writer.WriteRequiredAttributeString("channels", obj.Channels?.ToString());
writer.WriteEndElement();
}
diff --git a/SabreTools.Serialization.Writers/Mess.cs b/SabreTools.Serialization.Writers/Mess.cs
index c74c693a..c705d657 100644
--- a/SabreTools.Serialization.Writers/Mess.cs
+++ b/SabreTools.Serialization.Writers/Mess.cs
@@ -821,7 +821,7 @@ namespace SabreTools.Serialization.Writers
{
writer.WriteStartElement("sound");
- writer.WriteRequiredAttributeString("channels", obj.Channels);
+ writer.WriteRequiredAttributeString("channels", obj.Channels?.ToString());
writer.WriteEndElement();
}