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

struct  ExportProgressHelper
 
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 ()
 
void OnClose ()
 
wxString ExportProject ()
 
void StartUploadProcess ()
 
void HandleUploadSucceeded (std::string_view finishUploadURL, std::string_view audioSlug)
 
void HandleUploadFailed (std::string_view errorMessage)
 
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 }
 
wxButton * mCloseButton { nullptr }
 
wxButton * mGotoButton { nullptr }
 
std::unique_ptr< ServicesmServices
 
std::unique_ptr< BasicUI::ProgressDialogmExportProgressHelper
 
Clock::time_point mStageStartTime
 
Clock::time_point mLastUIUpdateTime
 
int mLastProgressValue { 0 }
 
wxString mFilePath
 
std::function< void()> mContinueAction
 
bool mInProgress { false }
 

Detailed Description

Definition at line 40 of file ShareAudioDialog.h.

Member Typedef Documentation

◆ Clock

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

Definition at line 120 of file ShareAudioDialog.h.

Constructor & Destructor Documentation

◆ ShareAudioDialog()

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

Definition at line 173 of file ShareAudioDialog.cpp.

175 parent, wxID_ANY, XO("Share Audio"), wxDefaultPosition, { 480, 250 },
176 wxDEFAULT_DIALOG_STYLE)
177 , mProject(project)
178 , mServices(std::make_unique<Services>())
179{
181
182 ShuttleGui s(this, eIsCreating);
183
184 s.StartVerticalLay();
185 {
186 Populate(s);
187 }
188 s.EndVerticalLay();
189
190 Layout();
191 Fit();
192 Centre();
193
194 const auto size = GetSize();
195
196 SetMinSize({ size.x, std::min(250, size.y) });
197 SetMaxSize({ size.x, -1 });
198
199 mContinueAction = [this]()
200 {
201 if (mInitialStatePanel.root->IsShown())
203 };
204
205 Bind(
206 wxEVT_CHAR_HOOK,
207 [this](auto& evt)
208 {
209 if (!IsEscapeKey(evt))
210 {
211 evt.Skip();
212 return;
213 }
214
215 if (mCancelButton->IsShown())
216 OnCancel();
217 else
218 OnClose();
219 });
220}
int min(int a, int b)
XO("Cut/Copy/Paste")
@ eIsCreating
Definition: ShuttleGui.h:39
Derived from ShuttleGuiBase, an Audacity specific class for shuttling data to and from GUI.
Definition: ShuttleGui.h:628
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 222 of file ShareAudioDialog.cpp.

223{
225 // Clean up the temp file when the dialog is closed
226 if (!mFilePath.empty() && wxFileExists(mFilePath))
227 wxRemoveFile(mFilePath);
228}

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 310 of file ShareAudioDialog.cpp.

311{
312 mExportProgressHelper = std::make_unique<ExportProgressHelper>(*this);
313
314 auto exporter = CreatePreferredExporter(GetServiceConfig().GetPreferredAudioFormats(), mProject);
315
316 if (!exporter)
317 return {};
318
319 const auto path = GenerateTempPath(exporter->GetFileExtension());
320
321 if (path.empty())
322 return {};
323
324
326 exporter->OnBeforeExport();
327
328 auto cleanupExporter = finally([&]() { exporter->OnAfterExport(); });
329
330 Exporter e { const_cast<AudacityProject&>(mProject) };
331
332 auto& tracks = TrackList::Get(mProject);
333
334 const double t0 = 0.0;
335 const double t1 = tracks.GetEndTime();
336
337 const int nChannels = (tracks.Any() - &Track::IsLeader).empty() ? 1 : 2;
338
339 const bool success = e.Process(
340 nChannels, // numChannels,
341 exporter->GetExporterID(), // type,
342 path, // full path,
343 false, // selectedOnly,
344 t0, // t0
345 t1, // t1
346 mExportProgressHelper // progress dialog
347 );
348
349 if (!success && wxFileExists(path))
350 // Try to remove the file if exporting has failed (or was canceled)
351 wxRemoveFile(path);
352
353 return success ? path : wxString {};
354}
static TransactionScope::Factory::Scope scope
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
Definition: Project.h:90
Makes temporary changes to preferences, then rolls them back at destruction.
Definition: Prefs.h:115
bool IsLeader() const
Definition: Track.cpp:405
static TrackList & Get(AudacityProject &project)
Definition: Track.cpp:486
std::unique_ptr< BasicUI::ProgressDialog > mExportProgressHelper
const ServiceConfig & GetServiceConfig()
Returns the instance of the ServiceConfig.
std::unique_ptr< cloud::CloudExporterPlugin > CreatePreferredExporter(const MimeTypesList &mimeTypes, const AudacityProject &project)

