[Scummvm-git-logs] scummvm master -> 93efb9b8c553db742ec343380b674caa871b9450
sev-
noreply at scummvm.org
Mon Nov 28 17:41:36 UTC 2022
This automated email contains information about 6 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
8d722dc3c1 COMMON: Add DisposablePtr constructor with move semantics
02f1759f73 COMMON: Add functions to dynamically cast DisposablePtr
d6d85c8093 AUDIO: Add LoopingAudioStream constructor from move of DisposablePtr.
27532df2c7 AUDIO: Use DisposablePtr-move constructor for looping in mixer
68452ef2e7 COMMON: Kill disownPtr and getDispose from DisposablePtr
93efb9b8c5 COMMON: Allow DisposablePtr to be backed by SharedPtr
Commit: 8d722dc3c105b046389024a00bf4da7caeb2e2a6
https://github.com/scummvm/scummvm/commit/8d722dc3c105b046389024a00bf4da7caeb2e2a6
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-11-28T18:41:30+01:00
Commit Message:
COMMON: Add DisposablePtr constructor with move semantics
This allows easy move from one DisposablePtr to another
Changed paths:
common/ptr.h
diff --git a/common/ptr.h b/common/ptr.h
index 9193b9b1051..a494c68e841 100644
--- a/common/ptr.h
+++ b/common/ptr.h
@@ -657,6 +657,10 @@ public:
typedef T &ReferenceType;
explicit DisposablePtr(PointerType o, DisposeAfterUse::Flag dispose) : _pointer(o), _dispose(dispose) {}
+ DisposablePtr(DisposablePtr<T>&& o) : _pointer(o._pointer), _dispose(o._dispose) {
+ o._pointer = nullptr;
+ o._dispose = DisposeAfterUse::NO;
+ }
~DisposablePtr() {
if (_dispose) DL()(_pointer);
Commit: 02f1759f73b9fd105ba3df7c20fdb298f75c36b6
https://github.com/scummvm/scummvm/commit/02f1759f73b9fd105ba3df7c20fdb298f75c36b6
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-11-28T18:41:30+01:00
Commit Message:
COMMON: Add functions to dynamically cast DisposablePtr
Changed paths:
common/ptr.h
diff --git a/common/ptr.h b/common/ptr.h
index a494c68e841..9fabed51aa2 100644
--- a/common/ptr.h
+++ b/common/ptr.h
@@ -691,6 +691,23 @@ public:
reset(nullptr, DisposeAfterUse::NO);
}
+ template <class T2>
+ bool isDynamicallyCastable() {
+ return dynamic_cast<T2 *>(_pointer) != nullptr;
+ }
+
+ /* Destroys the smart pointer while returning a pointer to
+ assign to a new object.
+ */
+ template <class T2, class DL2 = DefaultDeleter<T2> >
+ DisposablePtr<T2, DL2> moveAndDynamicCast() {
+ DisposablePtr<T2, DL2> ret(
+ dynamic_cast<T2 *>(_pointer), _dispose);
+ _pointer = nullptr;
+ _dispose = DisposeAfterUse::NO;
+ return ret;
+ }
+
/**
* Clears the pointer without destroying the old object.
*/
@@ -711,6 +728,9 @@ public:
*/
DisposeAfterUse::Flag getDispose() const { return _dispose; }
+ template <class T2, class DL2>
+ friend class DisposablePtr;
+
private:
PointerType _pointer;
DisposeAfterUse::Flag _dispose;
Commit: d6d85c80935ad17339185518eb3d53bb2831afa4
https://github.com/scummvm/scummvm/commit/d6d85c80935ad17339185518eb3d53bb2831afa4
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-11-28T18:41:30+01:00
Commit Message:
AUDIO: Add LoopingAudioStream constructor from move of DisposablePtr.
Changed paths:
audio/audiostream.cpp
audio/audiostream.h
diff --git a/audio/audiostream.cpp b/audio/audiostream.cpp
index 08de5bee61f..4624ee437bd 100644
--- a/audio/audiostream.cpp
+++ b/audio/audiostream.cpp
@@ -92,20 +92,23 @@ SeekableAudioStream *SeekableAudioStream::openStreamFile(const Common::String &b
#pragma mark --- LoopingAudioStream ---
#pragma mark -
-LoopingAudioStream::LoopingAudioStream(RewindableAudioStream *stream, uint loops, DisposeAfterUse::Flag disposeAfterUse, bool rewind)
- : _parent(stream, disposeAfterUse), _loops(loops), _completeIterations(0) {
- assert(stream);
+LoopingAudioStream::LoopingAudioStream(Common::DisposablePtr<RewindableAudioStream>&& stream, uint loops, bool rewind)
+ : _parent(Common::move(stream)), _loops(loops), _completeIterations(0) {
+ assert(_parent);
- if (rewind && !stream->rewind()) {
+ if (rewind && !_parent->rewind()) {
// TODO: Properly indicate error
_loops = _completeIterations = 1;
}
- if (stream->endOfStream()) {
+ if (_parent->endOfStream()) {
// Apparently this is an empty stream
_loops = _completeIterations = 1;
}
}
+LoopingAudioStream::LoopingAudioStream(RewindableAudioStream *stream, uint loops, DisposeAfterUse::Flag disposeAfterUse, bool rewind)
+ : LoopingAudioStream(Common::move(Common::DisposablePtr<RewindableAudioStream>(stream, disposeAfterUse)), loops, rewind) {}
+
int LoopingAudioStream::readBuffer(int16 *buffer, const int numSamples) {
if ((_loops && _completeIterations == _loops) || !numSamples)
return 0;
diff --git a/audio/audiostream.h b/audio/audiostream.h
index d8779623894..0de0ce45404 100644
--- a/audio/audiostream.h
+++ b/audio/audiostream.h
@@ -157,6 +157,20 @@ public:
*/
LoopingAudioStream(RewindableAudioStream *stream, uint loops, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES, bool rewind = true);
+ /**
+ * Create a looping audio stream object.
+ *
+ * On creation of the LoopingAudioStream object, the underlying stream will be rewound.
+ *
+ * @see makeLoopingAudioStream
+ *
+ * @param stream The stream to loop.
+ * @param loops How often to loop (0 = infinite).
+ * @param disposeAfterUse Destroy the stream after the LoopingAudioStream has finished playback.
+ * @param rewind If true, rewind the underlying stream.
+ */
+ LoopingAudioStream(Common::DisposablePtr<RewindableAudioStream>&& stream, uint loops, bool rewind = true);
+
int readBuffer(int16 *buffer, const int numSamples);
bool endOfData() const;
bool endOfStream() const;
Commit: 27532df2c7f5779d45376622f3a56b13441e704d
https://github.com/scummvm/scummvm/commit/27532df2c7f5779d45376622f3a56b13441e704d
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-11-28T18:41:30+01:00
Commit Message:
AUDIO: Use DisposablePtr-move constructor for looping in mixer
It's much cleaner than disowning the pointer from DisposablePtr
Changed paths:
audio/mixer.cpp
diff --git a/audio/mixer.cpp b/audio/mixer.cpp
index 3e348402827..7672988cd9b 100644
--- a/audio/mixer.cpp
+++ b/audio/mixer.cpp
@@ -635,11 +635,8 @@ Timestamp Channel::getElapsedTime() {
void Channel::loop() {
assert(_stream);
- Audio::RewindableAudioStream *rewindableStream = dynamic_cast<RewindableAudioStream *>(_stream.get());
- if (rewindableStream) {
- DisposeAfterUse::Flag dispose = _stream.getDispose();
- _stream.disownPtr();
- Audio::LoopingAudioStream *loopingStream = new Audio::LoopingAudioStream(rewindableStream, 0, dispose, false);
+ if (_stream.isDynamicallyCastable<RewindableAudioStream>()) {
+ Audio::LoopingAudioStream *loopingStream = new Audio::LoopingAudioStream(Common::move(_stream.moveAndDynamicCast<RewindableAudioStream>()), 0, false);
_stream.reset(loopingStream, DisposeAfterUse::YES);
}
}
Commit: 68452ef2e7911ed7985d4a47a975c4d759ea5c40
https://github.com/scummvm/scummvm/commit/68452ef2e7911ed7985d4a47a975c4d759ea5c40
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-11-28T18:41:30+01:00
Commit Message:
COMMON: Kill disownPtr and getDispose from DisposablePtr
They unnecessarily expose internal details
Their only user has been eliminated in the previous commit
Changed paths:
common/ptr.h
diff --git a/common/ptr.h b/common/ptr.h
index 9fabed51aa2..8a9165a7536 100644
--- a/common/ptr.h
+++ b/common/ptr.h
@@ -708,14 +708,6 @@ public:
return ret;
}
- /**
- * Clears the pointer without destroying the old object.
- */
- void disownPtr() {
- _pointer = nullptr;
- _dispose = DisposeAfterUse::NO;
- }
-
/**
* Returns the plain pointer value.
*
@@ -723,11 +715,6 @@ public:
*/
PointerType get() const { return _pointer; }
- /**
- * Returns the pointer's dispose flag.
- */
- DisposeAfterUse::Flag getDispose() const { return _dispose; }
-
template <class T2, class DL2>
friend class DisposablePtr;
Commit: 93efb9b8c553db742ec343380b674caa871b9450
https://github.com/scummvm/scummvm/commit/93efb9b8c553db742ec343380b674caa871b9450
Author: Vladimir Serbinenko (phcoder at gmail.com)
Date: 2022-11-28T18:41:30+01:00
Commit Message:
COMMON: Allow DisposablePtr to be backed by SharedPtr
Currently DisposablePtr allows to transparently switch between raw
pointer and ScopedPtr semantics. Add a possibility to have SharedPtr
semantics as well.
Changed paths:
common/ptr.h
diff --git a/common/ptr.h b/common/ptr.h
index 8a9165a7536..2922dbdb4e8 100644
--- a/common/ptr.h
+++ b/common/ptr.h
@@ -656,10 +656,12 @@ public:
typedef T *PointerType;
typedef T &ReferenceType;
- explicit DisposablePtr(PointerType o, DisposeAfterUse::Flag dispose) : _pointer(o), _dispose(dispose) {}
- DisposablePtr(DisposablePtr<T>&& o) : _pointer(o._pointer), _dispose(o._dispose) {
+ explicit DisposablePtr(PointerType o, DisposeAfterUse::Flag dispose) : _pointer(o), _dispose(dispose), _shared() {}
+ explicit DisposablePtr(SharedPtr<T> o) : _pointer(o.get()), _dispose(DisposeAfterUse::NO), _shared(o) {}
+ DisposablePtr(DisposablePtr<T>&& o) : _pointer(o._pointer), _dispose(o._dispose), _shared(o._shared) {
o._pointer = nullptr;
o._dispose = DisposeAfterUse::NO;
+ o._shared.reset();
}
~DisposablePtr() {
@@ -682,6 +684,7 @@ public:
if (_dispose) DL()(_pointer);
_pointer = o;
_dispose = dispose;
+ _shared.reset();
}
/**
@@ -701,12 +704,15 @@ public:
*/
template <class T2, class DL2 = DefaultDeleter<T2> >
DisposablePtr<T2, DL2> moveAndDynamicCast() {
- DisposablePtr<T2, DL2> ret(
- dynamic_cast<T2 *>(_pointer), _dispose);
- _pointer = nullptr;
- _dispose = DisposeAfterUse::NO;
+ DisposablePtr<T2, DL2> ret(nullptr, DisposeAfterUse::NO);
+ ret._pointer = dynamic_cast<T2 *>(_pointer);
+ ret._dispose = _dispose;
+ ret._shared = _shared.template dynamicCast<T2>();
+ _pointer = nullptr;
+ _dispose = DisposeAfterUse::NO;
+ _shared.reset();
return ret;
- }
+ }
/**
* Returns the plain pointer value.
@@ -719,8 +725,11 @@ public:
friend class DisposablePtr;
private:
+ DisposablePtr() : _pointer(nullptr), _dispose(DisposeAfterUse::NO), _shared() {}
PointerType _pointer;
DisposeAfterUse::Flag _dispose;
+ SharedPtr<T> _shared;
+ bool _isvalid;
};
/** @} */
More information about the Scummvm-git-logs
mailing list