From 0ef0fecaf4948184c1fa94804409b3110e98e803 Mon Sep 17 00:00:00 2001 From: tino1b2be <12063392+tino1b2be@users.noreply.github.com> Date: Sat, 2 May 2026 23:58:58 +0100 Subject: [PATCH 1/2] release: bump project to 2.1.0 and aggregate javadoc for dtmf-io modules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prepare the 2.1.0 release that first ships the dtmf-io layer to Maven consumers. The modules themselves merged in #6; this commit bumps the coordinate every published artifact stamps itself with, pins the BOM to match, and teaches the Pages workflow about the three new modules. Version bump (all inherit via root `allprojects`): - build.gradle.kts: version = "2.1.0" - goertzel, dtmf-core, dtmf-io, dtmf-io-wav, dtmf-io-mp3 all now publish as com.tino1b2be::2.1.0. BOM alignment (dtmf-bom/build.gradle.kts): - All five api() constraints bumped to 2.1.0 so com.tino1b2be:dtmf-bom:2.1.0 pins the new artifacts. Verified via `./gradlew publishToMavenLocal` that dtmf-bom-2.1.0.pom lists all five shipping libraries at 2.1.0. aggregateJavadoc fix (build.gradle.kts): - publishedModuleNames grows from 2 entries to 5 so that `./gradlew aggregateJavadoc` — the task the GitHub Pages workflow runs on every push to master — now copies dtmf-io/, dtmf-io-wav/, and dtmf-io-mp3/ javadoc into build/javadoc-site/ alongside the existing goertzel/ and dtmf-core/ entries. Without this the Pages site would be missing 60% of the public API starting 2.1.0. - Task-comment block's example layout updated to show all five module directories under build/javadoc-site/. README.md: - Coordinate table replaces the four-module layout with five published modules (goertzel, dtmf-core, dtmf-io, dtmf-io-wav, dtmf-io-mp3) plus dtmf-bom, each at 2.1.0. - Status line updated: 2.1.0, file I/O now delivered, remaining out-of-scope items listed. - Out of scope section trims File I/O (it ships), adds codecs beyond WAV/MP3 (FLAC/OGG/Opus/AAC) and production WAV/MP3 encoding as future-spec candidates. Per-module header comments (goertzel, dtmf-core, dtmf-io, dtmf-io-wav, dtmf-io-mp3 build.gradle.kts): bump the cited 2.0.0 coordinate in the top-of-file comment to 2.1.0 so doc stays accurate. Not touched on purpose: - .kiro/specs/*/requirements.md and design.md — historical spec documents, still cite the 2.0.0 coordinate that was the contract at the time those specs were authored. - docs/requirements.md (foundation normative spec) — same reasoning, documents the 2.0 acceptance criteria. A future `v2.1` foundation spec addendum (if wanted) can supersede. Verification: - `./gradlew clean build aggregateJavadoc` — BUILD SUCCESSFUL. All five published modules produce 2.1.0 jars (main + sources + javadoc = 15 artifacts). - `./gradlew :dtmf-core:integrationTest :dtmf-io:integrationTest` — 0 failures. - `./gradlew publishToMavenLocal` — six Maven folders populated under ~/.m2/repository/com/tino1b2be/ with every BOM constraint pinned at 2.1.0. - build/javadoc-site/ aggregates all five modules with footer reading "Currently documenting version 2.1.0". --- README.md | 18 +++++++++++------- build.gradle.kts | 15 ++++++++++++--- dtmf-bom/build.gradle.kts | 15 ++++++++------- dtmf-core/build.gradle.kts | 2 +- dtmf-io-mp3/build.gradle.kts | 2 +- dtmf-io-wav/build.gradle.kts | 2 +- dtmf-io/build.gradle.kts | 2 +- goertzel/build.gradle.kts | 2 +- 8 files changed, 36 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 3f33af2..23cae0c 100644 --- a/README.md +++ b/README.md @@ -2,18 +2,21 @@ A Java 17 library for detecting and generating [DTMF](https://en.wikipedia.org/wiki/Dual-tone_multi-frequency_signaling) (Dual-Tone Multi-Frequency) signalling tones per ITU-T Q.23 and Q.24. Ships a Goertzel-based detection backend with both batch and streaming APIs. -> **Status:** v2 foundation. File I/O (WAV/MP3/OGG), CLI, GUI, microphone capture, Android support, and Maven Central publishing are explicitly out of scope for this spec and planned for follow-on releases. See [Out of scope](#out-of-scope) below. +> **Status:** v2.1.0. File I/O ships as a separate layer in the `dtmf-io`, `dtmf-io-wav`, and `dtmf-io-mp3` modules (added in this release). CLI, GUI, microphone capture, Android support, FLAC/OGG/Opus/AAC codecs, and Maven Central publishing remain out of scope. See [Out of scope](#out-of-scope) below. ## Modules -The project is a Gradle multi-module build. Four modules ship as artifacts; a fifth root aggregator coordinates the build. +The project is a Gradle multi-module build. Five modules ship as artifacts; a sixth root aggregator coordinates the build, and a seventh (`dtmf-benchmarks`) hosts JMH benchmarks and is not published. | Module | Coordinates | Depends on | Purpose | |---|---|---|---| -| `goertzel` | `com.tino1b2be:goertzel:2.0.0` | JDK 17 only | General-purpose Goertzel filter + filter bank | -| `dtmf-core` | `com.tino1b2be:dtmf-core:2.0.0` | `goertzel` | DTMF detection, generation, streaming | +| `goertzel` | `com.tino1b2be:goertzel:2.1.0` | JDK 17 only | General-purpose Goertzel filter + filter bank | +| `dtmf-core` | `com.tino1b2be:dtmf-core:2.1.0` | `goertzel` | DTMF detection, generation, streaming | +| `dtmf-io` | `com.tino1b2be:dtmf-io:2.1.0` | `dtmf-core` | Pull-based `AudioSource` SPI + `DtmfFileDecoder` | +| `dtmf-io-wav` | `com.tino1b2be:dtmf-io-wav:2.1.0` | `dtmf-io` | WAV `AudioSourceProvider` (clean-room RIFF parser) | +| `dtmf-io-mp3` | `com.tino1b2be:dtmf-io-mp3:2.1.0` | `dtmf-io`, JLayer, mp3spi | MP3 `AudioSourceProvider` | | `dtmf-benchmarks` | *(not published)* | `dtmf-core`, `goertzel` | JMH benchmarks | -| `dtmf-bom` | `com.tino1b2be:dtmf-bom:2.0.0` | *(BOM only)* | Pins `goertzel` and `dtmf-core` at a coordinated version | +| `dtmf-bom` | `com.tino1b2be:dtmf-bom:2.1.0` | *(BOM only)* | Pins the five shipping libraries at a coordinated version | ## Prerequisites @@ -138,9 +141,10 @@ The standard factories accept exactly `{8000, 16000, 44100, 48000}` Hz. The adva ## Out of scope -The following are explicitly **not** part of v2 foundation: +The following are explicitly **not** part of the current release: -- **File I/O** — no WAV, MP3, or OGG readers. Callers supply PCM samples as `double[]`, `short[]`, `float[]`, or `int[]`. +- **Additional audio codecs** — beyond WAV and MP3. FLAC, OGG Vorbis, Opus, and AAC are future spec candidates. +- **Production WAV/MP3 encoding** — `dtmf-io-wav` includes only a test-only encoder for round-trip tests; no public encoding API ships. - **CLI** — no command-line interface module. - **GUI** — no Swing, AWT, JavaFX, or applet code. - **Microphone capture** — no real-time audio input. diff --git a/build.gradle.kts b/build.gradle.kts index 17523e2..5792329 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,7 +2,7 @@ // // Per Task 1.6 of the dtmf-v2-foundation spec: the root applies no plugins // itself. Its sole responsibility is to stamp consistent Maven coordinates -// — group `com.tino1b2be` and version `2.0.0` — onto every subproject +// — group `com.tino1b2be` and version `2.1.0` — onto every subproject // (Requirements 2.1, 2.2, 2.3). // // `allprojects` (rather than `subprojects`) is used deliberately. The root @@ -14,7 +14,7 @@ allprojects { group = "com.tino1b2be" - version = "2.0.0" + version = "2.1.0" } // ------------------------------------------------------------------------- @@ -31,10 +31,19 @@ allprojects { // index.html ← landing page listing the modules // goertzel/ ← :goertzel javadoc // dtmf-core/ ← :dtmf-core javadoc +// dtmf-io/ ← :dtmf-io javadoc +// dtmf-io-wav/ ← :dtmf-io-wav javadoc +// dtmf-io-mp3/ ← :dtmf-io-mp3 javadoc // // Consumers can browse the full API at tino1b2be.github.io/DTMF-Decoder. -val publishedModuleNames = setOf("goertzel", "dtmf-core") +val publishedModuleNames = setOf( + "goertzel", + "dtmf-core", + "dtmf-io", + "dtmf-io-wav", + "dtmf-io-mp3", +) tasks.register("aggregateJavadoc") { group = "documentation" diff --git a/dtmf-bom/build.gradle.kts b/dtmf-bom/build.gradle.kts index df6e92c..783055b 100644 --- a/dtmf-bom/build.gradle.kts +++ b/dtmf-bom/build.gradle.kts @@ -11,8 +11,9 @@ // // Group and version are stamped by the root `build.gradle.kts` via // `allprojects` — this BOM therefore publishes as -// `com.tino1b2be:dtmf-bom:2.0.0` and pins the two shipping libraries at the -// same coordinate. Maven Central publishing is intentionally out of scope +// `com.tino1b2be:dtmf-bom:2.1.0` and pins the five shipping libraries +// (goertzel, dtmf-core, dtmf-io, dtmf-io-wav, dtmf-io-mp3) at the same +// coordinate. Maven Central publishing is intentionally out of scope // for the foundation spec (Requirement 16.6); this module only wires the // publication so `publishToMavenLocal` works for local smoke-testing. @@ -27,11 +28,11 @@ javaPlatform { dependencies { constraints { - api("com.tino1b2be:goertzel:2.0.0") - api("com.tino1b2be:dtmf-core:2.0.0") - api("com.tino1b2be:dtmf-io:2.0.0") - api("com.tino1b2be:dtmf-io-wav:2.0.0") - api("com.tino1b2be:dtmf-io-mp3:2.0.0") + api("com.tino1b2be:goertzel:2.1.0") + api("com.tino1b2be:dtmf-core:2.1.0") + api("com.tino1b2be:dtmf-io:2.1.0") + api("com.tino1b2be:dtmf-io-wav:2.1.0") + api("com.tino1b2be:dtmf-io-mp3:2.1.0") } } diff --git a/dtmf-core/build.gradle.kts b/dtmf-core/build.gradle.kts index 8ec706f..003b50b 100644 --- a/dtmf-core/build.gradle.kts +++ b/dtmf-core/build.gradle.kts @@ -8,7 +8,7 @@ // and the bare `maven-publish` publication all come from // `dtmf.published-library-conventions` (layered on top of // `dtmf.java-library-conventions`). Maven coordinates -// (`com.tino1b2be:dtmf-core:2.0.0`) are inherited from the root +// (`com.tino1b2be:dtmf-core:2.1.0`) are inherited from the root // `build.gradle.kts` via `allprojects`. plugins { diff --git a/dtmf-io-mp3/build.gradle.kts b/dtmf-io-mp3/build.gradle.kts index f89a2a1..e1775aa 100644 --- a/dtmf-io-mp3/build.gradle.kts +++ b/dtmf-io-mp3/build.gradle.kts @@ -24,7 +24,7 @@ // `maven-publish` publication all come from // `dtmf.published-library-conventions` (layered on top of // `dtmf.java-library-conventions`). Maven coordinates -// (`com.tino1b2be:dtmf-io-mp3:2.0.0`) are inherited from the root +// (`com.tino1b2be:dtmf-io-mp3:2.1.0`) are inherited from the root // `build.gradle.kts` via `allprojects`. plugins { diff --git a/dtmf-io-wav/build.gradle.kts b/dtmf-io-wav/build.gradle.kts index 9074198..32a778a 100644 --- a/dtmf-io-wav/build.gradle.kts +++ b/dtmf-io-wav/build.gradle.kts @@ -17,7 +17,7 @@ // `maven-publish` publication all come from // `dtmf.published-library-conventions` (layered on top of // `dtmf.java-library-conventions`). Maven coordinates -// (`com.tino1b2be:dtmf-io-wav:2.0.0`) are inherited from the root +// (`com.tino1b2be:dtmf-io-wav:2.1.0`) are inherited from the root // `build.gradle.kts` via `allprojects`. plugins { diff --git a/dtmf-io/build.gradle.kts b/dtmf-io/build.gradle.kts index 0011333..d30f1d6 100644 --- a/dtmf-io/build.gradle.kts +++ b/dtmf-io/build.gradle.kts @@ -14,7 +14,7 @@ // `maven-publish` publication all come from // `dtmf.published-library-conventions` (layered on top of // `dtmf.java-library-conventions`). Maven coordinates -// (`com.tino1b2be:dtmf-io:2.0.0`) are inherited from the root +// (`com.tino1b2be:dtmf-io:2.1.0`) are inherited from the root // `build.gradle.kts` via `allprojects`. plugins { diff --git a/goertzel/build.gradle.kts b/goertzel/build.gradle.kts index a536d3c..98e5f9f 100644 --- a/goertzel/build.gradle.kts +++ b/goertzel/build.gradle.kts @@ -5,7 +5,7 @@ // `dtmf.java-library-conventions` plugin that is layered in underneath // `dtmf.published-library-conventions`. // -// Maven coordinates (`com.tino1b2be:goertzel:2.0.0`) are inherited from the +// Maven coordinates (`com.tino1b2be:goertzel:2.1.0`) are inherited from the // root `build.gradle.kts` via `allprojects`. The published-library convention // attaches a bare `maven-publish` publication; no signing or remote repository // is configured because Maven Central publishing is out of scope for the From 5814b7fc79386fe3cea0f8dff2b2ccc614b81def Mon Sep 17 00:00:00 2001 From: tino1b2be <12063392+tino1b2be@users.noreply.github.com> Date: Sun, 3 May 2026 00:07:51 +0100 Subject: [PATCH 2/2] release: fix ModuleStructureTest and bump dtmf-io* @since to 2.1.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Caught by CI on the previous commit: ModuleStructureTest's `dtmfBomPinsAllFivePublishedCoordinates` passed locally from cache but failed on Ubuntu's fresh run. The test's VERSION constant was pinned to "2.0.0", so after the BOM bumped to 2.1.0 the expected/actual sets no longer intersected. Changes: - dtmf-io/src/test/java/.../ModuleStructureTest.java: VERSION constant bumped to "2.1.0"; class-level Javadoc example coordinates updated to match. - All 31 Javadoc `@since 2.0.0` tags on dtmf-io*, dtmf-io-wav, and dtmf-io-mp3 public and internal types bumped to `@since 2.1.0` so they record the first Maven release the type actually ships in, rather than the date it was authored. Not bumped: - goertzel and dtmf-core `@since 2.0.0` tags stay as-is — those types genuinely shipped in 2.0.0. - docs/requirements.md and .kiro/specs/*/ still reference 2.0.0; those are historical spec documents. Verification: `./gradlew clean build` — green locally. --- .../com/tino1b2be/dtmf/io/mp3/Mp3AudioSource.java | 2 +- .../dtmf/io/mp3/Mp3AudioSourceProvider.java | 2 +- .../dtmf/io/mp3/internal/Mp3HeaderScanner.java | 2 +- .../tino1b2be/dtmf/io/mp3/internal/package-info.java | 2 +- .../java/com/tino1b2be/dtmf/io/mp3/package-info.java | 2 +- .../com/tino1b2be/dtmf/io/wav/WavAudioSource.java | 2 +- .../dtmf/io/wav/WavAudioSourceProvider.java | 2 +- .../tino1b2be/dtmf/io/wav/internal/RiffChunk.java | 2 +- .../tino1b2be/dtmf/io/wav/internal/RiffReader.java | 2 +- .../dtmf/io/wav/internal/WavSampleReader.java | 2 +- .../tino1b2be/dtmf/io/wav/internal/WaveFormat.java | 2 +- .../tino1b2be/dtmf/io/wav/internal/package-info.java | 2 +- .../java/com/tino1b2be/dtmf/io/wav/package-info.java | 2 +- .../java/com/tino1b2be/dtmf/io/wav/WavEncoder.java | 2 +- .../com/tino1b2be/dtmf/io/IntegrationWavEncoder.java | 2 +- .../java/com/tino1b2be/dtmf/io/Mp3RoundTripIT.java | 2 +- .../java/com/tino1b2be/dtmf/io/OpenMp3IT.java | 2 +- .../java/com/tino1b2be/dtmf/io/OpenWavIT.java | 2 +- .../com/tino1b2be/dtmf/io/RegisteredFormatsIT.java | 2 +- .../com/tino1b2be/dtmf/io/UnrecognizedInputIT.java | 2 +- .../main/java/com/tino1b2be/dtmf/io/AudioSource.java | 2 +- .../com/tino1b2be/dtmf/io/AudioSourceProvider.java | 2 +- .../java/com/tino1b2be/dtmf/io/AudioSources.java | 2 +- .../java/com/tino1b2be/dtmf/io/DtmfFileDecoder.java | 2 +- .../main/java/com/tino1b2be/dtmf/io/PcmEncoding.java | 2 +- .../com/tino1b2be/dtmf/io/RawPcmAudioSource.java | 2 +- .../dtmf/io/UnsupportedAudioFormatException.java | 2 +- .../tino1b2be/dtmf/io/internal/ProviderScore.java | 2 +- .../tino1b2be/dtmf/io/internal/SampleConversion.java | 4 ++-- .../com/tino1b2be/dtmf/io/internal/package-info.java | 2 +- .../java/com/tino1b2be/dtmf/io/package-info.java | 2 +- .../com/tino1b2be/dtmf/io/ModuleStructureTest.java | 12 ++++++------ 32 files changed, 38 insertions(+), 38 deletions(-) diff --git a/dtmf-io-mp3/src/main/java/com/tino1b2be/dtmf/io/mp3/Mp3AudioSource.java b/dtmf-io-mp3/src/main/java/com/tino1b2be/dtmf/io/mp3/Mp3AudioSource.java index 97357ea..10b3ceb 100644 --- a/dtmf-io-mp3/src/main/java/com/tino1b2be/dtmf/io/mp3/Mp3AudioSource.java +++ b/dtmf-io-mp3/src/main/java/com/tino1b2be/dtmf/io/mp3/Mp3AudioSource.java @@ -109,7 +109,7 @@ * identifying the source as closed (Requirement 3.14). * {@link #close()} itself is idempotent. * - * @since 2.0.0 + * @since 2.1.0 * @see AudioSource * @see Mp3AudioSourceProvider */ diff --git a/dtmf-io-mp3/src/main/java/com/tino1b2be/dtmf/io/mp3/Mp3AudioSourceProvider.java b/dtmf-io-mp3/src/main/java/com/tino1b2be/dtmf/io/mp3/Mp3AudioSourceProvider.java index 45fa572..e51ea3c 100644 --- a/dtmf-io-mp3/src/main/java/com/tino1b2be/dtmf/io/mp3/Mp3AudioSourceProvider.java +++ b/dtmf-io-mp3/src/main/java/com/tino1b2be/dtmf/io/mp3/Mp3AudioSourceProvider.java @@ -138,7 +138,7 @@ * their own lifecycle and are not thread-safe — see * {@link Mp3AudioSource}. * - * @since 2.0.0 + * @since 2.1.0 * @see Mp3AudioSource * @see Mp3HeaderScanner * @see AudioSourceProvider diff --git a/dtmf-io-mp3/src/main/java/com/tino1b2be/dtmf/io/mp3/internal/Mp3HeaderScanner.java b/dtmf-io-mp3/src/main/java/com/tino1b2be/dtmf/io/mp3/internal/Mp3HeaderScanner.java index 9ebe1ab..de5539a 100644 --- a/dtmf-io-mp3/src/main/java/com/tino1b2be/dtmf/io/mp3/internal/Mp3HeaderScanner.java +++ b/dtmf-io-mp3/src/main/java/com/tino1b2be/dtmf/io/mp3/internal/Mp3HeaderScanner.java @@ -91,7 +91,7 @@ * entirely to whether the caller-supplied stream is safe to read from * concurrently — a question outside this scanner's scope. * - * @since 2.0.0 + * @since 2.1.0 */ public final class Mp3HeaderScanner { diff --git a/dtmf-io-mp3/src/main/java/com/tino1b2be/dtmf/io/mp3/internal/package-info.java b/dtmf-io-mp3/src/main/java/com/tino1b2be/dtmf/io/mp3/internal/package-info.java index a61af04..0fa49d2 100644 --- a/dtmf-io-mp3/src/main/java/com/tino1b2be/dtmf/io/mp3/internal/package-info.java +++ b/dtmf-io-mp3/src/main/java/com/tino1b2be/dtmf/io/mp3/internal/package-info.java @@ -17,6 +17,6 @@ * {@code Mp3AudioSourceProvider} and {@code Mp3AudioSource} in the parent * package. * - * @since 2.0.0 + * @since 2.1.0 */ package com.tino1b2be.dtmf.io.mp3.internal; diff --git a/dtmf-io-mp3/src/main/java/com/tino1b2be/dtmf/io/mp3/package-info.java b/dtmf-io-mp3/src/main/java/com/tino1b2be/dtmf/io/mp3/package-info.java index 1d85402..717a459 100644 --- a/dtmf-io-mp3/src/main/java/com/tino1b2be/dtmf/io/mp3/package-info.java +++ b/dtmf-io-mp3/src/main/java/com/tino1b2be/dtmf/io/mp3/package-info.java @@ -35,6 +35,6 @@ * Stage 1 so the source tree exists for the build-shape smoke tests in * Task 1.8. * - * @since 2.0.0 + * @since 2.1.0 */ package com.tino1b2be.dtmf.io.mp3; diff --git a/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/WavAudioSource.java b/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/WavAudioSource.java index 940fa98..2cc57cf 100644 --- a/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/WavAudioSource.java +++ b/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/WavAudioSource.java @@ -88,7 +88,7 @@ * identifying the source as closed (Requirement 3.14). * {@link #close()} itself is idempotent. * - * @since 2.0.0 + * @since 2.1.0 * @see AudioSource * @see WavAudioSourceProvider * @see WavSampleReader diff --git a/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/WavAudioSourceProvider.java b/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/WavAudioSourceProvider.java index 422e571..743c9e7 100644 --- a/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/WavAudioSourceProvider.java +++ b/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/WavAudioSourceProvider.java @@ -99,7 +99,7 @@ * whose {@link AudioSource#close()} transitions the source into the * closed state but leaves the caller's {@link InputStream} untouched. * - * @since 2.0.0 + * @since 2.1.0 * @see WavAudioSource * @see AudioSourceProvider * @see AudioSource diff --git a/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/internal/RiffChunk.java b/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/internal/RiffChunk.java index 81c982b..01d6f75 100644 --- a/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/internal/RiffChunk.java +++ b/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/internal/RiffChunk.java @@ -58,7 +58,7 @@ * @param dataStartOffset absolute byte position of the first payload * byte within the enclosing source; must be * non-negative - * @since 2.0.0 + * @since 2.1.0 */ public record RiffChunk(String id, long size, long dataStartOffset) { diff --git a/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/internal/RiffReader.java b/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/internal/RiffReader.java index 6c4cde7..0afa74f 100644 --- a/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/internal/RiffReader.java +++ b/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/internal/RiffReader.java @@ -64,7 +64,7 @@ * mediates mutable byte-source state and must be used by one thread at a * time. Concurrent calls are undefined behaviour. * - * @since 2.0.0 + * @since 2.1.0 */ public final class RiffReader { diff --git a/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/internal/WavSampleReader.java b/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/internal/WavSampleReader.java index adcfca4..f7beab8 100644 --- a/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/internal/WavSampleReader.java +++ b/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/internal/WavSampleReader.java @@ -120,7 +120,7 @@ * classes in the parent {@code com.tino1b2be.dtmf.io.wav} package can * reach it; external callers MUST NOT depend on it. * - * @since 2.0.0 + * @since 2.1.0 */ public final class WavSampleReader { diff --git a/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/internal/WaveFormat.java b/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/internal/WaveFormat.java index 3c9a5f8..6c4f323 100644 --- a/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/internal/WaveFormat.java +++ b/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/internal/WaveFormat.java @@ -98,7 +98,7 @@ * @param totalFrames number of complete frames in the payload * ({@code dataSizeBytes / bytesPerFrame}); * must be non-negative - * @since 2.0.0 + * @since 2.1.0 */ public record WaveFormat( int sampleRate, diff --git a/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/internal/package-info.java b/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/internal/package-info.java index 5336409..5bd2013 100644 --- a/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/internal/package-info.java +++ b/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/internal/package-info.java @@ -18,6 +18,6 @@ * lives on {@code WavAudioSourceProvider} and {@code WavAudioSource} in the * parent package. * - * @since 2.0.0 + * @since 2.1.0 */ package com.tino1b2be.dtmf.io.wav.internal; diff --git a/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/package-info.java b/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/package-info.java index 4e591f6..5b4d535 100644 --- a/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/package-info.java +++ b/dtmf-io-wav/src/main/java/com/tino1b2be/dtmf/io/wav/package-info.java @@ -31,6 +31,6 @@ * Stage 1 so the source tree exists for the build-shape smoke tests in * Task 1.8. * - * @since 2.0.0 + * @since 2.1.0 */ package com.tino1b2be.dtmf.io.wav; diff --git a/dtmf-io-wav/src/test/java/com/tino1b2be/dtmf/io/wav/WavEncoder.java b/dtmf-io-wav/src/test/java/com/tino1b2be/dtmf/io/wav/WavEncoder.java index 99d2efa..3eb813b 100644 --- a/dtmf-io-wav/src/test/java/com/tino1b2be/dtmf/io/wav/WavEncoder.java +++ b/dtmf-io-wav/src/test/java/com/tino1b2be/dtmf/io/wav/WavEncoder.java @@ -98,7 +98,7 @@ * {@code dtmf-io-wav} jar. External consumers MUST NOT depend on it, at * any version, via any mechanism. * - * @since 2.0.0 + * @since 2.1.0 */ final class WavEncoder { diff --git a/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/IntegrationWavEncoder.java b/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/IntegrationWavEncoder.java index 1b9d578..7485f30 100644 --- a/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/IntegrationWavEncoder.java +++ b/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/IntegrationWavEncoder.java @@ -27,7 +27,7 @@ *