References cloud::CreatePreferredExporter(), cloud::audiocom::anonymous_namespace{ShareAudioDialog.cpp}::GenerateTempPath(), TrackList::Get(), cloud::audiocom::GetServiceConfig(), Track::IsLeader(), mExportProgressHelper, mProject, and scope.

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 478 of file ShareAudioDialog.cpp.

479{
480 EndModal(wxID_ABORT);
481
483 {}, XO("Export error"),
484 XO("We are unable to prepare this file for uploading."), {},
486}
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:254
Options for variations of error dialogs; the default is for modal dialogs.
Definition: BasicUI.h:49

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 ( std::string_view  errorMessage)
private

Definition at line 466 of file ShareAudioDialog.cpp.

467{
468 EndModal(wxID_ABORT);
469
471 {}, XO("Upload error"),
472 XO("We are unable to upload this file. Please try again and make sure to link to your audio.com account before uploading."),
473 {},
475 audacity::ToWString(errorMessage)));
476}
std::wstring ToWString(const std::string &str)

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

Here is the call graph for this function:

◆ HandleUploadSucceeded()

void cloud::audiocom::ShareAudioDialog::HandleUploadSucceeded ( std::string_view  finishUploadURL,
std::string_view  audioSlug 
)
private

Definition at line 416 of file ShareAudioDialog.cpp.

418{
420 mProgressPanel.title->SetLabel(XO("Upload complete!").Translation());
421 mProgressPanel.info->Show();
422 mProgressPanel.info->SetLabel(
423 mInitialStatePanel.isPublic->GetValue() ? publicDescriptionText.Translation() :
424 unlistedDescriptionText.Translation());
425
426 if (!GetOAuthService().HasAccessToken())
427 {
428 mProgressPanel.info->SetLabel(
429 "By pressing continue, you will be taken to audio.com and given a shareable link.");
430 mProgressPanel.info->Wrap(mProgressPanel.root->GetSize().GetWidth());
431
432 mContinueAction = [this, url = std::string(finishUploadURL)]()
433 {
434 EndModal(wxID_CLOSE);
435 OpenInDefaultBrowser({ url });
436 };
437
438 mContinueButton->Show();
439 }
440 else
441 {
442 auto shareableLink = wxString::Format(
443 "https://audio.com/%s/%s", GetUserService().GetUserSlug(),
444 audacity::ToWXString(audioSlug));
445
446 mGotoButton->Show();
447 mCloseButton->Show();
448 mCancelButton->Hide();
449
450 mGotoButton->Bind(
451 wxEVT_BUTTON,
452 [this, url = shareableLink](auto)
453 {
454 EndModal(wxID_CLOSE);
455 OpenInDefaultBrowser({ url });
456 });
457
458 mProgressPanel.link->SetValue(shareableLink);
460 }
461
462 Layout();
463 Fit();
464}
void OpenInDefaultBrowser(const URLString &link)
Definition: HelpSystem.cpp:527
struct cloud::audiocom::ShareAudioDialog::ProgressPanel mProgressPanel
wxString ToWXString(const std::string &str)
OAuthService & GetOAuthService()
Returns the instance of the OAuthService.
UserService & GetUserService()

References cloud::audiocom::GetOAuthService(), cloud::audiocom::GetUserService(), OpenInDefaultBrowser(), cloud::audiocom::anonymous_namespace{ShareAudioDialog.cpp}::publicDescriptionText, audacity::ToWXString(), cloud::audiocom::anonymous_namespace{ShareAudioDialog.cpp}::unlistedDescriptionText, and XO().

