summaryrefslogtreecommitdiffstats
path: root/xbmc/cdrip/EncoderAddon.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/cdrip/EncoderAddon.cpp')
-rw-r--r--xbmc/cdrip/EncoderAddon.cpp95
1 files changed, 95 insertions, 0 deletions
diff --git a/xbmc/cdrip/EncoderAddon.cpp b/xbmc/cdrip/EncoderAddon.cpp
new file mode 100644
index 0000000..4d250ad
--- /dev/null
+++ b/xbmc/cdrip/EncoderAddon.cpp
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2013 Arne Morten Kvarving
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "EncoderAddon.h"
+
+using namespace ADDON;
+using namespace KODI::CDRIP;
+
+CEncoderAddon::CEncoderAddon(const AddonInfoPtr& addonInfo)
+ : IAddonInstanceHandler(ADDON_INSTANCE_AUDIOENCODER, addonInfo)
+{
+ // Create "C" interface structures, used as own parts to prevent API problems on update
+ m_ifc.audioencoder = new AddonInstance_AudioEncoder();
+ m_ifc.audioencoder->toAddon = new KodiToAddonFuncTable_AudioEncoder();
+ m_ifc.audioencoder->toKodi = new AddonToKodiFuncTable_AudioEncoder();
+ m_ifc.audioencoder->toKodi->kodiInstance = this;
+ m_ifc.audioencoder->toKodi->write = cb_write;
+ m_ifc.audioencoder->toKodi->seek = cb_seek;
+}
+
+CEncoderAddon::~CEncoderAddon()
+{
+ // Delete "C" interface structures
+ delete m_ifc.audioencoder->toKodi;
+ delete m_ifc.audioencoder->toAddon;
+ delete m_ifc.audioencoder;
+}
+
+bool CEncoderAddon::Init()
+{
+ if (CreateInstance() != ADDON_STATUS_OK || !m_ifc.audioencoder->toAddon->start)
+ return false;
+
+ KODI_ADDON_AUDIOENCODER_INFO_TAG tag{};
+ tag.channels = m_iInChannels;
+ tag.samplerate = m_iInSampleRate;
+ tag.bits_per_sample = m_iInBitsPerSample;
+ tag.track_length = m_iTrackLength;
+ tag.title = m_strTitle.c_str();
+ tag.artist = m_strArtist.c_str();
+ tag.album_artist = m_strAlbumArtist.c_str();
+ tag.album = m_strAlbum.c_str();
+ tag.release_date = m_strYear.c_str();
+ tag.track = atoi(m_strTrack.c_str());
+ tag.genre = m_strGenre.c_str();
+ tag.comment = m_strComment.c_str();
+
+ return m_ifc.audioencoder->toAddon->start(m_ifc.hdl, &tag);
+}
+
+ssize_t CEncoderAddon::Encode(uint8_t* pbtStream, size_t nNumBytesRead)
+{
+ if (m_ifc.audioencoder->toAddon->encode)
+ return m_ifc.audioencoder->toAddon->encode(m_ifc.hdl, pbtStream, nNumBytesRead);
+ return 0;
+}
+
+bool CEncoderAddon::Close()
+{
+ bool ret = false;
+ if (m_ifc.audioencoder->toAddon->finish)
+ ret = m_ifc.audioencoder->toAddon->finish(m_ifc.hdl);
+
+ DestroyInstance();
+
+ return ret;
+}
+
+ssize_t CEncoderAddon::Write(const uint8_t* data, size_t len)
+{
+ return CEncoder::Write(data, len);
+}
+
+ssize_t CEncoderAddon::Seek(ssize_t pos, int whence)
+{
+ return CEncoder::Seek(pos, whence);
+}
+
+ssize_t CEncoderAddon::cb_write(KODI_HANDLE kodiInstance, const uint8_t* data, size_t len)
+{
+ if (!kodiInstance || !data)
+ return -1;
+ return static_cast<CEncoderAddon*>(kodiInstance)->Write(data, len);
+}
+
+ssize_t CEncoderAddon::cb_seek(KODI_HANDLE kodiInstance, ssize_t pos, int whence)
+{
+ if (!kodiInstance)
+ return -1;
+ return static_cast<CEncoderAddon*>(kodiInstance)->Seek(pos, whence);
+}