llviewermedia_streamingaudio.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:4k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llviewermedia_streamingaudio.h
  3.  * @author Tofu Linden, Sam Kolb
  4.  * @brief LLStreamingAudio_MediaPlugins implementation - an implementation of the streaming audio interface which is implemented as a client of the media plugin API.
  5.  *
  6.  * $LicenseInfo:firstyear=2009&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2009-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  */
  33. #include "llviewerprecompiledheaders.h"
  34. #include "linden_common.h"
  35. #include "llpluginclassmedia.h"
  36. #include "llpluginclassmediaowner.h"
  37. #include "llviewermedia.h"
  38. #include "llviewermedia_streamingaudio.h"
  39. #include "llmimetypes.h"
  40. #include "llvfs.h"
  41. #include "lldir.h"
  42. LLStreamingAudio_MediaPlugins::LLStreamingAudio_MediaPlugins() :
  43. mMediaPlugin(NULL),
  44. mGain(1.0)
  45. {
  46. // nothing interesting to do?
  47. // we will lazily create a media plugin at play-time, if none exists.
  48. }
  49. LLStreamingAudio_MediaPlugins::~LLStreamingAudio_MediaPlugins()
  50. {
  51. delete mMediaPlugin;
  52. mMediaPlugin = NULL;
  53. }
  54. void LLStreamingAudio_MediaPlugins::start(const std::string& url)
  55. {
  56. if (!mMediaPlugin) // lazy-init the underlying media plugin
  57. {
  58. mMediaPlugin = initializeMedia("audio/mpeg"); // assumes that whatever media implementation supports mp3 also supports vorbis.
  59. llinfos << "streaming audio mMediaPlugin is now " << mMediaPlugin << llendl;
  60. }
  61. if(!mMediaPlugin)
  62. return;
  63. if (!url.empty()) {
  64. llinfos << "Starting internet stream: " << url << llendl;
  65. mURL = url;
  66. mMediaPlugin->loadURI ( url );
  67. mMediaPlugin->start();
  68. llinfos << "Playing stream..." << llendl;
  69. } else {
  70. llinfos << "setting stream to NULL"<< llendl;
  71. mURL.clear();
  72. mMediaPlugin->stop();
  73. }
  74. }
  75. void LLStreamingAudio_MediaPlugins::stop()
  76. {
  77. llinfos << "Stopping internet stream." << llendl;
  78. if(mMediaPlugin)
  79. {
  80. mMediaPlugin->stop();
  81. }
  82. mURL.clear();
  83. }
  84. void LLStreamingAudio_MediaPlugins::pause(int pause)
  85. {
  86. if(!mMediaPlugin)
  87. return;
  88. if(pause)
  89. {
  90. llinfos << "Pausing internet stream." << llendl;
  91. mMediaPlugin->pause();
  92. else 
  93. {
  94. llinfos << "Unpausing internet stream." << llendl;
  95. mMediaPlugin->start();
  96. }
  97. }
  98. void LLStreamingAudio_MediaPlugins::update()
  99. {
  100. if (mMediaPlugin)
  101. mMediaPlugin->idle();
  102. }
  103. int LLStreamingAudio_MediaPlugins::isPlaying()
  104. {
  105. if (!mMediaPlugin)
  106. return 0; // stopped
  107. LLPluginClassMediaOwner::EMediaStatus status =
  108. mMediaPlugin->getStatus();
  109. switch (status)
  110. {
  111. case LLPluginClassMediaOwner::MEDIA_LOADING: // but not MEDIA_LOADED
  112. case LLPluginClassMediaOwner::MEDIA_PLAYING:
  113. return 1; // Active and playing
  114. case LLPluginClassMediaOwner::MEDIA_PAUSED:
  115. return 2; // paused
  116. default:
  117. return 0; // stopped
  118. }
  119. }
  120. void LLStreamingAudio_MediaPlugins::setGain(F32 vol)
  121. {
  122. mGain = vol;
  123. if(!mMediaPlugin)
  124. return;
  125. vol = llclamp(vol, 0.f, 1.f);
  126. mMediaPlugin->setVolume(vol);
  127. }
  128. F32 LLStreamingAudio_MediaPlugins::getGain()
  129. {
  130. return mGain;
  131. }
  132. std::string LLStreamingAudio_MediaPlugins::getURL()
  133. {
  134. return mURL;
  135. }
  136. LLPluginClassMedia* LLStreamingAudio_MediaPlugins::initializeMedia(const std::string& media_type)
  137. {
  138. LLPluginClassMediaOwner* owner = NULL;
  139. S32 default_size = 1; // audio-only - be minimal, doesn't matter
  140. LLPluginClassMedia* media_source = LLViewerMediaImpl::newSourceFromMediaType(media_type, owner, default_size, default_size);
  141. if (media_source)
  142. {
  143. media_source->setLoop(false); // audio streams are not expected to loop
  144. }
  145. return media_source;
  146. }