Here is the call graph for this function:

◆ OnCancel()

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

Definition at line 269 of file ShareAudioDialog.cpp.

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

References cloud::audiocom::ShareAudioDialog::ExportProgressHelper::Cancel(), mExportProgressHelper, mInProgress, mServices, and XO().

Referenced by Populate().

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

◆ OnClose()

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

Definition at line 304 of file ShareAudioDialog.cpp.

305{
306 EndModal(wxID_CLOSE);
307}

Referenced by Populate().

Here is the caller graph for this function:

◆ OnContinue()

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

Definition at line 299 of file ShareAudioDialog.cpp.

300{
302}

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 230 of file ShareAudioDialog.cpp.

231{
234
235 s.StartHorizontalLay(wxEXPAND, 0);
236 {
238 {
239 s.SetBorder(2);
240 s.StartHorizontalLay(wxEXPAND, 0);
241 {
242 s.AddSpace(0, 0, 1);
243
244 mCancelButton = s.AddButton(XXO("&Cancel"));
245 mCancelButton->Bind(wxEVT_BUTTON, [this](auto) { OnCancel(); });
246
247 mCloseButton = s.AddButton(XXO("&Close"));
248 mCloseButton->Bind(wxEVT_BUTTON, [this](auto) { OnClose(); });
249
250 s.AddSpace(4, 0, 0);
251
252 mContinueButton = s.AddButton(XXO("C&ontinue"));
253 mContinueButton->Bind(wxEVT_BUTTON, [this](auto) { OnContinue(); });
254
255 mGotoButton = s.AddButton(XXO("&Go to my file"));
256 }
258 }
260 }
262
263 // This two buttons are only used in the end of
264 // authorised upload flow
265 mGotoButton->Hide();
266 mCloseButton->Hide();
267}
XXO("&Cut/Copy/Paste Toolbar")
void SetBorder(int Border)
Definition: ShuttleGui.h:486
void EndInvisiblePanel()
wxPanel * StartInvisiblePanel(int border=0)
wxButton * AddButton(const TranslatableString &Text, int PositionFlags=wxALIGN_CENTRE, bool setDefault=false)
Definition: ShuttleGui.cpp:361
void EndHorizontalLay()
void StartHorizontalLay(int PositionFlags=wxALIGN_CENTRE, int iProp=1)
wxSizerItem * AddSpace(int width, int height, int prop=0)

References ShuttleGuiBase::AddButton(), ShuttleGui::AddSpace(), ShuttleGuiBase::EndHorizontalLay(), ShuttleGuiBase::EndInvisiblePanel(), mCancelButton, mCloseButton, mContinueButton, mGotoButton, mInitialStatePanel, mProgressPanel, OnCancel(), OnClose(), OnContinue(), cloud::audiocom::ShareAudioDialog::InitialStatePanel::PopulateInitialStatePanel(), cloud::audiocom::ShareAudioDialog::ProgressPanel::PopulateProgressPanel(), ShuttleGuiBase::SetBorder(), ShuttleGuiBase::StartHorizontalLay(), ShuttleGuiBase::StartInvisiblePanel(), and XXO().

Here is the call graph for this function:

◆ ResetProgress()

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

Definition at line 488 of file ShareAudioDialog.cpp.

489{
490 mStageStartTime = Clock::now();
492
493 mProgressPanel.elapsedTime->SetLabel(" 00:00:00");
494 mProgressPanel.remainingTime->SetLabel(" 00:00:00");
495 mProgressPanel.progress->SetValue(0);
496
498
500}
void Yield()
Dispatch waiting events, including actions enqueued by CallAfter.
Definition: BasicUI.cpp:217

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 356 of file ShareAudioDialog.cpp.

