Audacity 3.2.0
Classes | Public Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
cloud::audiocom::ShareAudioDialog Class Referencefinal

#include <ShareAudioDialog.h>

Inheritance diagram for cloud::audiocom::ShareAudioDialog:
[legend]
Collaboration diagram for cloud::audiocom::ShareAudioDialog:
[legend]

Classes

class  ExportProgressUpdater
 
struct  InitialStatePanel
 
struct  ProgressPanel
 
struct  Services
 

Public Member Functions

 ShareAudioDialog (AudacityProject &project, wxWindow *parent=nullptr)
 
 ~ShareAudioDialog () override
 
- Public Member Functions inherited from wxDialogWrapper
 wxDialogWrapper ()
 
 wxDialogWrapper (wxWindow *parent, wxWindowID id, const TranslatableString &title, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE, const TranslatableString &name=XO("Dialog"))
 
bool Create (wxWindow *parent, wxWindowID id, const TranslatableString &title, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE, const TranslatableString &name=XO("Dialog"))
 
void SetTitle (const TranslatableString &title)
 
void SetLabel (const TranslatableString &title)
 
void SetName (const TranslatableString &title)
 
void SetName ()
 
- Public Member Functions inherited from wxTabTraversalWrapper< wxDialog >
 wxTabTraversalWrapper (Args &&... args)
 
 wxTabTraversalWrapper (const wxTabTraversalWrapper &)=delete
 
 wxTabTraversalWrapper (wxTabTraversalWrapper &&)=delete
 
wxTabTraversalWrapperoperator= (const wxTabTraversalWrapper &)=delete
 
wxTabTraversalWrapperoperator= (wxTabTraversalWrapper &&)=delete
 

Private Types

using Clock = std::chrono::steady_clock
 

Private Member Functions

void Populate (ShuttleGui &s)
 
void OnCancel ()
 
void OnContinue ()
 
wxString ExportProject ()
 
void StartUploadProcess ()
 
void HandleUploadSucceeded (const UploadSuccessfulPayload &payload)
 
void HandleUploadFailed (const UploadFailedPayload &payload)
 
void HandleExportFailure ()
 
void ResetProgress ()
 
void UpdateProgress (uint64_t current, uint64_t total)
 

Private Attributes

AudacityProjectmProject
 
struct cloud::audiocom::ShareAudioDialog::InitialStatePanel mInitialStatePanel
 
struct cloud::audiocom::ShareAudioDialog::ProgressPanel mProgressPanel
 
wxButton * mContinueButton { nullptr }
 
wxButton * mCancelButton { nullptr }
 
std::unique_ptr< ServicesmServices
 
std::unique_ptr< ExportProgressUpdatermExportProgressUpdater
 
Clock::time_point mStageStartTime
 
Clock::time_point mLastUIUpdateTime
 
int mLastProgressValue { 0 }
 
wxString mFilePath
 
std::function< void()> mContinueAction
 
bool mIsAuthorised { false }
 
bool mInProgress { false }
 

Detailed Description

Definition at line 39 of file ShareAudioDialog.h.

Member Typedef Documentation

◆ Clock

using cloud::audiocom::ShareAudioDialog::Clock = std::chrono::steady_clock
private

Definition at line 118 of file ShareAudioDialog.h.

Constructor & Destructor Documentation

◆ ShareAudioDialog()

cloud::audiocom::ShareAudioDialog::ShareAudioDialog ( AudacityProject project,
wxWindow *  parent = nullptr 
)

Definition at line 170 of file ShareAudioDialog.cpp.

