client API: qthelper: add a refcounting wrapper around mpv_handle

This is useful to deal with crazy Qt object lifetime issues (the
following commit needs it).
This commit is contained in:
wm4
2014-12-30 22:24:57 +01:00
parent 63a414c708
commit 50c40b6ded
3 changed files with 32 additions and 1 deletions

View File

@@ -25,6 +25,7 @@ API changes
::
1.12 - add class Handle to qthelper.hpp
1.11 - add OpenGL rendering interop API - allows an application to combine
its own and mpv's OpenGL rendering
Warning: this API is not stable yet - anything in opengl_cb.h might

View File

@@ -167,7 +167,7 @@ extern "C" {
* relational operators (<, >, <=, >=).
*/
#define MPV_MAKE_VERSION(major, minor) (((major) << 16) | (minor) | 0UL)
#define MPV_CLIENT_API_VERSION MPV_MAKE_VERSION(1, 11)
#define MPV_CLIENT_API_VERSION MPV_MAKE_VERSION(1, 12)
/**
* Return the MPV_CLIENT_API_VERSION the mpv source has been compiled with.

View File

@@ -25,12 +25,42 @@
#include <QString>
#include <QList>
#include <QHash>
#include <QSharedPointer>
#include <mpv/client.h>
namespace mpv {
namespace qt {
// Wrapper around mpv_handle. Does refcounting under the hood.
class Handle
{
struct container {
container(mpv_handle *h) : mpv(h) {}
~container() { mpv_terminate_destroy(mpv); }
mpv_handle *mpv;
};
QSharedPointer<container> sptr;
public:
// Construct a new Handle from a raw mpv_handle with refcount 1. If the
// last Handle goes out of scope, the mpv_handle will be destroyed with
// mpv_terminate_destroy().
// Never destroy the mpv_handle manually when using this wrapper. You
// will create dangling pointers. Just let the wrapper take care of
// destroying the mpv_handle.
// Never create multiple wrappers from the same raw mpv_handle; copy the
// wrapper instead (that's what it's for).
static Handle FromRawHandle(mpv_handle *handle) {
Handle h;
h.sptr = QSharedPointer<container>(new container(handle));
return h;
}
// Return the raw handle; for use with the libmpv C API.
operator mpv_handle*() { return (*sptr).mpv; }
operator mpv_handle*() const { return (*sptr).mpv; }
};
static inline QVariant node_to_variant(const mpv_node *node)
{
switch (node->format) {