From f48e8e639052bb9c0d53bf87dfb3d29f3d2053c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Fri, 20 Feb 2026 11:23:46 +0100 Subject: [PATCH] Fixed: #2639 Export to FLA - missing sound streams --- CHANGELOG.md | 3 ++ .../decompiler/flash/xfl/XFLConverter.java | 46 +++++++++++-------- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ccbdb3dd..d22461e0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Fixed +- [#2639] Export to FLA - missing sound streams ## [25.1.1] - 2026-02-19 ### Fixed @@ -4140,6 +4142,7 @@ Major version of SWF to XML export changed to 2. [alpha 9]: https://github.com/jindrapetrik/jpexs-decompiler/compare/alpha8...alpha9 [alpha 8]: https://github.com/jindrapetrik/jpexs-decompiler/compare/alpha7...alpha8 [alpha 7]: https://github.com/jindrapetrik/jpexs-decompiler/releases/tag/alpha7 +[#2639]: https://www.free-decompiler.com/flash/issues/2639 [#2636]: https://www.free-decompiler.com/flash/issues/2636 [#1209]: https://www.free-decompiler.com/flash/issues/1209 [#1850]: https://www.free-decompiler.com/flash/issues/1850 diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java index 72131a28e..b2f40e747 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java @@ -2106,25 +2106,17 @@ public class XFLConverter { } private void convertMedia(Reference lastItemIdNumber, Set charactersExportedInFirstFrame, Reference lastImportedId, Map characterNameMap, Map characterImportLinkageURL, Set characters, SWF swf, Map characterVariables, Map characterClasses, ReadOnlyTagList tags, HashMap files, HashMap datfiles, XFLXmlWriter writer, StatusStack statusStack) throws XMLStreamException { - boolean hasMedia = false; - for (CharacterTag symbol : characters) { - if (symbol instanceof ImageTag - || symbol instanceof DefineSoundTag - || symbol instanceof DefineVideoStreamTag) { - //symbol instanceof SoundStreamHeadTypeTag FIXME - hasMedia = true; - } - } - - if (!hasMedia) { - return; - } - - writer.writeStartElement("media"); + boolean mediaStarted = false; + for (CharacterTag symbol : characters) { if (symbol instanceof ImageTag) { + if (!mediaStarted) { + writer.writeStartElement("media"); + mediaStarted = true; + } + statusStack.pushStatus(symbol.toString()); ImageTag imageTag = (ImageTag) symbol; boolean allowSmoothing = false; @@ -2157,8 +2149,8 @@ public class XFLConverter { } } } - } - + } + byte[] imageBytes = Helper.readStream(imageTag.getConvertedImageData()); SerializableImage image = imageTag.getImageCached(); ImageFormat format = imageTag.getImageFormat(); @@ -2244,6 +2236,10 @@ public class XFLConverter { datfiles.put(datFileName, iba.toByteArray()); statusStack.popStatus(); } else if (symbol instanceof DefineSoundTag) { + if (!mediaStarted) { + writer.writeStartElement("media"); + mediaStarted = true; + } statusStack.pushStatus(symbol.toString()); convertSoundMedia(lastItemIdNumber, characterImportLinkageURL, swf, tags, (DefineSoundTag) symbol, writer, files, datfiles); @@ -2252,6 +2248,10 @@ public class XFLConverter { writer.writeEndElement(); statusStack.popStatus(); } else if (symbol instanceof DefineVideoStreamTag) { + if (!mediaStarted) { + writer.writeStartElement("media"); + mediaStarted = true; + } statusStack.pushStatus(symbol.toString()); DefineVideoStreamTag video = (DefineVideoStreamTag) symbol; String videoType = "no media"; @@ -2327,6 +2327,10 @@ public class XFLConverter { for (Tag t : tags) { if (t instanceof SoundStreamHeadTypeTag) { + if (!mediaStarted) { + writer.writeStartElement("media"); + mediaStarted = true; + } SoundStreamHeadTypeTag head = (SoundStreamHeadTypeTag) t; for (SoundStreamFrameRange range : head.getRanges()) { statusStack.pushStatus(range.toString()); @@ -2339,6 +2343,10 @@ public class XFLConverter { DefineSpriteTag sprite = (DefineSpriteTag) t; for (Tag st : sprite.getTags()) { if (st instanceof SoundStreamHeadTypeTag) { + if (!mediaStarted) { + writer.writeStartElement("media"); + mediaStarted = true; + } SoundStreamHeadTypeTag head = (SoundStreamHeadTypeTag) st; for (SoundStreamFrameRange range : head.getRanges()) { statusStack.pushStatus(range.toString()); @@ -2352,7 +2360,9 @@ public class XFLConverter { } } - writer.writeEndElement(); + if (mediaStarted) { + writer.writeEndElement(); + } } private static void writeLinkage(XFLXmlWriter writer, CharacterTag symbol, Map characterVariables, Map characterClasses, Set charactersExportedInFirstFrame, Map characterImportLinkageURL) throws XMLStreamException {