예제 #1
0
    static int Main(string[] args)
    {
        if (args.Length < 1)
        {
            System.Console.WriteLine("not enough args");
            System.Console.WriteLine("usage:");
            System.Console.WriteLine("TestNI.exe <audiofile>");
            return(0);
        }

        string file = args[0];

        System.Console.WriteLine("file: " + file);

        // create struct to hold AudioMetaData struct
        AudioData.AudioMetaData mdata = new AudioData.AudioMetaData();

        // read audio
        Int32 err = 0;
        Int32 sr  = 6000;
        Int32 P   = 9;

        float[] buf = AudioData.readaudio(file, 6000, sr, ref mdata, ref err);
        if (buf == null)
        {
            System.Console.WriteLine("error reading audio: " + err);
            return(-1);
        }

        // print metadata information for file.
        System.Console.WriteLine("buffer contains " + buf.Length + " samples");
        System.Console.WriteLine("composer: " + AudioData.getString(mdata.composer));
        System.Console.WriteLine("title2: " + AudioData.getString(mdata.title2));
        System.Console.WriteLine("pe1: " + AudioData.getString(mdata.tpe1));
        System.Console.WriteLine("date: " + AudioData.getString(mdata.date));
        System.Console.WriteLine("year: " + mdata.year);
        System.Console.WriteLine("album: " + AudioData.getString(mdata.album));
        System.Console.WriteLine("genre: " + AudioData.getString(mdata.genre));
        System.Console.WriteLine("duration: " + mdata.duration);
        System.Console.WriteLine("partofset: " + mdata.partofset);

        // create AudioHashStInfo struct
        // This holds information commonly used information that can be used
        // across hash calculations, to keep from having to realloc and recalc.
        IntPtr hashst = IntPtr.Zero;

        // calculate hash for signal buffer
        byte[][] toggles   = null;
        Int32[]  hasharray = PHashAudio.audiohash(buf, sr, P, ref toggles, ref hashst);
        if (hasharray == null)
        {
            System.Console.WriteLine("problem calculating hash.");
            return(-1);
        }

        for (int i = 0; i < hasharray.Length; i += 1000)
        {
            System.Console.Write(hasharray[i] + " ");
            for (int j = 0; j < P; j++)
            {
                System.Console.Write(" " + toggles[i][j] + " ");
            }
            System.Console.WriteLine("");
        }
        System.Console.WriteLine("buffer hashed to " + hasharray.Length + " frames");

        // cleanup members of struct AudioMetaData
        AudioData.free_mdata(ref mdata);

        // cleanup members of struct AudioHashStInfo
        // Invoke when finished hashing a group of files.
        PHashAudio.ph_hashst_free(hashst);


        return(0);
    }