172 parent, wxID_ANY, XO("Share Audio"), wxDefaultPosition, { 480, 250 },
173 wxDEFAULT_DIALOG_STYLE)
175 , mInitialStatePanel(*this)
176 , mServices(std::make_unique<Services>())
177{
179
180 ShuttleGui s(this, eIsCreating);
181
182 s.StartVerticalLay();
183 {
184 Populate(s);
185 }
186 s.EndVerticalLay();
187
188 Layout();
189 Fit();
190 Centre();
191
192 const auto size = GetSize();
193
194 SetMinSize({ size.x, std::min(250, size.y) });
195 SetMaxSize({ size.x, -1 });
196
197 mContinueAction = [this]()
198 {
199 if (mInitialStatePanel.root->IsShown())
201 };
202
203 Bind(
204 wxEVT_CHAR_HOOK,
205 [this](auto& evt)
206 {
207 if (!IsEscapeKey(evt))
208 {
209 evt.Skip();
210 return;
211 }
212
213 OnCancel();
214 });
215}
int min(int a, int b)
XO("Cut/Copy/Paste")
@ eIsCreating
Definition: ShuttleGui.h:37
const auto project
Derived from ShuttleGuiBase, an Audacity specific class for shuttling data to and from GUI.
Definition: ShuttleGui.h:640
struct cloud::audiocom::ShareAudioDialog::InitialStatePanel mInitialStatePanel
std::function< void()> mContinueAction
std::unique_ptr< Services > mServices
AuthorizationHandler & GetAuthorizationHandler()

◆ ~ShareAudioDialog()

cloud::audiocom::ShareAudioDialog::~ShareAudioDialog ( )
override

Definition at line 217 of file ShareAudioDialog.cpp.

218{
220 // Clean up the temp file when the dialog is closed
221 if (!mFilePath.empty() && wxFileExists(mFilePath))
222 wxRemoveFile(mFilePath);
223}

References cloud::audiocom::GetAuthorizationHandler(), mFilePath, and cloud::audiocom::AuthorizationHandler::PopSuppressDialogs().

Here is the call graph for this function:

Member Function Documentation

◆ ExportProject()

wxString cloud::audiocom::ShareAudioDialog::ExportProject ( )
private

Definition at line 314 of file ShareAudioDialog.cpp.

315{
317
318 const double t0 = 0.0;
319 const double t1 = tracks.GetEndTime();
320
321 const int nChannels = CalculateChannels(tracks);
322
323 auto hasMimeType = [](const auto&& mimeTypes, const std::string& mimeType)
324 {
325 return std::find(mimeTypes.begin(), mimeTypes.end(), mimeType) != mimeTypes.end();
326 };
327
328 const auto& registry = ExportPluginRegistry::Get();
329
330 for(const auto& preferredMimeType : GetServiceConfig().GetPreferredAudioFormats())
331 {
332 auto config = GetServiceConfig().GetExportConfig(preferredMimeType);
334 auto pluginIt = std::find_if(registry.begin(), registry.end(), [&](auto t)
335 {
336 auto [plugin, formatIndex] = t;
337 parameters.clear();
338 return hasMimeType(plugin->GetMimeTypes(formatIndex), preferredMimeType) &&
339 plugin->ParseConfig(formatIndex, config, parameters);
340 });
341
342 if(pluginIt == registry.end())
343 continue;
344
345 const auto [plugin, formatIndex] = *pluginIt;
346
347 const auto formatInfo = plugin->GetFormatInfo(formatIndex);
348 const auto path = GenerateTempPath(formatInfo.extensions[0]);
349
350 if(path.empty())
351 continue;
352
353 mExportProgressUpdater = std::make_unique<ExportProgressUpdater>(*this);
354
355 auto builder = ExportTaskBuilder{}
356 .SetParameters(parameters)
357 .SetNumChannels(nChannels)
359 .SetPlugin(plugin)
360 .SetFileName(path)
361 .SetRange(t0, t1, false);
362
363 auto result = ExportResult::Error;
365 {
366 auto exportTask = builder.Build(mProject);
367
368 auto f = exportTask.get_future();
369 std::thread(std::move(exportTask), std::ref(*mExportProgressUpdater)).detach();
370
372 {
373 if(f.wait_for(std::chrono::milliseconds(50)) != std::future_status::ready)
374 mExportProgressUpdater->UpdateUI();
375 result = f.get();
376 });
377 });
378
379 mExportProgressUpdater->SetResult(result);
380 const auto success = result == ExportResult::Success;
381 if(!success && wxFileExists(path))
382 wxRemoveFile(path);
383 if(success)
384 return path;
385 }
386 return {};
387}
const auto tracks
static ExportPluginRegistry & Get()
std::vector< std::tuple< ExportOptionID, ExportValue > > Parameters
Definition: ExportPlugin.h:93
ExportTaskBuilder & SetPlugin(const ExportPlugin *plugin, int format=0) noexcept
Definition: Export.cpp:59
ExportTaskBuilder & SetParameters(ExportProcessor::Parameters parameters) noexcept
Definition: Export.cpp:47
ExportTaskBuilder & SetNumChannels(unsigned numChannels) noexcept
Definition: Export.cpp:53
ExportTaskBuilder & SetSampleRate(double sampleRate) noexcept
Definition: Export.cpp:72
ExportTaskBuilder & SetFileName(const wxFileName &filename)
Definition: Export.cpp:33
ExportTaskBuilder & SetRange(double t0, double t1, bool selectedOnly=false) noexcept
Definition: Export.cpp:39
static ProjectRate & Get(AudacityProject &project)
Definition: ProjectRate.cpp:28
static TrackList & Get(AudacityProject &project)
Definition: Track.cpp:347
rapidjson::Document GetExportConfig(const std::string &exporterName) const
Export configuration suitable for the mime type provided.
std::unique_ptr< ExportProgressUpdater > mExportProgressUpdater
void ExceptionWrappedCall(Callable callable)
double GetRate(const Track &track)
Definition: TimeTrack.cpp:196
const ServiceConfig & GetServiceConfig()
Returns the instance of the ServiceConfig.

