Thanks, that was fantastic. The code below (in my case where there is
one sound file per slide) returns the same sound for every slide. The
solution to this was to remove the sound data at soundRef from the
array. In the case where there might be more than one sound per slide
you can just check to see if you sound data array is empty after all
slides are iterated over.
Thank again!
On Thu, 2008-05-22 at 10:32 +0400, Yegor Kozlov wrote:
> /**
> * For each slide iterate over shapes and found associated sound data.
> *
> * @author Yegor Kozlov
> */
> public class SoundFinder {
>
> public static void main(String[] args) throws Exception {
> SlideShow ppt = new SlideShow(new FileInputStream(args[0]));
> SoundData[] sounds = ppt.getSoundData();
>
> Slide[] slide = ppt.getSlides();
> for (int i = 0; i < slide.length; i++) {
> Shape[] shape = slide[i].getShapes();
> for (int j = 0; j < shape.length; j++) {
> int soundRef = getSoundReference(shape[j]);
> if(soundRef != -1) {
> System.out.println("Slide["+i+"], shape["+j+"], soundRef:
> "+soundRef);
> System.out.println(" " +
> sounds[soundRef].getSoundName());
> System.out.println(" " +
> sounds[soundRef].getSoundType());
> }
> }
> }
> }
>
> /**
> * Check if a given shape is associated with a sound.
>
> * @return 0-based reference to a sound in the sound collection
> * or -1 if the shape is not associated with a sound
> */
> protected static int getSoundReference(Shape shape){
> int soundRef = -1;
> //dive into the shape container and search for InteractiveInfoAtom
> EscherContainerRecord spContainer = shape.getSpContainer();
> List spchild = spContainer.getChildRecords();
> for (Iterator it = spchild.iterator(); it.hasNext();) {
> EscherRecord obj = (EscherRecord) it.next();
> if (obj.getRecordId() == EscherClientDataRecord.RECORD_ID) {
> byte[] data = obj.serialize();
> Record[] records = Record.findChildRecords(data, 8,
> data.length - 8);
> for (int j = 0; j < records.length; j++) {
> if (records[j] instanceof InteractiveInfo) {
> InteractiveInfoAtom info = ((InteractiveInfo)
> records[j]).getInteractiveInfoAtom();
> if (info.getAction() ==
> InteractiveInfoAtom.ACTION_MEDIA) {
> soundRef = info.getSoundRef();
> }
> }
> }
> }
> }
> return soundRef;
> }
> }
>
> Yegor
> > I am able to retrieve all sounds from a power point presentation using
> > the method described in the
> > Busy Developers' Guide to HSLF. I can not find a way, however, to
> > associate a sound with the slide it comes from. Is there a way to do this?
>
> > Thanks
>
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]