예제 #2
0
        static void Main(string[] args)
        {
            if (args.Length < 4)
            {
                Console.WriteLine("not enough args");
                Console.WriteLine("usage: prog command dirPath serverAddress nbseconds");
                Console.WriteLine("command - 1 for query, 2 for submit files");
                Console.WriteLine("dirPath - path of directory containing audio files");
                Console.WriteLine("server  - address of audioscout server, e.g. tcp://127.0.0.1:4005");
                Console.WriteLine("nbseconds - first number of seconds to sample from each file (0 if for the whole file)");
                return;
            }

            //parse arguments
            byte[] cmd = { Byte.Parse(args[0]) };
            string dirPath = args[1];
            string addr = args[2];
            Single nbsecs = Single.Parse(args[3]);
            int    err = 0, sr = 6000;

            //separation string for metadata parts
            // composer RS title RS performer RS date RS album RS genre RS year RS duration RS part
            // RS == record separator character (value 32)
            const string sepStr = "\u0020\u001e\u0020";

            AudioData.AudioMetaData    mdatast = new AudioData.AudioMetaData();
            PHashAudio.AudioHashStInfo hashst  = new PHashAudio.AudioHashStInfo();

            // set up zeromq messaging
            Context context;
            Socket  skt;

            try
            {
                context = new Context(1);
                skt     = context.Socket(SocketType.REQ);
                skt.Connect(addr);
            }
            catch (ZMQ.Exception ex)
            {
                Console.WriteLine("Unable to connect socket: " + ex.Message);
                Console.WriteLine(ex.StackTrace);
                return;
            }

            //enumerate through files in dir
            var files = Directory.EnumerateFiles(dirPath, "*.mp3", SearchOption.AllDirectories);

            foreach (var file in files)
            {
                Console.WriteLine("file: " + file);

                // read signal and metadata
                Single[] buf = AudioData.readaudio(file, sr, nbsecs, ref mdatast, ref err);
                if (buf == null)
                {
                    Console.WriteLine("Unable to read file - error " + err);
                    continue;
                }

                Console.WriteLine("signal: " + buf.Length + " samples");

                // calc hash for signal
                Int32[] hasharray = PHashAudio.audiohash(buf, sr, ref hashst);
                if (hasharray == null)
                {
                    Console.WriteLine("Unable to calculate hash array");
                }

                Console.WriteLine("hash: " + hasharray.Length + " frames");

                byte[] nb        = BitConverter.GetBytes(hasharray.Length);
                byte[] hashbytes = new byte[sizeof(Int32) * hasharray.Length];
                Buffer.BlockCopy(hasharray, 0, hashbytes, 0, sizeof(Int32) * hasharray.Length);


                if (cmd[0] == 1)   //query
                {
                    Console.WriteLine("Querying signal ...");
                    try
                    {
                        // send message
                        skt.SendMore(cmd);
                        skt.SendMore(nb);
                        skt.Send(hashbytes);

                        Thread.Sleep(1000);

                        //wait for reply
                        byte[] resp    = skt.Recv(1000);
                        string respStr = Encoding.UTF8.GetString(resp);
                        Console.WriteLine("Result: " + respStr);
                    }
                    catch (ZMQ.Exception ex)
                    {
                        Console.WriteLine("ZMQ Error: " + ex.Message);
                        Console.WriteLine();
                        return;
                    }

                    Console.WriteLine();
                    Console.WriteLine("******Hit Enter Key********");
                    Console.ReadLine();
                }
                else if (cmd[0] == 2) //submit
                {
                    // construct inline metadata string from metadata structure
                    StringBuilder metadataStr = new StringBuilder(512);
                    metadataStr.Append(AudioData.getString(mdatast.composer)); //composer
                    metadataStr.Append(sepStr);
                    metadataStr.Append(AudioData.getString(mdatast.title1));   //title
                    metadataStr.Append(AudioData.getString(mdatast.title2));
                    metadataStr.Append(AudioData.getString(mdatast.title3));
                    metadataStr.Append(sepStr);
                    metadataStr.Append(AudioData.getString(mdatast.tpe1));     //performer
                    metadataStr.Append(AudioData.getString(mdatast.tpe2));
                    metadataStr.Append(AudioData.getString(mdatast.tpe3));
                    metadataStr.Append(AudioData.getString(mdatast.tpe4));
                    metadataStr.Append(sepStr);
                    metadataStr.Append(AudioData.getString(mdatast.date));     //date
                    metadataStr.Append(sepStr);
                    metadataStr.Append(AudioData.getString(mdatast.album));    //album
                    metadataStr.Append(sepStr);
                    metadataStr.Append(AudioData.getString(mdatast.genre));    //genre
                    metadataStr.Append(sepStr);
                    metadataStr.Append(mdatast.year);                          //year
                    metadataStr.Append(sepStr);
                    metadataStr.Append(mdatast.duration);                      //duration
                    metadataStr.Append(sepStr);
                    metadataStr.Append(mdatast.partofset);                     //part


                    string mdataStr = metadataStr.ToString();

                    // need to send a byte[] with a null char in the last position
                    // Is there a better way to convert the string ????
                    byte[] mdataBytes  = Encoding.UTF8.GetBytes(mdataStr);
                    byte[] mdataBytes1 = new byte[mdataBytes.Length + 1];
                    Buffer.BlockCopy(mdataBytes, 0, mdataBytes1, 0, mdataBytes.Length);
                    mdataBytes1[mdataBytes.Length] = 0x00;

                    Console.WriteLine("submitting: " + mdataStr);
                    Console.WriteLine();


                    try
                    {
                        // send message
                        skt.SendMore(cmd);
                        skt.SendMore(nb);
                        skt.SendMore(hashbytes);
                        skt.Send(mdataBytes1);


                        Thread.Sleep(1000);

                        //wait for reply
                        byte[] resp = skt.Recv(5000);

                        if (resp != null)
                        {
                            int uid = BitConverter.ToInt32(resp, 0);
                            Console.WriteLine("successfully submitted - uid is " + uid);
                        }
                        else
                        {
                            Console.WriteLine("no response from server");
                        }
                    }
                    catch (ZMQ.Exception ex)
                    {
                        Console.WriteLine("ZMQ error: " + ex.Message);
                    }
                }
                else
                {
                    Console.WriteLine("unknown cmd: " + cmd[0]);
                }

                Console.WriteLine();
            }

            AudioData.free_mdata(ref mdatast);
            PHashAudio.ph_hashst_free(ref hashst);
        }