The development of AirPlay Server on Android is mainly referenced and modified Droidairplay Project, and airplay protocol
1, download the Droidairplay
2, Eclipse Create a new Android project, and add the JRE Library (to prevent errors, only compiled use), the project using the following several jar packages, self-download, do not forget to join the network and storage permissions
base64-2.3.8. Jar Bcprov-ext-jdk16-1.46. Jardd-plist.jar jmdns-3.4.0. Jarnetty-3.2.4 . Final.jar (the above jar package can be downloaded from search.maven.org search)
3. Copy the package under SRC of the Droidairplay project to SRC under the new project
4, new activity, start the service using the following code in the OnCreate method
Airplayserver DWA = airplayserver.getistance ();d wa.setrtspport (8998); New Thread (new Runnable () { @Override publicvoid run () { Dwa.run ( ); }}). Start ();
5, need to modify the place, are in nz.co.iswe.android.airplay.audio.AudioOutputQueue This class, reference to this article
1, instantiation of Audiotrack
Create the Audiotrack //audiotrack = new Audiotrack (Streamtype, Samplerateinhz, Channelconfig, Audioformat, buffersizeinbytes, mode); New Audiotrack (Streamtype, Samplerateinhz, Audioformat.channel_configuration_stereo, Audioformat, BufferSizeInBytes, mode); // Fixme
2. Data acquisition
byte byttemp = 0x00; if(convertunsignedtosigned) {/*the line expects signed PCM samples, so we must * convert the unsigned PCM samples to signed. * Note that this is only affects the high bytes! */ for(inti=0; i < samplesconverted.length; i + = 2) {Samplesconverted[i]= (byte) ((Samplesconverted[i] & 0xff)-0x80); //Add by VilleByttemp =Samplesconverted[i]; Samplesconverted[i]= Samplesconverted[i + 1]; Samplesconverted[i+ 1] =byttemp; //End }}
6, after the modification should be able to run, but after using the iphone connection to play the concert found that the volume is not adjusted, because Android Audiotrack maximum volume of 1.0, and according to the Airplay Protocol document description
float value representing the audio attenuation in DB. A value of–144 means the audio is muted. Then it goes from–30 to 0.
Need to modify nz co iswe android airplay audio the following place (approximately 744 rows),
if ("Volume". Equals (name)) { ifnull) { float vol = math.abs ( Float.parsefloat (value)); = (float) (1.0-(vol/29.0)); Audiooutputqueue.setrequestedvolume (vol);} }
Then modify the Setstereovolume method of the audiooutputqueue
// comment out the following two lines leftvolume= = Audiotrack.getmaxvolume ();
8, modify the device name, the default iphone will search for a device named localhost (wlan0) , by modifying the Nz.co.iswe.android.airplay.AirPlayServer, You can customize the device name
157 rows
String hostName = "Dwairplay"; // networkutils.gethostutils ();
9, the above code big God F2 test pass, but in C8650 this old machine found no sound, through log guessing is the equipment processing ability is insufficient, do not know is this reason ...
Android Development AirPlay Server