Skip to content

Commit

Permalink
Merge pull request #15834 from RomanPudashkin/update_4.0.1
Browse files Browse the repository at this point in the history
update_4.0.1
  • Loading branch information
RomanPudashkin committed Jan 12, 2023
2 parents 3caa460 + 3f24594 commit 76500c3
Show file tree
Hide file tree
Showing 10 changed files with 61 additions and 12 deletions.
8 changes: 8 additions & 0 deletions src/appshell/appshellmodule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,14 @@ void AppShellModule::onInit(const IApplication::RunMode&)
#endif
}

void AppShellModule::onAllInited(const framework::IApplication::RunMode&)
{
//! NOTE: process QEvent::FileOpen as early as possible if it was postponed
#ifdef Q_OS_MACOS
qApp->processEvents();
#endif
}

void AppShellModule::onDeinit()
{
s_sessionsManager->deinit();
Expand Down
1 change: 1 addition & 0 deletions src/appshell/appshellmodule.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ class AppShellModule : public modularity::IModuleSetup

void onPreInit(const framework::IApplication::RunMode& mode) override;
void onInit(const framework::IApplication::RunMode& mode) override;
void onAllInited(const framework::IApplication::RunMode& mode) override;
void onDeinit() override;
};
}
Expand Down
16 changes: 16 additions & 0 deletions src/engraving/libmscore/engravingobject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -676,6 +676,22 @@ bool EngravingObject::isLinked(EngravingObject* se) const
return _links->contains(se);
}

//---------------------------------------------------------
// findLinkedInScore
/// if exists, returns the linked object in the required
/// score, else returns null
//---------------------------------------------------------

EngravingObject* EngravingObject::findLinkedInScore(Score* score) const
{
if (score == this || !_links || _links->empty()) {
return nullptr;
}
auto findElem = std::find_if(_links->begin(), _links->end(),
[score](EngravingObject* engObj) { return engObj && engObj->score() == score; });
return findElem != _links->end() ? *findElem : nullptr;
}

//---------------------------------------------------------
// undoUnlink
//---------------------------------------------------------
Expand Down
1 change: 1 addition & 0 deletions src/engraving/libmscore/engravingobject.h
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,7 @@ class EngravingObject
void linkTo(EngravingObject*);
void unlink();
bool isLinked(EngravingObject* se = nullptr) const;
EngravingObject* findLinkedInScore(Score* score) const;

virtual void undoUnlink();
LinkedObjects* links() const { return _links; }
Expand Down
7 changes: 4 additions & 3 deletions src/engraving/libmscore/excerpt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -771,7 +771,8 @@ static MeasureBase* cloneMeasure(MeasureBase* mb, Score* score, const Score* osc
if (e->generated()) {
continue;
}
if ((e->track() == srcTrack && strack != mu::nidx) || (e->systemFlag() && srcTrack == 0)) {
if ((e->track() == srcTrack && strack != mu::nidx && !e->systemFlag())
|| (e->systemFlag() && srcTrack == 0 && e->track() == srcTrack)) {
EngravingItem* ne = e->linkedClone();
processLinkedClone(ne, score, strack);
if (!ns) {
Expand Down Expand Up @@ -1479,8 +1480,8 @@ void Excerpt::cloneStaff2(Staff* srcStaff, Staff* dstStaff, const Fraction& star

for (EngravingItem* e : oseg->annotations()) {
if (e->generated()
|| (e->track() != srcTrack && !e->systemFlag()) // system items must be cloned even if they are on different tracks
|| (e->systemFlag() && score->nstaves() > 1)) { // ...but only once!
|| (e->track() != srcTrack && !(e->systemFlag() && e->track() == 0)) // system items must be cloned even if they are on different tracks
|| (e->track() != srcTrack && e->systemFlag() && e->findLinkedInScore(score))) { // ...but only once!
continue;
}

Expand Down
12 changes: 10 additions & 2 deletions src/framework/audio/internal/platform/win/wasapiaudioclient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,9 @@ using namespace winrt::Windows::Foundation;
using namespace winrt::Windows::Media::Devices;
using namespace winrt::Windows::Devices::Enumeration;

WasapiAudioClient::WasapiAudioClient(HANDLE clientStartedEvent, HANDLE clientStoppedEvent)
: m_clientStartedEvent(clientStartedEvent), m_clientStoppedEvent(clientStoppedEvent)
WasapiAudioClient::WasapiAudioClient(HANDLE clientStartedEvent, HANDLE clientFailedToStartEvent, HANDLE clientStoppedEvent)
: m_clientStartedEvent(clientStartedEvent), m_clientFailedToStartEvent(clientFailedToStartEvent), m_clientStoppedEvent(
clientStoppedEvent)
{
check_hresult(MFStartup(MF_VERSION, MFSTARTUP_LITE));
}
Expand Down Expand Up @@ -218,6 +219,8 @@ HRESULT WasapiAudioClient::ActivateCompleted(IActivateAudioInterfaceAsyncOperati
m_audioRenderClient = nullptr;
m_sampleReadyAsyncResult = nullptr;

SetEvent(m_clientFailedToStartEvent);

// Must return S_OK even on failure.
return S_OK;
}
Expand Down Expand Up @@ -370,6 +373,8 @@ void WasapiAudioClient::startPlayback() noexcept
} catch (...) {
hresult error = to_hresult();
setStateAndNotify(DeviceState::Error, error);

SetEvent(m_clientFailedToStartEvent);
}
}

Expand Down Expand Up @@ -398,6 +403,9 @@ HRESULT WasapiAudioClient::onStartPlayback(IMFAsyncResult*) noexcept
return S_OK;
} catch (...) {
setStateAndNotify(DeviceState::Error, to_hresult());

SetEvent(m_clientFailedToStartEvent);

// Must return S_OK.
return S_OK;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ namespace winrt {
struct WasapiAudioClient : implements<WasapiAudioClient, IActivateAudioInterfaceCompletionHandler>
{
public:
WasapiAudioClient(HANDLE clientStartedEvent, HANDLE clientStoppedEvent);
WasapiAudioClient(HANDLE clientStartedEvent, HANDLE clientFailedToStartEvent, HANDLE clientStoppedEvent);
~WasapiAudioClient();

void setHardWareOffload(bool value);
Expand Down Expand Up @@ -99,6 +99,7 @@ struct WasapiAudioClient : implements<WasapiAudioClient, IActivateAudioInterface
DeviceState m_deviceState = DeviceState::Uninitialized;
SampleRequestCallback m_sampleRequestCallback;
HANDLE m_clientStartedEvent;
HANDLE m_clientFailedToStartEvent;
HANDLE m_clientStoppedEvent;
};
}
Expand Down
15 changes: 13 additions & 2 deletions src/framework/audio/internal/platform/win/wasapiaudiodriver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ inline REFERENCE_TIME samplesToRefTime(int numSamples, double sampleRate) noexce

struct WasapiData {
HANDLE clientStartedEvent;
HANDLE clientFailedToStartEvent;
HANDLE clientStoppedEvent;

winrt::com_ptr<winrt::WasapiAudioClient> wasapiClient;
Expand All @@ -54,6 +55,7 @@ static WasapiData s_data;
WasapiAudioDriver::WasapiAudioDriver()
{
s_data.clientStartedEvent = CreateEvent(NULL, FALSE, FALSE, L"WASAPI_Client_Started");
s_data.clientFailedToStartEvent = CreateEvent(NULL, FALSE, FALSE, L"WASAPI_Client_Failed_To_Start");
s_data.clientStoppedEvent = CreateEvent(NULL, FALSE, FALSE, L"WASAPI_Client_Stopped");

m_devicesListener.startWithCallback([this]() {
Expand All @@ -77,7 +79,8 @@ std::string WasapiAudioDriver::name() const
bool WasapiAudioDriver::open(const Spec& spec, Spec* activeSpec)
{
if (!s_data.wasapiClient.get()) {
s_data.wasapiClient = make_self<WasapiAudioClient>(s_data.clientStartedEvent, s_data.clientStoppedEvent);
s_data.wasapiClient
= make_self<WasapiAudioClient>(s_data.clientStartedEvent, s_data.clientFailedToStartEvent, s_data.clientStoppedEvent);
}

m_desiredSpec = spec;
Expand All @@ -102,7 +105,15 @@ bool WasapiAudioDriver::open(const Spec& spec, Spec* activeSpec)

s_data.wasapiClient->asyncInitializeAudioDevice(deviceId);

WaitForSingleObject(s_data.clientStartedEvent, INFINITE);
static constexpr DWORD handleCount = 2;
const HANDLE handles[handleCount] = { s_data.clientStartedEvent, s_data.clientFailedToStartEvent };

DWORD waitResult = WaitForMultipleObjects(handleCount, handles, false, INFINITE);
if (waitResult != WAIT_OBJECT_0) {
// Either the event was the second event (namely s_data.clientFailedToStartEvent)
// Or some wait error occurred
return false;
}

m_activeSpec = m_desiredSpec;
m_activeSpec.sampleRate = s_data.wasapiClient->sampleRate();
Expand Down
6 changes: 6 additions & 0 deletions src/notation/internal/masternotation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,12 @@ void MasterNotation::applyOptions(mu::engraving::MasterScore* score, const Score
tt->setFollowText(true);
tt->setTrack(0);
seg->add(tt);
for (auto staff : score->getSystemObjectStaves()) {
TempoText* linkedTt = toTempoText(tt->linkedClone());
linkedTt->setScore(score);
linkedTt->setTrack(staff->idx() * VOICES);
seg->add(linkedTt);
}
}

score->setUpTempoMap();
Expand Down
4 changes: 0 additions & 4 deletions src/notation/internal/notationparts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -941,10 +941,6 @@ void NotationParts::appendStaves(Part* part, const InstrumentTemplate& templ, co
}
initStaff(staff, templ, staffType, staffIndex);

if (lastStaffIndex > 0) {
staff->setBarLineSpan(score()->staff(lastStaffIndex - 1)->barLineSpan());
}

insertStaff(staff, staffIndex);
}

Expand Down

0 comments on commit 76500c3

Please sign in to comment.