References cloud::audiocom::anonymous_namespace{ShareAudioDialog.cpp}::CalculateChannels(), Error, ExportProgressUI::ExceptionWrappedCall(), cloud::audiocom::anonymous_namespace{ShareAudioDialog.cpp}::GenerateTempPath(), ExportPluginRegistry::Get(), ProjectRate::Get(), TrackList::Get(), cloud::audiocom::ServiceConfig::GetExportConfig(), anonymous_namespace{TimeTrack.cpp}::GetRate(), cloud::audiocom::GetServiceConfig(), mExportProgressUpdater, mProject, ExportTaskBuilder::SetFileName(), ExportTaskBuilder::SetNumChannels(), ExportTaskBuilder::SetParameters(), ExportTaskBuilder::SetPlugin(), ExportTaskBuilder::SetRange(), ExportTaskBuilder::SetSampleRate(), Success, and tracks.

Referenced by StartUploadProcess().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ HandleExportFailure()

void cloud::audiocom::ShareAudioDialog::HandleExportFailure ( )
private

Definition at line 503 of file ShareAudioDialog.cpp.

504{
505 EndModal(wxID_ABORT);
506
508 {}, XO("Export error"),
509 XO("We are unable to prepare this file for uploading."), {},
511}
void ShowErrorDialog(const WindowPlacement &placement, const TranslatableString &dlogTitle, const TranslatableString &message, const ManualPageID &helpPage, const ErrorDialogOptions &options={})
Show an error dialog with a link to the manual for further help.
Definition: BasicUI.h:262
Options for variations of error dialogs; the default is for modal dialogs.
Definition: BasicUI.h:52

References BasicUI::ModalError, BasicUI::ShowErrorDialog(), and XO().

Referenced by StartUploadProcess().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ HandleUploadFailed()

void cloud::audiocom::ShareAudioDialog::HandleUploadFailed ( const UploadFailedPayload payload)
private

Definition at line 474 of file ShareAudioDialog.cpp.

475{
476 EndModal(wxID_ABORT);
477
478 TranslatableString message;
479
480 if (!payload.message.empty())
481 {
482 auto details = payload.message;
483
484 for (auto& err : payload.additionalErrors)
485 details += " " + err.second;
486
487 message = XO("Error: %s").Format(details);
488 }
489 else
490 {
491 message = XO(
492 "We are unable to upload this file. Please try again and make sure to link to your audio.com account before uploading.");
493 }
494
496 {}, XO("Upload error"),
497 message,
498 {},
500
501}
Holds a msgid for the translation catalog; may also bind format arguments.

References cloud::audiocom::UploadFailedPayload::additionalErrors, cloud::audiocom::UploadFailedPayload::message, BasicUI::ModalError, BasicUI::ShowErrorDialog(), and XO().

Here is the call graph for this function:

◆ HandleUploadSucceeded()

void cloud::audiocom::ShareAudioDialog::HandleUploadSucceeded ( const UploadSuccessfulPayload payload)
private

Definition at line 467 of file ShareAudioDialog.cpp.

