Skip to content

Commit 8f3ebcb

Browse files
committed
Add send_voice_message api
1 parent 3567c9d commit 8f3ebcb

File tree

4 files changed

+68
-16
lines changed

4 files changed

+68
-16
lines changed

bindings/matrix-sdk-ffi/src/room.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,30 @@ impl Room {
818818
}))
819819
}
820820

821+
pub fn send_voice_message(
822+
self: Arc<Self>,
823+
url: String,
824+
audio_info: AudioInfo,
825+
waveform: Vec<u16>,
826+
progress_watcher: Option<Box<dyn ProgressWatcher>>,
827+
) -> Arc<SendAttachmentJoinHandle> {
828+
SendAttachmentJoinHandle::new(RUNTIME.spawn(async move {
829+
let mime_str =
830+
audio_info.mimetype.as_ref().ok_or(RoomError::InvalidAttachmentMimeType)?;
831+
let mime_type =
832+
mime_str.parse::<Mime>().map_err(|_| RoomError::InvalidAttachmentMimeType)?;
833+
834+
let base_audio_info: BaseAudioInfo = BaseAudioInfo::try_from(&audio_info)
835+
.map_err(|_| RoomError::InvalidAttachmentData)?;
836+
837+
let waveform_amplitudes = waveform.iter().map(|v| (*v).into()).collect();
838+
let attachment_info = AttachmentInfo::Voice(base_audio_info, Some(waveform_amplitudes));
839+
let attachment_config = AttachmentConfig::new().info(attachment_info);
840+
841+
self.send_attachment(url, mime_type, attachment_config, progress_watcher).await
842+
}))
843+
}
844+
821845
pub fn send_file(
822846
self: Arc<Self>,
823847
url: String,

crates/matrix-sdk/src/attachment.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,12 @@ use std::time::Duration;
2222
use image::GenericImageView;
2323
use ruma::{
2424
assign,
25-
events::room::{
26-
message::{AudioInfo, FileInfo, VideoInfo},
27-
ImageInfo, ThumbnailInfo,
25+
events::{
26+
audio::Amplitude,
27+
room::{
28+
message::{AudioInfo, FileInfo, VideoInfo},
29+
ImageInfo, ThumbnailInfo,
30+
},
2831
},
2932
OwnedTransactionId, TransactionId, UInt,
3033
};
@@ -77,7 +80,7 @@ pub struct BaseFileInfo {
7780
}
7881

7982
/// Types of metadata for an attachment.
80-
#[derive(Debug)]
83+
#[derive(Debug, Clone)]
8184
pub enum AttachmentInfo {
8285
/// The metadata of an image.
8386
Image(BaseImageInfo),
@@ -87,6 +90,8 @@ pub enum AttachmentInfo {
8790
Audio(BaseAudioInfo),
8891
/// The metadata of a file.
8992
File(BaseFileInfo),
93+
/// The metadata of a voice message
94+
Voice(BaseAudioInfo, Option<Vec<Amplitude>>),
9095
}
9196

9297
impl From<AttachmentInfo> for ImageInfo {

crates/matrix-sdk/src/encryption/mod.rs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ use ruma::{
4646
events::room::{
4747
message::{
4848
AudioInfo, AudioMessageEventContent, FileInfo, FileMessageEventContent,
49-
ImageMessageEventContent, MessageType, VideoInfo, VideoMessageEventContent,
49+
ImageMessageEventContent, MessageType, UnstableAudioDetailsContentBlock,
50+
UnstableVoiceContentBlock, VideoInfo, VideoMessageEventContent,
5051
},
5152
ImageInfo, MediaSource, ThumbnailInfo,
5253
},
@@ -202,13 +203,24 @@ impl Client {
202203
MessageType::Image(content)
203204
}
204205
mime::AUDIO => {
205-
let info = assign!(info.map(AudioInfo::from).unwrap_or_default(), {
206+
let audio_info = assign!(info.clone().map(AudioInfo::from).unwrap_or_default(), {
206207
mimetype: Some(content_type.as_ref().to_owned()),
207208
});
208-
let content = assign!(AudioMessageEventContent::encrypted(body.to_owned(), file), {
209-
info: Some(Box::new(info))
210-
});
211-
MessageType::Audio(content)
209+
210+
let mut audio_message_event_content =
211+
assign!(AudioMessageEventContent::encrypted(body.to_owned(), file), {
212+
info: Some(Box::new(audio_info))
213+
});
214+
215+
if let Some(AttachmentInfo::Voice(audio_info, Some(waveform))) = info {
216+
if let Some(duration) = audio_info.duration {
217+
audio_message_event_content.audio =
218+
Some(UnstableAudioDetailsContentBlock::new(duration, waveform));
219+
}
220+
audio_message_event_content.voice = Some(UnstableVoiceContentBlock::new());
221+
}
222+
223+
MessageType::Audio(audio_message_event_content)
212224
}
213225
mime::VIDEO => {
214226
let info = assign!(info.map(VideoInfo::from).unwrap_or_default(), {
@@ -1352,4 +1364,4 @@ mod tests {
13521364
let after_taking_lock_second_time = client.olm_machine().await.as_ref().unwrap().clone();
13531365
assert!(after_taking_lock_first_time.same_as(&after_taking_lock_second_time));
13541366
}
1355-
}
1367+
}

crates/matrix-sdk/src/media.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ use ruma::{
3333
events::room::{
3434
message::{
3535
self, AudioInfo, FileInfo, FileMessageEventContent, ImageMessageEventContent,
36-
MessageType, VideoInfo, VideoMessageEventContent,
36+
MessageType, UnstableAudioDetailsContentBlock, UnstableVoiceContentBlock, VideoInfo,
37+
VideoMessageEventContent,
3738
},
3839
ImageInfo, MediaSource, ThumbnailInfo,
3940
},
@@ -438,13 +439,23 @@ impl Media {
438439
)
439440
}
440441
mime::AUDIO => {
441-
let info = assign!(info.map(AudioInfo::from).unwrap_or_default(), {
442+
let audio_info = assign!(info.clone().map(AudioInfo::from).unwrap_or_default(), {
442443
mimetype: Some(content_type.as_ref().to_owned()),
443444
});
444-
MessageType::Audio(
445+
446+
let mut audio_message_event_content =
445447
message::AudioMessageEventContent::plain(body.to_owned(), url)
446-
.info(Box::new(info)),
447-
)
448+
.info(Box::new(audio_info));
449+
450+
if let Some(AttachmentInfo::Voice(audio_info, Some(waveform))) = info {
451+
if let Some(duration) = audio_info.duration {
452+
audio_message_event_content.audio =
453+
Some(UnstableAudioDetailsContentBlock::new(duration, waveform));
454+
}
455+
audio_message_event_content.voice = Some(UnstableVoiceContentBlock::new());
456+
}
457+
458+
MessageType::Audio(audio_message_event_content)
448459
}
449460
mime::VIDEO => {
450461
let info = assign!(info.map(VideoInfo::from).unwrap_or_default(), {

0 commit comments

Comments
 (0)