Skip to content

Commit

Permalink
Create VorbisEncoder
Browse files Browse the repository at this point in the history
  • Loading branch information
runei committed Aug 14, 2024
1 parent 6b67c37 commit 0523a1e
Show file tree
Hide file tree
Showing 2 changed files with 115 additions and 0 deletions.
74 changes: 74 additions & 0 deletions src/internal_modules/roc_audio/vorbis_encoder.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#include "roc_audio/vorbis_encoder.h"
#include "roc_core/panic.h"

namespace roc {
namespace audio {

VorbisEncoder::VorbisEncoder(const SampleSpec& sample_spec)
: sample_spec_(sample_spec)
, initialized_(false)
, frame_data_(NULL)
, frame_size_(0) {
vorbis_info_init(&vorbis_info_);
const int num_channels = static_cast<int>(sample_spec_.num_channels());
const int sample_rate = static_cast<int>(sample_spec_.sample_rate());
int ret = vorbis_encode_init_vbr(&vorbis_info_, num_channels, sample_rate, 0.0f);
if (ret != 0) {
roc_panic("vorbis encoder: failed to initialize vorbis encoder");
}
vorbis_comment_init(&vorbis_comment_);
vorbis_comment_add_tag(&vorbis_comment_, "ENCODER", "roc_audio VorbisEncoder");

ret = vorbis_analysis_init(&vorbis_dsp_, &vorbis_info_);
if (ret != 0) {
roc_panic("vorbis encoder: failed to initialize vorbis dsp");
}

ret = vorbis_block_init(&vorbis_dsp_, &vorbis_block_);
if (ret != 0) {
roc_panic("vorbis encoder: failed to initialize vorbis block");
}

ogg_stream_init(&ogg_stream_, 0);
initialized_ = true;
}

VorbisEncoder::~VorbisEncoder() {
if (initialized_) {
ogg_stream_clear(&ogg_stream_);
vorbis_block_clear(&vorbis_block_);
vorbis_dsp_clear(&vorbis_dsp_);
vorbis_comment_clear(&vorbis_comment_);
vorbis_info_clear(&vorbis_info_);
}
}

status::StatusCode VorbisEncoder::init_status() const {
return initialized_ ? status::StatusOK : status::StatusNoMem;
}

size_t VorbisEncoder::encoded_byte_count(size_t n_samples) const {
roc_panic("TODO");
return 0;
}

void VorbisEncoder::begin_frame(void* frame_data, size_t frame_size) {
roc_panic_if_not(frame_data);
if (frame_data_) {
roc_panic("vorbis encoder: unpaired begin/end");
}
frame_data_ = frame_data;
frame_size_ = frame_size;
}

size_t VorbisEncoder::write_samples(const sample_t* samples, size_t n_samples) {
roc_panic("TODO");
return 0;
}

void VorbisEncoder::end_frame() {
roc_panic("TODO");
}

} // namespace audio
} // namespace roc
41 changes: 41 additions & 0 deletions src/internal_modules/roc_audio/vorbis_encoder.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#ifndef ROC_AUDIO_VORBIS_ENCODER_H_
#define ROC_AUDIO_VORBIS_ENCODER_H_

#include "roc_audio/iframe_encoder.h"
#include "roc_audio/sample_spec.h"
#include <vorbis/vorbisenc.h>

namespace roc {
namespace audio {

class VorbisEncoder : public IFrameEncoder {
public:
VorbisEncoder(const SampleSpec& sample_spec);
~VorbisEncoder();

virtual status::StatusCode init_status() const;

virtual size_t encoded_byte_count(size_t n_samples) const;

virtual void begin_frame(void* frame_data, size_t frame_size);

virtual size_t write_samples(const sample_t* samples, size_t n_samples);

virtual void end_frame();

private:
SampleSpec sample_spec_;
bool initialized_;
void* frame_data_;
size_t frame_size_;
ogg_stream_state ogg_stream_;
vorbis_info vorbis_info_;
vorbis_comment vorbis_comment_;
vorbis_dsp_state vorbis_dsp_;
vorbis_block vorbis_block_;
};

} // namespace audio
} // namespace roc

#endif // ROC_AUDIO_VORBIS_ENCODER_H_

0 comments on commit 0523a1e

Please sign in to comment.