Not part of the published API. Used only by * {@code OpenWavIT} / {@code UnrecognizedInputIT} helpers. * - * @since 2.0.0 + * @since 2.1.0 */ final class IntegrationWavEncoder { diff --git a/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/Mp3RoundTripIT.java b/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/Mp3RoundTripIT.java index 23f4c76..31cf24c 100644 --- a/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/Mp3RoundTripIT.java +++ b/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/Mp3RoundTripIT.java @@ -91,7 +91,7 @@ * pathological case (e.g. LAME producing a degenerate frame) does not * fail the suite as long as the corpus average stays above 99%. * - * @since 2.0.0 + * @since 2.1.0 */ @Tag("slow") @EnabledIfSystemProperty( diff --git a/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/OpenMp3IT.java b/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/OpenMp3IT.java index daa7ba6..ca486a7 100644 --- a/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/OpenMp3IT.java +++ b/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/OpenMp3IT.java @@ -52,7 +52,7 @@ * directory happens to be the repo root rather than the module * directory. * - * @since 2.0.0 + * @since 2.1.0 */ final class OpenMp3IT { diff --git a/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/OpenWavIT.java b/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/OpenWavIT.java index dc0de53..581c154 100644 --- a/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/OpenWavIT.java +++ b/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/OpenWavIT.java @@ -32,7 +32,7 @@ * package, and feed the same file through {@code DtmfFileDecoder} to * recover the original keys. * - * @since 2.0.0 + * @since 2.1.0 */ final class OpenWavIT { diff --git a/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/RegisteredFormatsIT.java b/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/RegisteredFormatsIT.java index f1f4cf9..a66d42a 100644 --- a/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/RegisteredFormatsIT.java +++ b/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/RegisteredFormatsIT.java @@ -22,7 +22,7 @@ * {@code dtmf-io-mp3} — what matters for callers is that both names are * present. * - * @since 2.0.0 + * @since 2.1.0 */ final class RegisteredFormatsIT { diff --git a/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/UnrecognizedInputIT.java b/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/UnrecognizedInputIT.java index 7fa0b66..1d81ebe 100644 --- a/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/UnrecognizedInputIT.java +++ b/dtmf-io/src/integrationTest/java/com/tino1b2be/dtmf/io/UnrecognizedInputIT.java @@ -34,7 +34,7 @@ * is negligible but non-zero for truly random bytes, so pinning the seed * is strictly more robust than calling {@code new Random()} here. * - * @since 2.0.0 + * @since 2.1.0 */ final class UnrecognizedInputIT { diff --git a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/AudioSource.java b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/AudioSource.java index 1ad601c..6e7632c 100644 --- a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/AudioSource.java +++ b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/AudioSource.java @@ -91,7 +91,7 @@ * as closed (Requirement 3.14). {@link #close()} itself remains callable * and is a no-op on subsequent invocations. * - * @since 2.0.0 + * @since 2.1.0 * @see AudioSourceProvider * @see AudioSources * @see RawPcmAudioSource diff --git a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/AudioSourceProvider.java b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/AudioSourceProvider.java index 7bbba1d..fd3d923 100644 --- a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/AudioSourceProvider.java +++ b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/AudioSourceProvider.java @@ -84,7 +84,7 @@ * explicitly nullable and implementations must tolerate {@code null} * without throwing. * - * @since 2.0.0 + * @since 2.1.0 */ public interface AudioSourceProvider { diff --git a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/AudioSources.java b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/AudioSources.java index c4a6c53..0d41b15 100644 --- a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/AudioSources.java +++ b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/AudioSources.java @@ -92,7 +92,7 @@ * call. Provider instances themselves may be called concurrently from * multiple threads; see {@link AudioSourceProvider} for that contract. * - * @since 2.0.0 + * @since 2.1.0 * @see AudioSource * @see AudioSourceProvider * @see UnsupportedAudioFormatException diff --git a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/DtmfFileDecoder.java b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/DtmfFileDecoder.java index 60609f1..749b88b 100644 --- a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/DtmfFileDecoder.java +++ b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/DtmfFileDecoder.java @@ -92,7 +92,7 @@ * are safe to invoke concurrently from multiple threads on different * inputs. * - * @since 2.0.0 + * @since 2.1.0 * @see AudioSources * @see DtmfDecoder * @see DtmfConfig diff --git a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/PcmEncoding.java b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/PcmEncoding.java index 5312e07..a5673ae 100644 --- a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/PcmEncoding.java +++ b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/PcmEncoding.java @@ -40,7 +40,7 @@ * decode to signed 16-bit PCM and bypass the raw-PCM constructor path * entirely. * - * @since 2.0.0 + * @since 2.1.0 * @see RawPcmAudioSource */ public enum PcmEncoding { diff --git a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/RawPcmAudioSource.java b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/RawPcmAudioSource.java index 4c89afc..2e54b35 100644 --- a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/RawPcmAudioSource.java +++ b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/RawPcmAudioSource.java @@ -70,7 +70,7 @@ * underlying {@code byte[]} (which is safe provided no one mutates the * bytes). * - * @since 2.0.0 + * @since 2.1.0 * @see AudioSource * @see PcmEncoding * @see com.tino1b2be.dtmf.io.internal.SampleConversion diff --git a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/UnsupportedAudioFormatException.java b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/UnsupportedAudioFormatException.java index c1cd13a..1419ba3 100644 --- a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/UnsupportedAudioFormatException.java +++ b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/UnsupportedAudioFormatException.java @@ -51,7 +51,7 @@ * caught exception to multiple consumers is safe; attempting to mutate * the returned collections throws {@link UnsupportedOperationException}. * - * @since 2.0.0 + * @since 2.1.0 * @see AudioSources * @see AudioSourceProvider */ diff --git a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/internal/ProviderScore.java b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/internal/ProviderScore.java index a955961..93075ba 100644 --- a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/internal/ProviderScore.java +++ b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/internal/ProviderScore.java @@ -42,7 +42,7 @@ * @param priority the value of {@link AudioSourceProvider#priority()} at * the time of scoring, used as the tie-breaker when two * providers return the same {@code score} - * @since 2.0.0 + * @since 2.1.0 */ public record ProviderScore(AudioSourceProvider provider, int score, int priority) { diff --git a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/internal/SampleConversion.java b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/internal/SampleConversion.java index 3d43b01..a495750 100644 --- a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/internal/SampleConversion.java +++ b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/internal/SampleConversion.java @@ -70,7 +70,7 @@ * their inputs before asking for a decoder, so this dispatcher's rejection * is the second line of defence. * - * @since 2.0.0 + * @since 2.1.0 */ public final class SampleConversion { @@ -118,7 +118,7 @@ private SampleConversion() { } *

Decoders are stateless and may be cached or shared across * threads. * - * @since 2.0.0 + * @since 2.1.0 */ @FunctionalInterface public interface SampleDecoder { diff --git a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/internal/package-info.java b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/internal/package-info.java index e855d19..50d5b57 100644 --- a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/internal/package-info.java +++ b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/internal/package-info.java @@ -18,6 +18,6 @@ * those names are internal detail — the public contract for each * behaviour lives on the public types in the parent package. * - * @since 2.0.0 + * @since 2.1.0 */ package com.tino1b2be.dtmf.io.internal; diff --git a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/package-info.java b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/package-info.java index d63febf..27f0eb5 100644 --- a/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/package-info.java +++ b/dtmf-io/src/main/java/com/tino1b2be/dtmf/io/package-info.java @@ -30,6 +30,6 @@ * Stage 1 so the source tree exists for the build-shape smoke tests in * Task 1.8. * - * @since 2.0.0 + * @since 2.1.0 */ package com.tino1b2be.dtmf.io; diff --git a/dtmf-io/src/test/java/com/tino1b2be/dtmf/io/ModuleStructureTest.java b/dtmf-io/src/test/java/com/tino1b2be/dtmf/io/ModuleStructureTest.java index f68969f..89a2e0f 100644 --- a/dtmf-io/src/test/java/com/tino1b2be/dtmf/io/ModuleStructureTest.java +++ b/dtmf-io/src/test/java/com/tino1b2be/dtmf/io/ModuleStructureTest.java @@ -70,11 +70,11 @@ * published coordinates. Parse * {@code dtmf-bom/build.gradle.kts} and assert its constraints * block contains {@code api} entries for - * {@code com.tino1b2be:goertzel:2.0.0}, - * {@code com.tino1b2be:dtmf-core:2.0.0}, - * {@code com.tino1b2be:dtmf-io:2.0.0}, - * {@code com.tino1b2be:dtmf-io-wav:2.0.0}, and - * {@code com.tino1b2be:dtmf-io-mp3:2.0.0}. + * {@code com.tino1b2be:goertzel:2.1.0}, + * {@code com.tino1b2be:dtmf-core:2.1.0}, + * {@code com.tino1b2be:dtmf-io:2.1.0}, + * {@code com.tino1b2be:dtmf-io-wav:2.1.0}, and + * {@code com.tino1b2be:dtmf-io-mp3:2.1.0}. * * *

Working-directory resolution

@@ -180,7 +180,7 @@ class ModuleStructureTest { private static final String MP3SPI_COORDINATE = "com.googlecode.soundlibs:mp3spi:1.9.5.4"; private static final String GROUP = "com.tino1b2be"; - private static final String VERSION = "2.0.0"; + private static final String VERSION = "2.1.0"; private static final List EXPECTED_BOM_COORDINATES = List.of( GROUP + ":goertzel:" + VERSION,