diff --git a/app/src/test/java/xyz/cottongin/radio247/audio/Mp3FrameSyncTest.kt b/app/src/test/java/xyz/cottongin/radio247/audio/Mp3FrameSyncTest.kt index 83c3bd4..6633adc 100644 --- a/app/src/test/java/xyz/cottongin/radio247/audio/Mp3FrameSyncTest.kt +++ b/app/src/test/java/xyz/cottongin/radio247/audio/Mp3FrameSyncTest.kt @@ -15,8 +15,8 @@ class Mp3FrameSyncTest { sampleRateIndex: Int, padding: Boolean ): ByteArray { - // Byte 0: sync. Byte 1: 0xF9 = sync + MPEG1(11) + LayerIII(01) + noCRC(1) - val byte1 = 0xF9.toByte() + // Byte 0: sync. Byte 1: 0xFB = sync + MPEG1(11) + LayerIII(01) + noCRC(1) + val byte1 = 0xFB.toByte() // Byte 2: bitrate(4) | sample(2) | padding(1) | private(1) val byte2 = ((bitrateIndex shl 4) or (sampleRateIndex shl 2) or (if (padding) 2 else 0)).toByte() return byteArrayOf(0xFF.toByte(), byte1, byte2, 0x00) @@ -30,8 +30,8 @@ class Mp3FrameSyncTest { sampleRateIndex: Int, padding: Boolean ): ByteArray { - // Byte 1: 0xF5 = sync + MPEG2(10) + LayerIII(01) + noCRC(1) - val byte1 = 0xF5.toByte() + // Byte 1: 0xF3 = sync + MPEG2(10) + LayerIII(01) + noCRC(1) + val byte1 = 0xF3.toByte() val byte2 = ((bitrateIndex shl 4) or (sampleRateIndex shl 2) or (if (padding) 2 else 0)).toByte() return byteArrayOf(0xFF.toByte(), byte1, byte2, 0x00) } @@ -61,7 +61,7 @@ class Mp3FrameSyncTest { @Test fun resyncsAfterGarbageBytes() { val garbage = ByteArray(100) { 0x42 } - val header = byteArrayOf(0xFF.toByte(), 0xF9.toByte(), 0x80.toByte(), 0x00) + val header = byteArrayOf(0xFF.toByte(), 0xFB.toByte(), 0x90.toByte(), 0x00) val bodySize = 417 - 4 val frame = buildFrame(header, bodySize) // Need second frame for two-frame validation @@ -79,8 +79,8 @@ class Mp3FrameSyncTest { fun calculatesFrameSizeCorrectlyForVariousBitrates() { // MPEG1 Layer3: 128kbps/44100Hz = 417, 192kbps/44100Hz = 626, 320kbps/44100Hz = 1044 val configs = listOf( - Triple(8, 0, 417), // 128kbps, 44100Hz - Triple(12, 0, 626), // 192kbps, 44100Hz + Triple(9, 0, 417), // 128kbps, 44100Hz + Triple(11, 0, 626), // 192kbps, 44100Hz Triple(14, 0, 1044) // 320kbps, 44100Hz ) for ((bitrateIdx, sampleIdx, expectedSize) in configs) { @@ -94,18 +94,19 @@ class Mp3FrameSyncTest { val frames = mutableListOf() Mp3FrameSync { frames.add(it) }.feed(data) - assertEquals("bitrateIndex=$bitrateIdx", 1, frames.size) + assertEquals("bitrateIndex=$bitrateIdx", 2, frames.size) assertEquals("bitrateIndex=$bitrateIdx", expectedSize, frames[0].size) + assertEquals("bitrateIndex=$bitrateIdx", expectedSize, frames[1].size) } } @Test fun handlesPaddingBit() { - // MPEG1 Layer3, 128kbps, 44100Hz, WITH padding → frameSize = 418. 0x92 = bitrate 8, padding. - val header = byteArrayOf(0xFF.toByte(), 0xF9.toByte(), 0x92.toByte(), 0x00) // padding bit set + // MPEG1 Layer3, 128kbps, 44100Hz, WITH padding → frameSize = 418. 0x92 = bitrate 9, padding. + val header = byteArrayOf(0xFF.toByte(), 0xFB.toByte(), 0x92.toByte(), 0x00) // padding bit set val bodySize = 418 - 4 val frame = buildFrame(header, bodySize) - val nextHeader = byteArrayOf(0xFF.toByte(), 0xF9.toByte(), 0x92.toByte(), 0x00) + val nextHeader = byteArrayOf(0xFF.toByte(), 0xFB.toByte(), 0x92.toByte(), 0x00) val nextFrame = buildFrame(nextHeader, 418 - 4) val data = frame + nextFrame @@ -118,7 +119,7 @@ class Mp3FrameSyncTest { @Test fun emitsCompleteFramesViaCallback() { - val header = buildMpeg1Layer3Header(8, 0, false) + val header = buildMpeg1Layer3Header(9, 0, false) val frame1 = buildFrame(header, 417 - 4) val frame2 = buildFrame(header, 417 - 4) val data = frame1 + frame2 @@ -133,7 +134,7 @@ class Mp3FrameSyncTest { @Test fun handlesTruncatedFrameAtEnd() { - val header = byteArrayOf(0xFF.toByte(), 0xF9.toByte(), 0x80.toByte(), 0x00) + val header = byteArrayOf(0xFF.toByte(), 0xFB.toByte(), 0x90.toByte(), 0x00) // Only half the body (413/2 ≈ 206 bytes instead of 413) val truncatedBody = ByteArray(206) { 0 } val data = header + truncatedBody @@ -169,7 +170,7 @@ class Mp3FrameSyncTest { @Test fun handlesIncrementalFeeding() { - val header = buildMpeg1Layer3Header(8, 0, false) + val header = buildMpeg1Layer3Header(9, 0, false) val frame = buildFrame(header, 417 - 4) val nextFrame = buildFrame(header, 417 - 4) val data = frame + nextFrame @@ -193,7 +194,7 @@ class Mp3FrameSyncTest { fun handlesMpeg2Frames() { // MPEG2 Layer3, 128kbps, 22050Hz → frameSize = (72 * 128000 / 22050) + padding // 72 * 128000 / 22050 = 417.95... → 417 without padding, 418 with - val header = buildMpeg2Layer3Header(9, 0, false) // index 9 = 128kbps for MPEG2 + val header = buildMpeg2Layer3Header(12, 0, false) // index 12 = 128kbps for MPEG2 val expectedSize = (72 * 128 * 1000 / 22050) // = 417 val bodySize = expectedSize - 4 val frame = buildFrame(header, bodySize)