mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 20:26:43 +00:00 
			
		
		
		
	Added stream capability to Audiere input
This commit is contained in:
		
							parent
							
								
									d763b9dbb6
								
							
						
					
					
						commit
						abee2689e3
					
				
					 4 changed files with 67 additions and 6 deletions
				
			
		|  | @ -1,6 +1,8 @@ | |||
| #include "input_audiere.h" | ||||
| #include <assert.h> | ||||
| 
 | ||||
| #include "../../stream/imp_client/audiere_file.h" | ||||
| 
 | ||||
| // Exception handling
 | ||||
| class Audiere_Exception : public std::exception | ||||
| { | ||||
|  | @ -25,14 +27,14 @@ using namespace Mangle::Sound; | |||
| 
 | ||||
| AudiereInput::AudiereInput() | ||||
| { | ||||
|   canLoadStream = false; | ||||
|   canLoadStream = true; | ||||
| } | ||||
| 
 | ||||
| InputSource *AudiereInput::load(const std::string &file) | ||||
| { return new AudiereSource(file); } | ||||
| 
 | ||||
| InputSource *AudiereInput::load(Stream::InputStream *input) | ||||
| { assert(0 && "not implemented yet"); } | ||||
| { return new AudiereSource(input); } | ||||
| 
 | ||||
| // --- InputSource ---
 | ||||
| 
 | ||||
|  | @ -45,6 +47,16 @@ AudiereSource::AudiereSource(const std::string &file) | |||
|   buf = CreateSampleBuffer(sample); | ||||
| } | ||||
| 
 | ||||
| AudiereSource::AudiereSource(Stream::InputStream *input) | ||||
| { | ||||
|   SampleSourcePtr sample = OpenSampleSource | ||||
|     (new Stream::AudiereFile(input)); | ||||
|   if(!sample) | ||||
|     fail("Couldn't load stream"); | ||||
| 
 | ||||
|   buf = CreateSampleBuffer(sample);   | ||||
| } | ||||
| 
 | ||||
| InputStream *AudiereSource::getStream() | ||||
| { | ||||
|   return new AudiereStream(buf->openStream()); | ||||
|  |  | |||
|  | @ -28,6 +28,7 @@ class AudiereSource : public InputSource | |||
| 
 | ||||
|  public: | ||||
|   AudiereSource(const std::string &file); | ||||
|   AudiereSource(Stream::InputStream *input); | ||||
|   InputStream *getStream(); | ||||
|   void drop() { delete this; } | ||||
| }; | ||||
|  |  | |||
|  | @ -9,7 +9,7 @@ L_AUDIERE=-laudiere | |||
| ffmpeg_openal_test: ffmpeg_openal_test.cpp ../imp/input_ffmpeg.cpp ../imp/output_openal.cpp | ||||
| 	$(GCC) $^ -o $@ $(L_FFMPEG) $(L_OPENAL) | ||||
| 
 | ||||
| openal_audiere_test: openal_audiere_test.cpp ../imp/input_audiere.cpp ../imp/output_openal.cpp | ||||
| openal_audiere_test: openal_audiere_test.cpp ../imp/input_audiere.cpp ../imp/output_openal.cpp ../../stream/imp_client/audiere_file.cpp | ||||
| 	$(GCC) $^ -o $@ $(L_AUDIERE) $(L_OPENAL) | ||||
| 
 | ||||
| audiere_test: audiere_test.cpp ../imp/audiere_imp.cpp | ||||
|  |  | |||
|  | @ -1,20 +1,67 @@ | |||
| // This file is included directly into the test programs
 | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <fstream> | ||||
| #include <exception> | ||||
| 
 | ||||
| using namespace std; | ||||
| 
 | ||||
| void play(const char* name, bool music=false) | ||||
| class TestStream : public Mangle::Stream::InputStream | ||||
| { | ||||
|   cout << "Playing " << name << "\n"; | ||||
|   ifstream io; | ||||
| 
 | ||||
| public: | ||||
| 
 | ||||
|   TestStream(const char* name) | ||||
|   { | ||||
|     io.open(name, ios::binary); | ||||
|     isSeekable = true; | ||||
|     hasPosition = true; | ||||
|     hasSize = false; | ||||
|   } | ||||
| 
 | ||||
|   size_t read(void* buf, size_t len) | ||||
|   { | ||||
|     io.read((char*)buf, len); | ||||
|     return io.gcount(); | ||||
|   } | ||||
| 
 | ||||
|   void seek(size_t pos) | ||||
|   { | ||||
|     io.seekg(pos); | ||||
|   } | ||||
| 
 | ||||
|   size_t tell() const | ||||
|   { return ((TestStream*)this)->io.tellg(); } | ||||
| 
 | ||||
|   size_t size() const | ||||
|   { return 0; } | ||||
| 
 | ||||
|   bool eof() const | ||||
|   { return io.eof(); } | ||||
| }; | ||||
| 
 | ||||
| void play(const char* name, bool music=false, bool stream=false) | ||||
| { | ||||
|   // Only load streams if the backend supports it
 | ||||
|   if(stream && !mg.canLoadStream) | ||||
|     return; | ||||
| 
 | ||||
|   cout << "Playing " << name; | ||||
|   if(stream) cout << " (from stream)"; | ||||
|   cout << "\n"; | ||||
| 
 | ||||
|   Sound *snd = NULL; | ||||
|   Instance *s = NULL; | ||||
| 
 | ||||
|   try | ||||
|     { | ||||
|       snd = mg.load(name, music); | ||||
|       if(stream) | ||||
|         snd = mg.load(new TestStream(name), music); | ||||
|       else | ||||
|         snd = mg.load(name, music); | ||||
| 
 | ||||
| 
 | ||||
|       s = snd->getInstance(false, false); | ||||
|       s->play(); | ||||
| 
 | ||||
|  | @ -37,5 +84,6 @@ int main() | |||
| { | ||||
|   play("cow.wav"); | ||||
|   play("owl.ogg", true); | ||||
|   play("cow.wav", false, true); | ||||
|   return 0; | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue