From 56717a51c7305dcea768ca4e1a7945802b3ef8a2 Mon Sep 17 00:00:00 2001 From: pepijn-devries Date: Sat, 8 Nov 2025 12:15:06 +0100 Subject: [PATCH] fixed bug in iff reader --- .github/workflows/rhub.yaml | 3 --- DESCRIPTION | 2 +- NEWS.md | 2 +- R/pattern.R | 3 ++- R/samples.R | 3 ++- data-raw/DATASET.R | 9 +++++---- data-raw/test-sample.aiff | Bin 2134 -> 1040 bytes data-raw/test-sample.iff | Bin 1176 -> 0 bytes data-raw/test-sample.wav | Bin 1176 -> 0 bytes src/samp_io.cpp | 12 ++++++++---- tests/testthat/test_io.R | 14 +++++++++++--- tests/testthat/test_render.R | 3 ++- 12 files changed, 32 insertions(+), 19 deletions(-) delete mode 100644 data-raw/test-sample.iff delete mode 100644 data-raw/test-sample.wav diff --git a/.github/workflows/rhub.yaml b/.github/workflows/rhub.yaml index 78afa72..0c7b37e 100644 --- a/.github/workflows/rhub.yaml +++ b/.github/workflows/rhub.yaml @@ -23,9 +23,6 @@ on: description: 'Unique ID. You can leave this empty now.' type: string -env: - THIS_IS_RHUB: yes - jobs: setup: diff --git a/DESCRIPTION b/DESCRIPTION index f55f7a7..1882aa6 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: ProTrackR2 Title: Manipulate and Play 'ProTracker' Modules -Version: 0.0.6.0011 +Version: 0.0.6.0012 Authors@R: c( person("Pepijn", "de Vries", role = c("aut", "cre"), email = "pepijn.devries@outlook.com", diff --git a/NEWS.md b/NEWS.md index 96cfb7c..fb38b0f 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -ProTrackR2 v0.0.6.0011 +ProTrackR2 v0.0.6.0012 ------------- * Implemented `as_pt2cell()` and `as_pt2celllist()` diff --git a/R/pattern.R b/R/pattern.R index c64e0c4..e317781 100644 --- a/R/pattern.R +++ b/R/pattern.R @@ -16,7 +16,8 @@ pt2_pattern <- function(mod, i, ...) { structure( list(mod = mod, i = as.integer(i)), class = "pt2pat" - ) + ) |> + as.raw.pt2pat(compact = TRUE) } #' Create a new ProTracker pattern diff --git a/R/samples.R b/R/samples.R index 7e231b9..608b2ab 100644 --- a/R/samples.R +++ b/R/samples.R @@ -18,7 +18,8 @@ pt2_sample <- function(mod, i, ...) { structure( list(mod = mod, i = as.integer(i)), class = "pt2samp" - ) + ) |> + as.raw() } #' @rdname mod_info diff --git a/data-raw/DATASET.R b/data-raw/DATASET.R index db8a4dd..6179a95 100644 --- a/data-raw/DATASET.R +++ b/data-raw/DATASET.R @@ -19,10 +19,11 @@ if (!requireNamespace("ProTrackR")) { dur2 <- c(dur2, as.numeric(endtime - starttime, "secs")) } mean(dur1)/mean(dur2) - ProTrackR2::pt2_write_sample(mod2$samples[[1]], "data-raw/test-sample.wav") - ProTrackR2::pt2_write_sample(mod2$samples[[1]], "data-raw/test-sample.iff") if (requireNamespace("av")) { - samp <- av::read_audio_bin("data-raw/test-sample.wav") - av::av_audio_convert("data-raw/test-sample.wav", "data-raw/test-sample.aiff") + tempsmp <- tempfile(fileext = ".wav") + pt2_write_sample(mod2$samples[[1]], tempsmp) + samp <- av::read_audio_bin(tempsmp) + av::av_audio_convert( + tempsmp, "data-raw/test-sample.aiff", format = "u8") } } diff --git a/data-raw/test-sample.aiff b/data-raw/test-sample.aiff index f410032c2074d226ee0d0ff3343db01d3b065e07..04e05edbfc7da605deb234675642a8085af0de28 100644 GIT binary patch literal 1040 zcmZo@XhH^!O-+qWjX)9ufW(?%04xhp)!f_y1g))YZSC#t9i1T1(b3-4*4oknR1J~? zfo7n&jSUU;bv0F$6=h{5#f1fVxw$#HdAWJ{1qB5loR^oMpO*&|1A@H5!jh8Gvhs?G z%Iezs#^%=c&hGA>J|O6yFlo}1sne#Gp0?M)Zf?B)71sE8E6?0 zf-P+X+E`m#Q&T&ud)m~=6MH+`nt>v9wKbJx#f7=qnVA{sX{o6x$tfwRscGpzc6vr; zRyNpK1^M}fMPN5nR@KziH#P!2)7%1bNN@kd$y26IodP7LO`kDy=8PHBr-K=@X3d;2 zbuthDWv5P=GI`QOkZUJRoHU`oueYbCx4XN$s}mSDt!?120R<+I(bCk^P+wDBRasdD z0@YR3)j&T3qXigXz~HJVF98Bzc;)Bj0YO1QAuzadb8>)=PftrpijRp54-W|r4hjkk z@b~lf^78cXaCdcfbab$@v$L_Xv9z$TFt@OEu(5UX@p1PKiwN)uj*1Blk55WW%qni4 zGH>nv^SAFmfB)sjuV26a{r~sx&yVk4KfM3&@%`%;k8WQ)ykpJ6nUgx|$_g?PB7=O~ z9IecZbkr5)q$I>dMMTAbKwLsnMqWir*T}-w*)uRAK0Uvzwz;Ec!j$Q==Pg{aeD%5w zTek1nf9Uw>a~CdMzH;^I)oa(U-@I}2<}Dz+dE>^7>({Pcxq2B4E?qo-{_L64r%s+Y ze(cDh1N-;v+Od7>=8fyuu3ENa;oMo%C-rx=w*bSWvb?mY02q5|$q6x$VIe^QemfAH|p<0ns_I}Z%5%a^YJ0hqiBVqCm<;rzKXCr%taw14kzVBl=q zylKPwwX0XHT()G_-wO<=Mqp;Et*vWl1SYb!*4C!Ry2{dm?9_y) aU_UQcCtE8sV*?!xWf@T(CPc6>@&f>KxdVj& literal 2134 zcmb7_ZERFU6o%imyRfA!l!e+-bqOjef?tRtis92rg?6QjVAW`1Ofb!;ztL-#v#}Yo3i=2sqyb={Lsu6QJa1TtvXC=b>lW>z4;?p z9928ky=)mzX?Xav4-eh2oFNk9!I-cpt>qYrkkc@tG8T&Hy^--z0wW{oOBfeBhP;_l zaMUn#S;|*e7fLWq7(9KYovKVdDW@yboUvwFI_@)X{I=>hHS3Um(vRQ=?FWru zpT5^#?a?mn1Us}HY}0qD*H-Y2wm2kJqog+LONTG$Yk8NXZ_sYAjrC1Bh_BuF{h56Z zuuC(0{tDWOH4i3Zx=vFS*MoXQi}aM9)$@7*EY)(Ype@%jW|rtVE#~cFJx%|F9@nF+ zn5UV#P2)A1N=4zh2X%Fzm=-c>WY-3wtvf|hYLcdq#|+)AIjYpX zs!~Gpb)UlmEd*(Um+itOT`LUZwWkIFS0-({M`9@E%qif$+O zNxDTh>n7a*i`VKZA{xy}E+s-c#ddmwzD~MPNhfEf0~OfWYva7NxY{>S`9`X=2gY_# zwQp5N9la{o`W4=!&){W)Hfj?UPx7`7Jv7j^qJzj7^27iTD|-F@3lh zg8zY3^c?5PZln}@wxP^lP)-wSH8ys^Mgwfr`)t&riloC=GSq<0uD6lRnD)2mYdEQg zneBMk3$q9Cc?caHW`}mpUkCf0;Y??#OdhwwAg8L~PF16baSW;&Ps9_b?PT3S2Gil- zE^;Y%+KT(?GPTV2(K|LJ84~Dc9+q*`I2Y~A#={JJ-HAs}Ik%#m324`}GY<8Pb^5uS z2x5F6O5xwW26odK>~@RziVDD+ec9~Z?;#7jaqT9vZ)3=P7kaqCI?41H_jwCve?NTg egp)cLvJ<&cpK>NY)VrL!)p|v%{!=Y0(b7MpNZKm^ diff --git a/data-raw/test-sample.iff b/data-raw/test-sample.iff deleted file mode 100644 index 9634c58331b257ea425eb7e8bc5056ad3500f71f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1176 zcmaizdrVtZ9LMkN?Tfb1(g%G29Vpwf2Qt~_*u!+Z29wc3OQCf}BaY08N@ePvVY>L2 zF`0kJHkU=SY*AyjXxPJ2+Dhqo6UJZzN{BpL9;NN=fI{E?ZjEt?F@A3DxxahP$@zVM z-*e6(g|ZYu$Y1BEDm9hG1xf@#_y|G@AP5Ry1UYC%Aw&>)ZfPO>a;wjz>1uQ*-up1^ zSWVie^(Sgh=E~&?7-5vv*HzTN{Z6eiJ5N!dg*7>_&hwxo5=ug${TDI{QxqLyAP%KGFNtJFOkftV!lK5P90*l39 zKxRk=Pb?`48N=aFC@f(n33!R|aa0U?BH@tVx9oK}7Z&E{9CrKc%Qbo<8}-(9E`vuuP**$%jcKQd|<}NV^a%KxUK)kpJ+ntMgRZ+ diff --git a/data-raw/test-sample.wav b/data-raw/test-sample.wav deleted file mode 100644 index 4f2d4933b10eb1a8b5da052060050567f273e14a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1176 zcmWIYbaR`)!oU#j80MOmTcRMqz`(!=g!>#Az?hMNgCQlcBvAmUrlFw;88kLEH8wQ@ zNeloIYlZ=^EJRgva|;l(wzjpkx3_n6f}# zm6a417UbpT=H%w(=H(X@6o7DEUVeUF9#9Mj@(K$}N=nPhD=I3hYwH`ETiZLkyL%r32aN8JStxU}qKN=NA@%-B4Lo zQ&->E2=q*I3&|;BW=x+BX3Uy3bH>!kKme4TI%Ue_NfSY? zoiuUMg#NzXo}S+B?(VKmVA!;_fx`wAm_SBLQ&U5IO?6deWfcfiS5;R7{S1s2V1NOG ztD?LF2!P?0pPL5+1qFq`;L6R(0XjZCEhQ;FCNexcBse%IC@{d^&)dt()5F8v)!EU} z!OqUk#>&Rh!otGb!q&mY*3HMq-8(EIz$Z8=CNw-gDKRmtxOvLFwfoQCzW@CFmmj}= z{r>m=-@iXUzJLAj{=>)juU|a6eev*)H4A4>>ZmI#$Vi9`@^N#tGBeUqSCo^I5EB&< z6$1is2}v1w6)jyO3tMN;z=-(t{Ic5Sj-Clqrq7o#oJzGwfT0q#6*UL1O@o{c)GhdIRL$E3-qw5iII`9 zsilpBldGGnqn(wBu9~8hC_fi4wc`Lx;`+`J*|ps>7O&rV`1IwQ_Z~fe^WpoS|488X z=hsi}Ts?by|E?|TS1tv+rmwrbxxTurI4?UbDK0WBIKa=_)6K;h=nPw18yg#IYilbj zODiC-wzjdgvv+iM_3-u&3XP13Pfp9qDJU+ls%>a)>*|>>dHU@63zsfmvwqXooxArR zJbd){$QyV3Em^d1 z-ke#$Y%m#^;3o9<0t2cMnAvJ;>lzw?iL9-)wW+bLva}#OH6be4&&$=x*2>J-Ku1Ga zMwEvM5h{%Q#kmDJHV6TR^{*Kikoh1fMkIL<^B2$rUZl{iC@D$=l{p~L095V(VgLaE D@8A;) diff --git a/src/samp_io.cpp b/src/samp_io.cpp index 39018fc..0801a14 100644 --- a/src/samp_io.cpp +++ b/src/samp_io.cpp @@ -54,13 +54,17 @@ raws sample_file_format_(SEXP input, std::string file_type) { if (file_type == "IFF") { // IFF file size - // FORM + 8SVX + VHDR + 20 + NAME + namelen + ANNO + ProTrackR2 + BODY + samplelen - uint32_t file_size = 16 * 4 + 8 + 20 + 10 + sampleLength + (sampleLength & 1); + // FORM + 8SVX + VHDR + 20 + (NAME + namelen) + ANNO + ProTrackR2 + BODY + samplelen + // 6 chunk headers of which 5 have also length 6 * 4 + 5 * 4 + // VHDR always has 20 bytes + // ANNO always has 10 bytes + // NAME and BODY have variable length + uint32_t file_size = 6 * 4 + 5 * 4 + 20 + 10 + sampleLength + (sampleLength & 1); if (namelen > 0) { - file_size += 16 + (namelen + (namelen&1)); + file_size += (namelen + (namelen&1)); } - int32_t align = ((uint32_t)(file_size/4))*4; + int32_t align = ((uint32_t)(file_size/2))*2; writable::raws output((R_xlen_t)align); uint8_t * buffer = (uint8_t *)RAW(as_sexp(output)); diff --git a/tests/testthat/test_io.R b/tests/testthat/test_io.R index 3b18b11..f7ed59a 100644 --- a/tests/testthat/test_io.R +++ b/tests/testthat/test_io.R @@ -1,6 +1,9 @@ mod <- pt2_read_mod(pt2_demo()) sample <- pt2_sample(mod, 0L) -smpfile <- tempfile(fileext = ".raw") +smpfile_raw <- tempfile(fileext = ".raw") +smpfile_iff <- tempfile(fileext = ".iff") +smpfile_wav <- tempfile(fileext = ".wav") +smpfile_aiff <- "https://github.com/pepijn-devries/ProTrackR2/blob/master/data-raw/test-sample.aiff" test_that("Writing a mod works", { expect_no_error({ @@ -10,12 +13,17 @@ test_that("Writing a mod works", { test_that("Writing raw samples will warn user", { expect_warning({ - pt2_write_sample(sample, smpfile) + pt2_write_sample(sample, smpfile_raw) + pt2_write_sample(sample, smpfile_iff) + pt2_write_sample(sample, smpfile_wav) }) }) test_that("Reading sample works", { expect_no_error({ - pt2_read_sample(smpfile) + samp_raw <- pt2_read_sample(smpfile_raw) + samp_iff <- pt2_read_sample(smpfile_iff) + samp_wav <- pt2_read_sample(smpfile_wav) + samp_aiff <- pt2_read_sample(smpfile_aiff) }) }) diff --git a/tests/testthat/test_render.R b/tests/testthat/test_render.R index e9139f2..897e961 100644 --- a/tests/testthat/test_render.R +++ b/tests/testthat/test_render.R @@ -1,7 +1,8 @@ mod <- pt2_read_mod(pt2_demo()) test_that("Module renders as expected", { - skip_if(Sys.getenv("THIS_IS_RHUB") == "yes", "Skip this test on RHUB as the `av` package leaks memory") + skip_if(grepl("valgrind", Sys.getenv("CHECK_ARGS", ""), ignore.case = TRUE), + "Skip this test on RHUB as the `av` package leaks memory") skip_on_cran() skip_if_not_installed("av") snap <- "intro.mp3"