Skip to content

Voice memos (isAudioMessage: true) produce broken 0-second unplayable audio #773

@mwmacmahon

Description

@mwmacmahon

Description

When sending an audio attachment with isAudioMessage: true and method: private-api, the recipient receives a voice bubble that shows 0 seconds duration, has an identical waveform regardless of content, and is unplayable. The same audio file sent as a regular attachment plays correctly.

Environment

  • BlueBubbles Server: 1.9.9
  • macOS: 26.2.0 (Tahoe)
  • Private API: Enabled

Steps to Reproduce

  1. Have any valid MP3 file (I used ffmpeg sine waves at 3s and 10s)
  2. Send via the attachment API:
curl -X POST "https://<SERVER>/api/v1/message/attachment?password=<PASSWORD>" \
  -F "attachment=@test.mp3;type=audio/mpeg" \
  --form-string "chatGuid=<CHAT_GUID>" \
  -F "name=test.mp3" \
  -F "tempGuid=temp-$(date +%s)" \
  -F "method=private-api" \
  -F "isAudioMessage=true"
  1. Voice bubble arrives but shows "0 seconds", flat waveform, won't play

Expected Behavior

Voice bubble plays audio with correct duration and waveform.

Actual Behavior

Voice bubble is broken — 0s duration, identical waveform regardless of content, unplayable.

Test Results

I tested the same audio files across three scenarios to isolate the issue:

  • Group A (baseline): Regular attachments without isAudioMessage — confirms the audio files are valid
  • Group B: Same files sent as voice memos with isAudioMessage=true — the broken case
  • Group C: Voice memo flag set, but with apple-script or no method instead of private-api — isolates the delivery path

All tests used the same 3s sine wave MP3 unless noted. The 10s variant rules out duration as a factor.

Test Format Method isAudioMessage Result Playable
A1 MP3 3s private-api false MP3 attachment, 3s
A2 MP3 10s private-api false MP3 attachment, 10s
B1 MP3 3s private-api true Voice bubble, 0s
B2 MP3 10s private-api true Voice bubble, 0s
B3 CAF (AAC) 3s private-api true Voice bubble, 0s
C1 MP3 3s apple-script true CAF attachment, 3s
C2 MP3 3s (none) true CAF attachment, 3s

C1/C2 are key: the same 3s MP3 from B1 is converted MP3→CAF by the server and plays correctly when sent via apple-script or default method. The bug is specifically in the private-api + isAudioMessage=true code path. B3 (pre-converted CAF) is also broken, so the issue is downstream of format conversion.

Additional Info

API returns 200 with successful conversion (e.g. 49KB MP3 → 271KB CAF, UTI com.apple.coreaudio-format), but the resulting voice memo is broken.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions