Never been to DZone Snippets before?

Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

« Newer Snippets
Older Snippets »
Showing 1-9 of 9 total  RSS 

Java - JMF Simple Filter

import java.awt.Dimension;

import javax.media.Buffer;
import javax.media.Effect;
import javax.media.Format;
import javax.media.ResourceUnavailableException;
import javax.media.format.RGBFormat;

public class SimpleFilter implements Effect
{
	protected Format inputFormat = null;
	protected Format outputFormat = null;
	
	protected Format[] inputFormats = null;
	protected Format[] outputFormats = null;
	
	public AngelMotionCodec()
	{
		inputFormats = new Format[]{ new RGBFormat(null, Format.NOT_SPECIFIED, Format.byteArray, Format.NOT_SPECIFIED, 24, 3, 2, 1, 3, Format.NOT_SPECIFIED, Format.TRUE, Format.NOT_SPECIFIED) };
		outputFormats = new Format[]{ new RGBFormat(null, Format.NOT_SPECIFIED, Format.byteArray, Format.NOT_SPECIFIED, 24, 3, 2, 1, 3, Format.NOT_SPECIFIED, Format.TRUE, Format.NOT_SPECIFIED) };
	}
	
	/****** Codec ******/
	public Format[] getSupportedInputFormats()
	{
		return inputFormats;
	}

	public Format[] getSupportedOutputFormats(Format input)
	{
		if(input != null)
		{
			if(matches(input, inputFormats) != null)
				return new Format[]{ outputFormats[0].intersects(input) };
			else
				return new Format[0];
		}
		
		return outputFormats;
	}

	public int process(Buffer input, Buffer output)
	{
		// Swap tra input & output
		Object tmp = input.getData();
		
		input.setData(output.getData());
		output.setData(tmp);
		
		return BUFFER_PROCESSED_OK;
	}

	public Format setInputFormat(Format input)
	{
		inputFormat = input;
		
		return input;
	}

	public Format setOutputFormat(Format output)
	{
		if(output != null || matches(output, outputFormats) != null)
		{
			RGBFormat inRGB = (RGBFormat) output;
			
			Dimension size = inRGB.getSize();
			int maxDataLength = inRGB.getMaxDataLength();
			int lineStride = inRGB.getLineStride();
			int flipped = inRGB.getFlipped();
			
			if(size == null)
				return null;
			
			if(maxDataLength < size.width*size.height*3)
				maxDataLength = size.width*size.height*3;
			
			if(lineStride < size.width*3)
				lineStride = size.width*3;
			
			if(flipped != Format.FALSE)
				flipped = Format.FALSE;
			
			outputFormat = outputFormats[0].intersects(new RGBFormat(size, maxDataLength, inRGB.getDataType(), inRGB.getFrameRate(), inRGB.getBitsPerPixel(), inRGB.getRedMask(), inRGB.getGreenMask(), inRGB.getBlueMask(), inRGB.getPixelStride(), lineStride, flipped, inRGB.getEndian()));
			
			return outputFormat;
		}
		
		return null;
	}
	/****** Codec ******/

	/****** PlugIn ******/
	public void close()
	{

	}

	public String getName()
	{
		return "Simple-Filter";
	}

	public void open() throws ResourceUnavailableException
	{

	}

	public void reset()
	{

	}
	/****** PlugIn ******/

	/****** Controls ******/
	public Object getControl(String controlType)
	{
		return null;
	}

	public Object[] getControls()
	{
		return null;
	}
	/****** Controls ******/
	
	/****** Utility ******/
	private Format matches(Format in, Format[] out)
	{
		if(in != null && out != null)
		{
			for(int i=0, cnt=out.length; i<cnt; i++)
			{
				if(in.matches(out[i]))
					return out[i];
			}
		}
		
		return null;
	}
	/****** Utility ******/
}

Java - Mini Lettore Wav

// Piccolissimo Lettore Audio per Java

package Multimedia;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.plaf.metal.MetalLookAndFeel;

public class AudioSystem
{
	public static void main(String[] args)
	{
		JFrame.setDefaultLookAndFeelDecorated(true);
		JDialog.setDefaultLookAndFeelDecorated(true);
		
		try
		{
			UIManager.setLookAndFeel(new MetalLookAndFeel());
		}
		catch(UnsupportedLookAndFeelException e)
		{
			e.printStackTrace();
		}
		
		new AudioGUI();
	}
}


package Multimedia;

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class AudioGUI extends JFrame implements WindowListener
{
	public AudioGUI()
	{
		this.setTitle("AudioSystem");
		this.setSize(240, 100);
		this.setResizable(false);
		
		this.addWindowListener(this);
		
		Container gc = this.getContentPane();
		gc.add(new AudioGUIPan());
		
		this.setVisible(true);
	}

	public void windowOpened(WindowEvent e)
	{
		
	}

	public void windowClosing(WindowEvent e)
	{
		System.exit(0);
	}

	public void windowClosed(WindowEvent e)
	{
		
	}

	public void windowIconified(WindowEvent e)
	{
		
	}

	public void windowDeiconified(WindowEvent e)
	{
		
	}

	public void windowActivated(WindowEvent e)
	{
		
	}

	public void windowDeactivated(WindowEvent e)
	{
		
	}
}

class AudioGUIPan extends JPanel implements ActionListener
{
	private JButton play;
	private JButton stop;
	private JButton loop;
	private JButton open;
	private JButton close;
	
	private JFileChooser jfc;
	
	private String file;
	
	private AudioDevice ad;
	
	public AudioGUIPan()
	{
		play = new JButton("Play");
		play.addActionListener(this);
		stop = new JButton("Stop");
		stop.addActionListener(this);
		open = new JButton("Open");
		open.addActionListener(this);
		close = new JButton("Close");
		close.addActionListener(this);
		
		this.add(stop);
		this.add(play);
		this.add(open);
		this.add(close);
	}

	public void actionPerformed(ActionEvent e)
	{
		if(e.getSource() == close)
		{
			System.exit(0);
		}
		else if(e.getSource() == open)
		{
			jfc = new JFileChooser();
			jfc.setFileFilter(new AudioFilter());
			
			if(jfc.showOpenDialog(this) != JFileChooser.CANCEL_OPTION)
			{
				file = jfc.getSelectedFile().getAbsolutePath();
				ad = new AudioDevice(new File(file));
			}
		}
		else if(e.getSource() == play)
		{
			if(ad != null)
				ad.play();
		}
		else if(e.getSource() == stop)
		{
			if(ad != null)
				ad.stop();
		}
	}
}


package Multimedia;
import java.io.File;

import javax.swing.filechooser.FileFilter;

public class AudioFilter extends FileFilter
{
	public boolean accept(File f)
	{
		return f.getName().toLowerCase().endsWith(".wav") || f.isDirectory();
	}

	public String getDescription()
	{
		return "Audio File *.wav";
	}
}


package Multimedia;

import java.applet.Applet;
import java.applet.AudioClip;
import java.io.File;
import java.net.MalformedURLException;

public class AudioDevice implements AudioClip
{
	private AudioClip ac;
	public AudioDevice(File f)
	{		
		try
		{
			ac = Applet.newAudioClip(f.toURL());
		}
		catch(MalformedURLException e)
		{
			e.printStackTrace();
		}
	}
	
	public void play()
	{
		ac.play();
	}

	public void stop()
	{
		ac.stop();
	}

	public void loop()
	{
		
	}
}

Generate tone frequency using au file

The first part of my attempt to produce a tone sound.
from struct import pack
from math import sin, pi

def au_file(name='out.au', freq=400, length=2, A=0.5):
	f = open(name, 'wb')
	f.write('.snd')
	f.write(pack('>5L', 24, -1, 2, 8000, 1))
	T = 8000./freq
	for i in range(length*8000):
		angle = 2*pi*i/T
		val = pack('b', A*sin(angle)*127)
		f.write(val)
	f.close()

The reason that I use '.au' instead of '.wav' is that
the format is much simpler. Both are supported on my 6600 phone.

Here's the second step, after removing some bug.
(data size can't be -1, I must calculate it too)
from struct import pack
from math import pi, sin
import e32, audio 

def tone(freq=440, duration=1000, volume=0.5):
    f = open('D:\\out.au', 'wb')    # temp file
    f.write('.snd' + pack('>5L', 24, 8*duration, 2, 8000, 1))  #header
    for i in range(duration*8):
        sin_i = sin(i * 2*pi*freq/8000)  # sine wave
        f.write(pack('b', volume*127*sin_i))
    f.close()
    # now play the file
    s = audio.Sound.open('D:\\out.au')
    s.play()
    while s.state()==2: # playing
        e32.ao_yield()
    s.close()

The code is still quite slow. I'm not sure why (haven't test).
Either because of sin() or pack() or f.write()
A solution could be using a smaller file and play it multiple times.
But this small code should be enough to demonstrate an idea.

audible web browsing

You need to install esound.
$ esd -public -tcp &
$ sudo /usr/sbin/tcpdump -w - port 80 | esdcat -r 5000 -s 127.0.0.1 < /dev/stdin

Playing sound in Windows

>>> from winsound import *

>>> f = "C:/Windows/Media/chimes.wav"
>>> PlaySound(f, SND_FILENAME)

>>> PlaySound("SystemExit", SND_ALIAS)

See documentation.

Soundex

From Greg Jorgensen's recipe.
def soundex(name, len=4):

    # digits holds the soundex values for the alphabet
    digits = '01230120022455012623010202'
    sndx = ''
    fc = ''

    # translate alpha chars in name to soundex digits
    for c in name.upper():
        if c.isalpha():
            if not fc: fc = c   # remember first letter
            d = digits[ord(c)-ord('A')]
            # duplicate consecutive soundex digits are skipped
            if not sndx or (d != sndx[-1]):
                sndx += d
    
    sndx = fc + sndx[1:]   # replace first digit with first char
    sndx = sndx.replace('0','')       # remove all 0s
    return (sndx + (len * '0'))[:len] # padded to len characters

Similar words will return the same soundex
>>> soundex('hello')
'H400'
>>> soundex('hola')
'H400'

Generate and play midi on mobile phone

From a previous snippet, you can play any sound file
(including midi) with pys60.
http://bigbold.com/snippets/posts/show/400

Now, what if you can generate a midi file as well?
I found a pure python midi file library.
http://www.mxm.dk/products/public/pythonmidi

I modify it a bit, just to make a single file for easy download.
http://larndham.net/service/pys60/smidi.py
With it, you can play a single note with the following code.
>>> import smidi
>>> m = smidi.MidiOutFile('C:\\out.mid')
>>> m.header()
>>> m.start_of_track()
>>> m.update_time(0)
>>> m.note_on(note=0x40)  # single note
>>> m.update_time(192)
>>> m.note_off(note=0x40) # stop it after 192
>>> m.update_time(0)
>>> m.end_of_track()
>>> m.eof()

>>> from audio import Sound
>>> s = Sound.open('C:\\out.mid')
>>> s.play()
>>> s.close()

These 10 lines can be made into a simple function.
Then, you can just type a line and play any note you like
on you mobile phone.
>>> from smidi import play
>>> play([(64,192), (32, 192)])

Ah... so pythonic. ^_^

Recording sound

py_s60 1.1.3 provide audio module which allow you to record sound.
import e32, audio

s = audio.Sound.open('C:\\test.amr')
s.record()  # start recording
e32.ao_sleep(5)  # do if for 5 seconds
s.stop() # stop recording


# the file is now created, ready to be played
s.play()

Using this code, I can record sound longer than
the 1 minute limit by Nokia's 'Recorder' program.

Update:
It can record in 'wav', 'amr','au'.
I can't play the file recorded with 'wav', though.
It seems 6600 has the problem with uncompressed 16-bit wave.
(It can play other wave files fine.)

Playing sound

py_s60 1.1.3 provides audio module which allow you to
play sound. This should let people write some fun games.

Here's a quick example.
from audio import *
f = 'C:\\Nokia\\Sounds\\Digital\\28050.amr'
s = Sound.open(f)
s.play()

I have tried calling Sound.open(f).play() directly, but
it doesn't seem to work. I may be waiting for file loading
or wait for some callback. I don't know.

You can play it many times or repeat forever
s.play(3) # 3 times
s.play(KMdaRepeatForever) # or just use -2
s.stop() # Ok, enough of it
« Newer Snippets
Older Snippets »
Showing 1-9 of 9 total  RSS