示例#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);
        }