469{
470 EndModal(wxID_CLOSE);
471 OpenInDefaultBrowser(wxString { payload.audioUrl });
472}
bool OpenInDefaultBrowser(const wxString &url)
Open an URL in default browser.
Definition: BasicUI.cpp:240

References cloud::audiocom::UploadSuccessfulPayload::audioUrl, and BasicUI::OpenInDefaultBrowser().

Here is the call graph for this function:

◆ OnCancel()

void cloud::audiocom::ShareAudioDialog::OnCancel ( )
private

Definition at line 271 of file ShareAudioDialog.cpp.

272{
273 if (mInProgress)
274 {
275 AudacityMessageDialog dlgMessage(
276 this, XO("Are you sure you want to cancel?"), XO("Cancel upload to Audio.com"),
277 wxYES_NO | wxICON_QUESTION | wxNO_DEFAULT | wxSTAY_ON_TOP);
278
279 const auto result = dlgMessage.ShowModal();
280
281 if (result != wxID_YES)
282 return;
283
284 // If export has started, notify it that it should be canceled
286 mExportProgressUpdater->Cancel();
287 }
288
289
290 // If upload was started - ask it to discard the result.
291 // The result should be discarded even after the upload has finished
292 if (mServices->uploadPromise)
293 mServices->uploadPromise->DiscardResult();
294
295 EndModal(wxID_CANCEL);
296}
Wrap wxMessageDialog so that caption IS translatable.

References mExportProgressUpdater, mInProgress, mServices, and XO().

Referenced by Populate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ OnContinue()

void cloud::audiocom::ShareAudioDialog::OnContinue ( )
private

Definition at line 298 of file ShareAudioDialog.cpp.

299{
301}

References mContinueAction.

Referenced by Populate().

Here is the caller graph for this function:

◆ Populate()

void cloud::audiocom::ShareAudioDialog::Populate ( ShuttleGui s)
private

Definition at line 225 of file ShareAudioDialog.cpp.

226{
229
230 s.StartHorizontalLay(wxEXPAND, 0);
231 {
233 {
234 s.SetBorder(2);
235 s.StartHorizontalLay(wxEXPAND, 0);
236 {
237 s.AddSpace(0, 0, 1);
238
239 mCancelButton = s.AddButton(XXO("&Cancel"));
240 mCancelButton->Bind(wxEVT_BUTTON, [this](auto) { OnCancel(); });
241
242 s.AddSpace(4, 0, 0);
243
244 mContinueButton = s.AddButton(XXO("C&ontinue"));
245 mContinueButton->Bind(wxEVT_BUTTON, [this](auto) { OnContinue(); });
246 }
248 }
250 }
252
253 const auto title = mProject.GetProjectName();
254
255 if (!title.empty())
256 {
258 mInitialStatePanel.trackTitle->SetInsertionPoint(title.length());
259 }
260
262
264 wxEVT_TEXT,
265 [this](auto&) {
266 mContinueButton->Enable(
268 });
269}
XXO("&Cut/Copy/Paste Toolbar")
static const auto title
const wxString & GetProjectName() const
Definition: Project.cpp:100
void SetBorder(int Border)
Definition: ShuttleGui.h:495
void EndInvisiblePanel()
wxPanel * StartInvisiblePanel(int border=0)
wxButton * AddButton(const TranslatableString &Text, int PositionFlags=wxALIGN_CENTRE, bool setDefault=false)
Definition: ShuttleGui.cpp:362
void EndHorizontalLay()
void StartHorizontalLay(int PositionFlags=wxALIGN_CENTRE, int iProp=1)
wxSizerItem * AddSpace(int width, int height, int prop=0)
struct cloud::audiocom::ShareAudioDialog::ProgressPanel mProgressPanel

References ShuttleGuiBase::AddButton(), ShuttleGui::AddSpace(), ShuttleGuiBase::EndHorizontalLay(), ShuttleGuiBase::EndInvisiblePanel(), AudacityProject::GetProjectName(), cloud::audiocom::ShareAudioDialog::InitialStatePanel::HasValidTitle(), mCancelButton, mContinueButton, mInitialStatePanel, mIsAuthorised, mProgressPanel, mProject, OnCancel(), OnContinue(), cloud::audiocom::ShareAudioDialog::InitialStatePanel::PopulateInitialStatePanel(), cloud::audiocom::ShareAudioDialog::ProgressPanel::PopulateProgressPanel(), ShuttleGuiBase::SetBorder(), ShuttleGuiBase::StartHorizontalLay(), ShuttleGuiBase::StartInvisiblePanel(), title, cloud::audiocom::ShareAudioDialog::InitialStatePanel::trackTitle, and XXO().

Here is the call graph for this function:

◆ ResetProgress()

void cloud::audiocom::ShareAudioDialog::ResetProgress ( )
private

Definition at line 513 of file ShareAudioDialog.cpp.

514{
515 mStageStartTime = Clock::now();
517
518 mProgressPanel.elapsedTime->SetLabel(" 00:00:00");
519 mProgressPanel.remainingTime->SetLabel(" 00:00:00");
520 mProgressPanel.progress->SetValue(0);
521
523
525
527}
void Yield()
Dispatch waiting events, including actions enqueued by CallAfter.
Definition: BasicUI.cpp:219

References BasicUI::Yield().

Referenced by StartUploadProcess().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ StartUploadProcess()

void cloud::audiocom::ShareAudioDialog::StartUploadProcess ( )
private

Definition at line 389 of file ShareAudioDialog.cpp.

390{
391 mInProgress = true;
392
393 mInitialStatePanel.root->Hide();
394 mProgressPanel.root->Show();
395
396 mProgressPanel.info->Hide();
397
398 mContinueButton->Hide();
399
400 Layout();
401 Fit();
402
404
406
407 if(mFilePath.empty())
408 {
411 {
413 }
414
415 return;
416 }
417
418 mProgressPanel.title->SetLabel(XO("Uploading audio...").Translation());
420
421 mServices->uploadPromise = mServices->uploadService.Upload(
422 mFilePath,
424 false,
425 [this](const auto& result)
426 {
427 CallAfter(
428 [this, result]()
429 {
430 mInProgress = false;
431
432 if (result.result == UploadOperationCompleted::Result::Success)
433 {
434 // Success indicates that UploadSuccessfulPayload is in the payload
435 assert(std::holds_alternative<UploadSuccessfulPayload>(result.payload));
436
437 if (
438 auto payload =
439 std::get_if<UploadSuccessfulPayload>(&result.payload))
440 HandleUploadSucceeded(*payload);
441 else
442 HandleUploadSucceeded({});
443
444 }
445 else if (
446 result.result != UploadOperationCompleted::Result::Aborted)
447 {
448 if (
449 auto payload =
450 std::get_if<UploadFailedPayload>(&result.payload))
451 HandleUploadFailed(*payload);
452 else
453 HandleUploadFailed({});
454 }
455 });
456 },
457 [this](auto current, auto total)
458 {
459 CallAfter(
460 [this, current, total]()
461 {
462 UpdateProgress(current, total);
463 });
464 });
465}
void UpdateProgress(uint64_t current, uint64_t total)
void CallAfter(Action action)
Schedule an action to be done later, and in the main thread.
Definition: BasicUI.cpp:208

References Cancelled, ExportProject(), cloud::audiocom::ShareAudioDialog::InitialStatePanel::GetTrackTitle(), HandleExportFailure(), cloud::audiocom::ShareAudioDialog::ProgressPanel::info, mContinueButton, mExportProgressUpdater, mFilePath, mInitialStatePanel, mInProgress, mProgressPanel, mServices, ResetProgress(), cloud::audiocom::ShareAudioDialog::InitialStatePanel::root, cloud::audiocom::ShareAudioDialog::ProgressPanel::root, cloud::audiocom::ShareAudioDialog::ProgressPanel::title, and XO().

Here is the call graph for this function:

◆ UpdateProgress()

void cloud::audiocom::ShareAudioDialog::UpdateProgress ( uint64_t  current,
uint64_t  total 
)
private

Definition at line 541 of file ShareAudioDialog.cpp.

