+/// Converts the captcha to a base64 encoded wav audio file
+pub(crate) fn captcha_as_wav_base64(captcha: &Captcha) -> Result<String, LemmyError> {
+ let letters = captcha.as_wav();
+
+ // Decode each wav file, concatenate the samples
+ let mut concat_samples: Vec<i16> = Vec::new();
+ let mut any_header: Option<wav::Header> = None;
+ for letter in letters {
+ let mut cursor = Cursor::new(letter.unwrap_or_default());
+ let (header, samples) = wav::read(&mut cursor)?;
+ any_header = Some(header);
+ if let Some(samples16) = samples.as_sixteen() {
+ concat_samples.extend(samples16);
+ } else {
+ return Err(LemmyErrorType::CouldntCreateAudioCaptcha)?;
+ }
+ }
+
+ // Encode the concatenated result as a wav file
+ let mut output_buffer = Cursor::new(vec![]);
+ let header = match any_header {
+ Some(header) => header,
+ None => return Err(LemmyErrorType::CouldntCreateAudioCaptcha)?,
+ };
+ wav::write(
+ header,
+ &wav::BitDepth::Sixteen(concat_samples),
+ &mut output_buffer,
+ )
+ .with_lemmy_type(LemmyErrorType::CouldntCreateAudioCaptcha)?;
+
+ Ok(base64.encode(output_buffer.into_inner()))
+}
+