357{
358 mInProgress = true;
359
360 mInitialStatePanel.root->Hide();
361 mProgressPanel.root->Show();
362
364 mProgressPanel.info->Hide();
365
366 mContinueButton->Hide();
367
368 Layout();
369 Fit();
370
372
374
375 if (mFilePath.empty())
376 {
377 if (!static_cast<ExportProgressHelper&>(*mExportProgressHelper)
378 .WasCancelled())
379 {
381 }
382
383 return;
384 }
385
386 mProgressPanel.title->SetLabel(XO("Uploading audio...").Translation());
388
389 mServices->uploadPromise = mServices->uploadService.Upload(
390 mFilePath,
392 mInitialStatePanel.isPublic->GetValue(),
393 [this](const auto& result)
394 {
395 CallAfter(
396 [this, result]()
397 {
398 mInProgress = false;
399
400 if (result.result == UploadOperationCompleted::Result::Success)
401 HandleUploadSucceeded(result.finishUploadURL, result.audioSlug);
402 else if (result.result != UploadOperationCompleted::Result::Aborted)
403 HandleUploadFailed(result.errorMessage);
404 });
405 },
406 [this](auto current, auto total)
407 {
408 CallAfter(
409 [this, current, total]()
410 {
411 UpdateProgress(current, total);
412 });
413 });
414}
const wxString & GetProjectName() const
Definition: Project.cpp:100
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:206

References ExportProject(), AudacityProject::GetProjectName(), HandleExportFailure(), cloud::audiocom::ShareAudioDialog::ProgressPanel::info, cloud::audiocom::ShareAudioDialog::InitialStatePanel::isPublic, cloud::audiocom::ShareAudioDialog::ProgressPanel::linkPanel, mContinueButton, mExportProgressHelper, mFilePath, mInitialStatePanel, mInProgress, mProgressPanel, mProject, 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 514 of file ShareAudioDialog.cpp.

515{
516 using namespace std::chrono;
517
518 const auto now = Clock::now();
519
520 if (current == 0)
521 return;
522
523 if (current > total)
524 current = total;
525
526 if (mLastProgressValue != current)
527 {
528 constexpr int scale = 10000;
529
530 mLastProgressValue = static_cast<int>(current);
531
532 mProgressPanel.progress->SetRange(scale);
533 mProgressPanel.progress->SetValue((current * scale) / total);
534
535 if (current == total && mServices->uploadPromise)
536 {
538 mProgressPanel.title->SetLabel(XO("Finalizing upload...").Translation());
539 }
540 }
541
542 const auto elapsedSinceUIUpdate = now - mLastUIUpdateTime;
543
544 constexpr auto uiUpdateTimeout = 500ms;
545
546 if (elapsedSinceUIUpdate < uiUpdateTimeout && current < total)
547 return;
548
549 mLastUIUpdateTime = now;
550
551 const auto elapsed = duration_cast<milliseconds>(now - mStageStartTime);
552
554
555 const auto estimate = elapsed * total / current;
556 const auto remains = estimate - elapsed;
557
560 std::chrono::duration_cast<std::chrono::milliseconds>(remains));
561}
void SetTimeLabel(wxStaticText *label, std::chrono::milliseconds time)

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

Referenced by cloud::audiocom::ShareAudioDialog::ExportProgressHelper::Poll().

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().

◆ mCloseButton

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

Definition at line 111 of file ShareAudioDialog.h.

Referenced by Populate().

◆ mContinueAction

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

Definition at line 128 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().

◆ mExportProgressHelper

std::unique_ptr<BasicUI::ProgressDialog> cloud::audiocom::ShareAudioDialog::mExportProgressHelper
private

Definition at line 118 of file ShareAudioDialog.h.

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

◆ mFilePath

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

Definition at line 126 of file ShareAudioDialog.h.

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

◆ mGotoButton

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

Definition at line 112 of file ShareAudioDialog.h.

Referenced by Populate().

◆ 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 130 of file ShareAudioDialog.h.

Referenced by OnCancel(), and StartUploadProcess().

◆ mLastProgressValue

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

Definition at line 124 of file ShareAudioDialog.h.

◆ mLastUIUpdateTime

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

Definition at line 123 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 64 of file ShareAudioDialog.h.

Referenced by ExportProject(), and StartUploadProcess().

◆ mServices

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

Definition at line 115 of file ShareAudioDialog.h.

Referenced by OnCancel(), and StartUploadProcess().

◆ mStageStartTime

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

Definition at line 122 of file ShareAudioDialog.h.


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