Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

105
LINES

< > BotCompany Repo | #1016679 // WAV Decoding Spike

JavaX source code (desktop) [tags: use-pretranspiled] - run with: x30.jar

Download Jar. Libraryless. Click here for Pure Java version (2766L/20K).

1  
!7
2  
3  
p {
4  
	temp WaveDecoder decoder = new(new FileInputStream(loadLibrary(#1400093)));
5  
	float[] samples = new float[1024];
6  
	int readSamples = 0;
7  
	while ((readSamples = decoder.readSamples(samples)) > 0)
8  
		print("read " + readSamples + " samples");
9  
}
10  
11  
12  
// https://github.com/s4l4x/audio-analysis/blob/master/src/com/badlogic/audio/io/WaveDecoder.java
13  
14  
/**
15  
 * A simple class that can read in the PCM data from a
16  
 * Wav file, converting the data to signed 32-bit floats
17  
 * in the range [-1,1], merging stereo channels to a mono
18  
 * channel for processing. This only supports 16-bit signed
19  
 * stereo and mono Wav files with a sampling rate of 44100.
20  
 * 
21  
 * @author mzechner
22  
 *
23  
 */
24  
sclass WaveDecoder /*implements com.badlogic.audio.io.Decoder*/ implements AutoCloseable {
25  
	/** inverse max short value as float **/
26  
	private final float MAX_VALUE = 1.0f / Short.MAX_VALUE;
27  
	
28  
	/** the input stream we read from **/
29  
	EndianDataInputStream in;
30  
	
31  
	/** number of channels **/
32  
	private final int channels;
33  
	
34  
	/** sample rate in Herz**/
35  
	private final float sampleRate;
36  
	
37  
	*(InputStream stream) ctex {
38  
		in = new EndianDataInputStream( new BufferedInputStream( stream, 1024*1024) );		
39  
		if( !in.read4ByteString().equals( "RIFF" ) )
40  
			throw new IllegalArgumentException( "not a wav" );
41  
		
42  
		in.readIntLittleEndian();
43  
		
44  
		if( !in.read4ByteString().equals( "WAVE" ) )
45  
			throw new IllegalArgumentException( "expected WAVE tag" );
46  
		
47  
		if( !in.read4ByteString().equals( "fmt " ) )
48  
			throw new IllegalArgumentException( "expected fmt tag" );
49  
		
50  
		if( in.readIntLittleEndian() != 16 )
51  
			throw new IllegalArgumentException( "expected wave chunk size to be 16" );
52  
		
53  
		if( in.readShortLittleEndian() != 1 )
54  
			throw new IllegalArgumentException( "expected format to be 1" );
55  
		
56  
		channels = in.readShortLittleEndian();
57  
		sampleRate = in.readIntLittleEndian();
58  
		if( sampleRate != 44100 )
59  
			throw new IllegalArgumentException( "Not 44100 sampling rate" );
60  
		in.readIntLittleEndian();
61  
		in.readShortLittleEndian();
62  
		int fmt = in.readShortLittleEndian();
63  
64  
		if( fmt != 16 )
65  
			throw new IllegalArgumentException( "Only 16-bit signed format supported" );
66  
		
67  
		if( !in.read4ByteString().equals( "data" ) )
68  
			throw new RuntimeException( "expected data tag" );
69  
				
70  
		in.readIntLittleEndian();
71  
	}
72  
	
73  
	/**
74  
	 * Tries to read in samples.length samples, merging stereo to a mono
75  
	 * channel by averaging and converting non float formats to float 32-bit.
76  
	 * Returns the number of samples actually read. Guarantees that samples.length
77  
	 * samples are read in if there was enough data in the stream.
78  
	 * 
79  
	 * @param samples The samples array to write the samples to
80  
	 * @return The number of samples actually read.
81  
	 */
82  
	public int readSamples(float[] samples) {
83  
		int readSamples = 0;
84  
		for (int i = 0; i < samples.length; i++) {
85  
			float sample = 0; 
86  
			try {
87  
				for( int j = 0; j < channels; j++ )
88  
				{
89  
					int shortValue = in.readShortLittleEndian( );
90  
					sample += (shortValue * MAX_VALUE);
91  
				}
92  
				sample /= channels;
93  
				samples[i] = sample;
94  
				readSamples++;
95  
			}
96  
			catch (Exception ex) { break; }
97  
		}
98  
		
99  
		ret readSamples; 
100  
	}
101  
	
102  
	public void close() ctex {
103  
	  in.close();
104  
	}
105  
}

download  show line numbers  debug dex  old transpilations   

Travelled to 15 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, irmadwmeruwu, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt

No comments. add comment

Snippet ID: #1016679
Snippet name: WAV Decoding Spike
Eternal ID of this version: #1016679/3
Text MD5: 01abf123185b139f4aad029b5eb702d6
Transpilation MD5: e29c77d565c9d415f0423c5021472ddb
Author: stefan
Category: javax / sound
Type: JavaX source code (desktop)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2018-06-28 00:09:35
Source code size: 3268 bytes / 105 lines
Pitched / IR pitched: No / No
Views / Downloads: 386 / 975
Version history: 2 change(s)
Referenced in: [show references]