542{
543 using namespace std::chrono;
544
545 const auto now = Clock::now();
546
547 if (current == 0)
548 return;
549
550 if (current > total)
551 current = total;
552
553 if (mLastProgressValue != current)
554 {
555 constexpr int scale = 10000;
556
557 mLastProgressValue = static_cast<int>(current);
558
559 mProgressPanel.progress->SetRange(scale);
560 mProgressPanel.progress->SetValue((current * scale) / total);
561
562 if (current == total && mServices->uploadPromise)
563 {
565 mProgressPanel.title->SetLabel(XO("Finalizing upload...").Translation());
566 }
567 }
568
569 const auto elapsedSinceUIUpdate = now - mLastUIUpdateTime;
570
571 constexpr auto uiUpdateTimeout = 500ms;
572
573 if (elapsedSinceUIUpdate < uiUpdateTimeout && current < total)
574 return;
575
576 mLastUIUpdateTime = now;
577
578 const auto elapsed = duration_cast<milliseconds>(now - mStageStartTime);
579
581
582 const auto estimate = elapsed * total / current;
583 const auto remains = estimate - elapsed;
584
587 std::chrono::duration_cast<std::chrono::milliseconds>(remains));
588}
void SetTimeLabel(wxStaticText *label, std::chrono::milliseconds time)

References cloud::audiocom::anonymous_namespace{ShareAudioDialog.cpp}::SetTimeLabel(), and XO().

Referenced by cloud::audiocom::ShareAudioDialog::ExportProgressUpdater::UpdateUI().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ mCancelButton

wxButton* cloud::audiocom::ShareAudioDialog::mCancelButton { nullptr }
private

Definition at line 110 of file ShareAudioDialog.h.

Referenced by Populate().

◆ mContinueAction

std::function<void()> cloud::audiocom::ShareAudioDialog::mContinueAction
private

Definition at line 126 of file ShareAudioDialog.h.

Referenced by OnContinue().

◆ mContinueButton

wxButton* cloud::audiocom::ShareAudioDialog::mContinueButton { nullptr }
private

Definition at line 109 of file ShareAudioDialog.h.

Referenced by Populate(), and StartUploadProcess().

◆ mExportProgressUpdater

std::unique_ptr<ExportProgressUpdater> cloud::audiocom::ShareAudioDialog::mExportProgressUpdater
private

Definition at line 116 of file ShareAudioDialog.h.

Referenced by ExportProject(), OnCancel(), and StartUploadProcess().

◆ mFilePath

wxString cloud::audiocom::ShareAudioDialog::mFilePath
private

Definition at line 124 of file ShareAudioDialog.h.

Referenced by StartUploadProcess(), and ~ShareAudioDialog().

◆ mInitialStatePanel

struct cloud::audiocom::ShareAudioDialog::InitialStatePanel cloud::audiocom::ShareAudioDialog::mInitialStatePanel
private

Referenced by Populate(), and StartUploadProcess().

◆ mInProgress

bool cloud::audiocom::ShareAudioDialog::mInProgress { false }
private

Definition at line 129 of file ShareAudioDialog.h.

Referenced by OnCancel(), and StartUploadProcess().

◆ mIsAuthorised

bool cloud::audiocom::ShareAudioDialog::mIsAuthorised { false }
private

Definition at line 128 of file ShareAudioDialog.h.

Referenced by Populate().

◆ mLastProgressValue

int cloud::audiocom::ShareAudioDialog::mLastProgressValue { 0 }
private

Definition at line 122 of file ShareAudioDialog.h.

◆ mLastUIUpdateTime

Clock::time_point cloud::audiocom::ShareAudioDialog::mLastUIUpdateTime
private

Definition at line 121 of file ShareAudioDialog.h.

◆ mProgressPanel

struct cloud::audiocom::ShareAudioDialog::ProgressPanel cloud::audiocom::ShareAudioDialog::mProgressPanel
private

Referenced by Populate(), and StartUploadProcess().

◆ mProject

AudacityProject& cloud::audiocom::ShareAudioDialog::mProject
private

Definition at line 62 of file ShareAudioDialog.h.

Referenced by ExportProject(), and Populate().

◆ mServices

std::unique_ptr<Services> cloud::audiocom::ShareAudioDialog::mServices
private

Definition at line 113 of file ShareAudioDialog.h.

Referenced by OnCancel(), and StartUploadProcess().

◆ mStageStartTime

Clock::time_point cloud::audiocom::ShareAudioDialog::mStageStartTime
private

Definition at line 120 of file ShareAudioDialog.h.


The documentation for this class was generated from the following files: