Modified by     : [EMAIL PROTECTED]
Reviewed by     : "Eric Hyche" <[EMAIL PROTECTED]>
Date            : 05-16-2006
Project : Tone generator plugin for Helix Client DNA

Thanks for detailed review Eric.

Added license headers for all the files and removed .def files
from the tone generator plug-in modules.
Checked in the tone generator plug-in modules.

Thanks
Sateesh


Thanks for detailed review Eric.

Sateesh, this check-in should be applied to HEAD branch only.

Given that this code does not interfere with other modules and is still work in progress, please correct the following subset of issues and check-in into the repository (HEAD only):
- update and add license headers per review
- remove.def files from check-in

Other issues can be addressed after the check-in.

Thanks,
Milko


At 07:52 AM 4/28/2006, Eric Hyche wrote:

Sateesh:

Here are my comments on the added files:

audio/tonegen:

1) It appears the source file headers are out of date.
   Headers can be found here:
   https://helix.dev.prognet.com/index.cgi/SourceFileHeaders
   Added C++ files should use the header in 2.1.1.
   Added Python files should use the header in 2.2.1.

2) In audio/tonegen, there doesn't seem to be any
   need for a sub-Umakefil (Umakefil referencing libumakefil,
   which has the real build instructions). Just put the code
   which is currently in libumakefil into Umakefil and
   eliminate the MultiTargetMake() in Umakefil.

3) Don't check in tonerenderer.def, since .def files are
   generated by the build system.

4) tonegen.cpp needs a license header.

5) tongen.h needs a license header.

datatype/tone/fileformat:

1) License file headers are out of date - see above

2) MLOG_xxx has been deprecated as a logging system. You should
   use HXLOG, as documented here:
   https://common.helixcommunity.org/2005/devdocs/UnifiedLogging
   Therefore, toneffmlog.h should not be needed.

3) Code lines that have been commented out should be removed,
   unless they are needed to explain some behavior or we
   think we might eventually switch over to using the commented
   out code.

4) I see that Seek() returns HXR_UNEXPECTED, but I saw
   in your status report that you are still working
   on getting seeking working. So I assume that
   the Seek() method will be changed in a separate CR.
   Is that correct?

5) This code block in toneff.cpp:

            // Call back to the response
            IHXFileMimeMapper* pMapper = NULL;
m_pFileObject->QueryInterface(IID_IHXFileMimeMapper, (void**) &pMapper);
            if (pMapper)
            {
                // Get the URL
                const char* pszURL = NULL;
                m_pRequest->GetURL(pszURL);
                if (pszURL)
                {
                    // Get our own response interface
                    IHXFileMimeMapperResponse* pResponse = NULL;
QueryInterface(IID_IHXFileMimeMapperResponse, (void**) &pResponse);
                    if (pResponse)
                    {
                        // Call FindMimeType - look in MimeTypeFound for
                        // the response
                        pMapper->FindMimeType(pszURL, pResponse);
                    }
                    HX_RELEASE(pResponse);
                }
            }
            HX_RELEASE(pMapper);

   doesn't make any sense. CTONEFileFormat doesn't even support
   IHXFileMimeMapperResponse so FindMimeType will never be called.
   Why do you need to know the mime type of the file?

6) In SeekDone(), you have this:

               retVal = m_pFileObject->Read(8);//TONE_HEADER_READ_SIZE

   If TONE_HEADER_READ_SIZE is 8, then just use it
   in the Read() call:

            retVal = m_pFileObject->Read(TONE_HEADER_READ_SIZE);

7) These two comments don't make sense beside each other:

               // Now read TONE_HEADER_READ_SIZE bytes
            //No Header Information available to read
            retVal = m_pFileObject->Read(8);//TONE_HEADER_READ_SIZE

   I suspect one of them is a left-over from the old code
   that you used as a template for this new code. Please
   remove the inapplicable comment.

8) In GetFileHeader, you first Seek() to the beginning of
   the file, then in SeekDone(), you read 8 bytes of the file,
   and then in ReadDone(), you don't do anything with those 8
   bytes you just read. Then in GetStreamHeader(), you Seek()
   back to the beginning of the file again. So it looks to
   me as if the seek and read started by GetFileHeader are
   completely unnecessary. If so, remove them since they
   are just adding unnecessary code size and complexity.

9) Remove commented-out code in GetStreamHeader()

10) I don't understand this logic:

                    // Create a raw file packet
                    IHXPacket* pPacket = NULL;
retVal = MakeRawFilePacket(pBuffer, m_ulNextTimeStamp, pPacket);
                    if (SUCCEEDED(retVal))
                    {
// Process this input packet into output queue packets. // We could have done this either in SetPacket() or GetPacket(), // but we choose to do it here. We don't force flushing yet, // since we may get more data. Once we get a call to flush, // then we process all the input, regardless of min size. pHdr->GetPropertyULONG32("MinPacketSize", m_ulMinPacketSize); retVal = ProcessInputPacket(pPacket, m_bFlush, m_ulMinPacketSize,
                            m_ulPacketBytesConsumed, m_ulDurationConsumed);

                        if (SUCCEEDED(retVal))
                        {
                            // Update the next file offset
                            m_ulNextFileOffset += GetPacketBytesConsumed();
                            // Update the next time stamp
                            m_ulNextTimeStamp  += GetDurationConsumed();
                            // Set the state
                            m_eState = StateReady;
                            // Send the stream header
retVal = m_pFormatResponse->StreamHeaderReady(HXR_OK, pHdr);
                        }
                    }
                    HX_RELEASE(pPacket);

You are taking pBuffer and putting it into a packet in MakeRawFilePacket(), then turning right around in ProcessInputPacket() and pulling the buffer
    back out and making a new different packet out of it. Why? It seems
    like the first creation of the packet is not necessary.

11) Remove commented-out code in GetPacket()

12) This code block in ReadDone() will never get executed:

    if (m_bScanForFrameBegin)
    {
        ...
    }

    Why is it there? It looks to me like it's left-overs from
    the code you started with...

13) Same comment as #10 above in this code block in ReadDone()

    else if (m_eState == StateGetPacketReadDonePending)
    {
        ...
    }
    It appears there is an unnecessary step of creating a packet.

14) FindAllTONEFramesLength() does not appear to be called at all.


15) The file win32.pcf should actually be called toneffdll_win32.pcf.
    If it is called win32.pcf then it is applied to both tonefflib
    and toneffdll, and it only needs to be applied to toneff.

16) In toneff.h, there are these definitions:

    const char VERSION  = (UINT8)(-2);
    const char TEMPO    = (UINT8)(-3);

    This is needlessly confusing. You are taking a negative number,
    casting it to unsigned number, and then assigning
    it to a char. And then in the code you are comparing that
    to a BYTE. Also, these are declared as global variables
    and there is no need for them to be. They can just be
    preprocessor definitions.

    Why not just make the definitions clear as in:

    #define HXTONE_SILENCE    0xFF
    #define HXTONE_C4         0x3C
    ...

17) In toneff.h, these are public methods:

    UINT32 GetPacketBytesConsumed() { return m_ulPacketBytesConsumed; }
    UINT32 GetDurationConsumed()    { return m_ulDurationConsumed;    }

    and they should be private.


datatype/tone/renderer:

1) In libumakefil, you have:

    project.AddModuleLibraries("audio/tonegen[tonegenlib]")

   There is no need in a LibraryTarget to have an
   AddModuleLibraries, since libs don't link with anything.
   Instead, just add this line to your AddModuleIncludes:

                 "audio/tongen/pub",

   Also, is adding "audio/tonegen" to the AddModuleIncludes
   really needed?

2) In tonefmt.cpp in CreateAssembledPacket(), it looks
   like it only creates m_pMediapkt for the first IHXPacket
   passed in and then just keeps returning m_pMediapkt. Is
   this really what you wanted? So any packets after the
   first one are just thrown away?

3) In CToneAudioFormat::DecodeAudioData(), it appears that
   you create a temporary IHXBuffer in m_pInputBuffer and
   then pass it into ParseAudioData(). However, you already
   have an IHXBuffer() in the CMediaPacket. Therefore, it
   appears that this is a needless memcpy. Why not just use
   the IHXBuffer that already exists in the CMediaPacket?

   Also, on the output, it appears that you are copying
   the output PCM again into a new IHXBuffer output buffer.
   What is the reason for this extra copy on the output?

Now the changed files:

> > -const char* DataFileSystem::zm_pProtocol   = "data";
> > -
> > +//#ifdef HELIX_FEATURE_TONE_GENERATOR
> > +const char* DataFileSystem::zm_pProtocol   = "data|tone";
> > +//#else
> > +//const char* DataFileSystem::zm_pProtocol = "data|tone";
> > +//#endif
> >   int g_nRefCount_datafsys = 0;
> >

Shouldn't this be:

-const char* DataFileSystem::zm_pProtocol       = "data";
-
+#ifdef HELIX_FEATURE_TONE_GENERATOR
+const char* DataFileSystem::zm_pProtocol       = "data|tone";
+#else
+const char* DataFileSystem::zm_pProtocol       = "data";
+#endif

In other words, if HELIX_FEATURE_TONE_GENERATOR is
not defined, then datafsys only claims the "data://" scheme.

> > +#ifdef HELIX_FEATURE_TONE_GENERATOR
> > +const char VERSION = (UINT8)(-2);
> > +const char TEMPO   = (UINT8)(-3);
> > +const char RESOLUTION      = (UINT8)(-4);
> > +const char BLOCK_START     = (UINT8)(-5);
> > +const char BLOCK_END       = (UINT8)(-6);
> > +const char PLAY_BLOCK      = (UINT8)(-7);
> > +const char SET_VOLUME      = (UINT8)(-8);
> > +const char C4              = (UINT8)(60);
> > +const char REPEAT  = (UINT8)(-9);
> > +const char SILENCE = (UINT8)(-1);
> > +#endif
> >

I saw these definitions somewhere else - I think in
the file format. They should NOT be duplicated, but rather
put into a common header file.

> > +   IHXBuffer* pData, IHXRequest* pRequest);
> > +
> > +#define HELIX_FEATURE_TONE_GENERATOR 1
> > +#ifdef HELIX_FEATURE_TONE_GENERATOR
> > +    STDMETHOD(SetSequence)(UINT32 ulNote, UINT32 ulToneDuration,

HELIX_FEATURE_TONE_GENERATOR should not be hard-coded
in the code anywhere. Instead, it should be placed into
the appropriate profile.


That's all.

Eric

==============================================
Eric Hyche ([EMAIL PROTECTED])
Technical Lead
Embedded Player and Technologies
RealNetworks, Inc.



_______________________________________________
Datatype-dev mailing list
[EMAIL PROTECTED]
http://lists.helixcommunity.org/mailman/listinfo/datatype-dev



_______________________________________________
Datatype-dev mailing list
[EMAIL PROTECTED]
http://lists.helixcommunity.org/mailman/listinfo/datatype-dev


Modified by     : [EMAIL PROTECTED]
Reviewed by     :
Date            : 04-27-2006
Project : Tone generator plugin for Helix Client DNA

Synopsis: Tone generator plugin for Helix Client DNA

Overview:
Implementation of file system,file format and renderer
component to Helix DNA Client that will act as a
tone sequence generator.

Files Modified:
\filesystem\data\pub\datafsys.h
\filesystem\data\datafsys.cpp

Files Added:
a] Tone Fileformat files:
        \datatype\tone\fileformat\toneff.cpp
        \datatype\tone\fileformat\toneffdll.cpp
        \datatype\tone\fileformat\pub\toneff.h
        \datatype\tone\fileformat\pub\toneffmlog.h
        \datatype\tone\fileformat\toneffdll
        \datatype\tone\fileformat\tonefflib
        \datatype\tone\fileformat\Umakefil
        \datatype\tone\fileformat\win32.pcf
        \datatype\tone\fileformat\toneff.ver

b] Tone renderer files:
        \datatype\tone\renderer\tonefmt.cpp
        \datatype\tone\renderer\tonerend.cpp
        \datatype\tone\renderer\tonerenddll.cpp
        \datatype\tone\renderer\pub\tonefmt.h
        \datatype\tone\renderer\pub\tonerend.h
        \datatype\tone\renderer\dllumakefil
        \datatype\tone\renderer\libumakefil
        \datatype\tone\renderer\Umakefil
        \datatype\tone\renderer\win32.pcf
        \datatype\tone\renderer\tonerend.ver

c] Tone generator files:
        \audio\tonegen\tonegen.cpp
        \audio\tonegen\pub\tonegen.h
        \audio\tonegen\libumakefil
        \audio\tonegen\Umakefil
        \audio\tonegen\win32.pcf
        \audio\tonegen\tonerend.ver

Attached added files with this mail.

Image Size and Heap Use impact (Client - Only):
Minor

Distribution Libraries Affected:
Data File system
HTTP File system

Distribution library impact and planned action:
None

Platforms and Profiles Build Verified:
Windows platform,  helix-client-all-defines

Platforms and Profiles Functionality verified:
1] Test/verified the functionality with splaypr.exe.
2] Able to play the simple tone and polytone sequences.
3] Tested with multiple repeat note events,block events
 and volume change events.

Profile: helix-client-all-defines

Branch: HEAD, Cay150

cvs diff:
Index: datafsys.cpp
===================================================================
RCS file: /cvsroot/filesystem/data/datafsys.cpp,v
retrieving revision 1.7
diff -u -w -r1.7 datafsys.cpp
--- datafsys.cpp        2 Nov 2004 22:52:44 -0000       1.7
+++ datafsys.cpp        28 Apr 2006 04:19:47 -0000
@@ -92,7 +92,9 @@
 #include "hxfiles.h"
 #include "ihxpckts.h"
 #include "hxver.h"
-
+#include "hxcore.h"
+#include "hxurl.h"
+#include <math.h>
 #undef INITGUID

 #include "hxstrutl.h"
@@ -113,8 +115,11 @@
 const char* DataFileSystem::zm_pCopyright      = HXVER_COPYRIGHT;
 const char* DataFileSystem::zm_pMoreInfoURL    = HXVER_MOREINFO;
 const char* DataFileSystem::zm_pShortName      = "pn-datafsys";
-const char* DataFileSystem::zm_pProtocol       = "data";
-
+//#ifdef HELIX_FEATURE_TONE_GENERATOR
+const char* DataFileSystem::zm_pProtocol       = "data|tone";
+//#else
+//const char* DataFileSystem::zm_pProtocol     = "data|tone";
+//#endif
 int g_nRefCount_datafsys = 0;

 const char tokenChars[] =
@@ -133,7 +138,18 @@
     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 };
-
+#ifdef HELIX_FEATURE_TONE_GENERATOR
+const char VERSION     = (UINT8)(-2);
+const char TEMPO       = (UINT8)(-3);
+const char RESOLUTION  = (UINT8)(-4);
+const char BLOCK_START = (UINT8)(-5);
+const char BLOCK_END   = (UINT8)(-6);
+const char PLAY_BLOCK  = (UINT8)(-7);
+const char SET_VOLUME  = (UINT8)(-8);
+const char C4          = (UINT8)(60);
+const char REPEAT      = (UINT8)(-9);
+const char SILENCE     = (UINT8)(-1);
+#endif
 /****************************************************************************
  *
  *  Function:
@@ -760,7 +776,6 @@
     const char* pURL;
     IHXValues* pHeaders = 0;
     IHXBuffer* pBuffer0 = 0;
-
     hresult = m_pRequest->GetURL(pURL);

     if (hresult != HXR_OK)
@@ -771,7 +786,7 @@
     hresult = m_pClassFactory->CreateInstance(CLSID_IHXBuffer,
                                               (void**)&pBuffer0);

-    hresult = ParseURL(pURL, m_MediaType, pBuffer0);
+    hresult = ParseURL(pURL, m_MediaType, pBuffer0,m_pRequest);
     if (SUCCEEDED(hresult))
     {
        m_pDataURL = pBuffer0;
@@ -855,7 +870,7 @@
     CHXString mimeString;

     pMimeMapperResponse->AddRef();
-    status = ParseURL(pURL, mimeString, NULL);
+    status = ParseURL(pURL, mimeString, NULL,NULL);
status = pMimeMapperResponse->MimeTypeFound(status, (const char*)mimeString);
     pMimeMapperResponse->Release();

@@ -915,13 +930,18 @@
  */

 const char DATA_SCHEME[] = "data:";
+#ifdef HELIX_FEATURE_TONE_GENERATOR
+const char TONE_SCHEME[] = "tone:";
+#define TONE_SCHEME_SIZE (sizeof(TONE_SCHEME) - 1)
+#endif
 #define DATA_SCHEME_SIZE (sizeof(DATA_SCHEME) - 1)
 const char BASE64_TOKEN[] = ";base64";
 #define BASE64_TOKEN_SIZE (sizeof(BASE64_TOKEN) - 1)

 STDMETHODIMP DataFileObject::ParseURL(const char* pURL,
                                      CHXString& mimeString,
-                                     IHXBuffer* pBuffer)
+                                     IHXBuffer* pBuffer,
+                                     IHXRequest* pRequest)
 {
     HX_RESULT pnr = HXR_OK;
     UINT32 ulDataURLSize = strlen(pURL);
@@ -932,7 +952,46 @@
     const char* pMimeStringStart = NULL;
     const char* pMimeStringEnd = NULL;
     BOOL bHasMimeString = TRUE;
+#ifdef HELIX_FEATURE_TONE_GENERATOR
+    HXBOOL bIstoneprotocol = FALSE;
+    CHXURL cURL(pURL, m_pContext);
+    pnr = cURL.GetLastError();
+    IHXValues* pRequestHeaders = NULL;
+
+    /* if (SUCCEEDED(pnr))
+     {
+       IHXBuffer* pToneBuffer = NULL;
+        if (HXR_OK == cURL.GetProperties() && pRequestHeaders)
+        {
+ pnr = pRequestHeaders->GetPropertyBuffer("ToneSequence", pToneBuffer);
+            if (SUCCEEDED(pnr))
+            {
+                pBuffer = pToneBuffer;
+               HX_RELEASE(pRequestHeaders);
+               HX_RELEASE(pToneBuffer);
+               pnr = HXR_OK;
+               goto exit;
+           }
+       }
+    }*/
+ if(HXR_OK == m_pRequest->GetRequestHeaders(pRequestHeaders) && pRequestHeaders)
+    {
+           UINT32 ulNote = 0;
+           UINT32 ulToneDuration = 0;
+           UINT32 ulToneVolume = 0;
+           pRequestHeaders->GetPropertyULONG32("Tone",ulNote);
+           pRequestHeaders->GetPropertyULONG32("ToneDuration",ulToneDuration);
+           pRequestHeaders->GetPropertyULONG32("ToneDuration",ulToneVolume);
+           if(ulNote != 0 && ulToneDuration !=0 && ulToneVolume != 0 )
+           {
+               SetSequence(ulNote,ulToneDuration,ulToneVolume,pBuffer);
+               HX_RELEASE(pRequestHeaders);
+               pnr = HXR_OK;
+               goto exit;
+           }
+    }

+#endif
     // Skip any leading whitespace
     while (*pCurrentChar &&
           *pCurrentChar < 0x20)
@@ -940,6 +999,20 @@
        pCurrentChar++;
     }

+#ifdef HELIX_FEATURE_TONE_GENERATOR
+    // pURL must begin with data|tone scheme
+    // dataurl := "data:" [ mediatype ] [ ";base64" ] "," data
+    /* toneurl := "tone"://[tonename]?Note=value&ToneDuration=value
+    &ToneVolume=value */
+    // toneurl := "tone"://[testtonename]
+    if(strncasecmp(pCurrentChar, TONE_SCHEME, TONE_SCHEME_SIZE) == 0)
+    {
+           bIstoneprotocol = TRUE;
+           pCurrentChar += TONE_SCHEME_SIZE;
+    }
+    else
+#endif
+    {
     // pURL must begin with data scheme
     // dataurl    := "data:" [ mediatype ] [ ";base64" ] "," data
     if (strncasecmp(pCurrentChar, DATA_SCHEME, DATA_SCHEME_SIZE))
@@ -951,6 +1024,7 @@
     {
        pCurrentChar += DATA_SCHEME_SIZE;
     }
+    }

     // The URL may begin with "data:", "data:/", or "data://"
     if (*pCurrentChar == '/')
@@ -962,13 +1036,24 @@
        pCurrentChar++;
     }

+#ifdef HELIX_FEATURE_TONE_GENERATOR
+    if(bIstoneprotocol)
+    {
+           while (*pCurrentChar == '?')
+           {
+               pCurrentChar++;
+           }
+       bHasMimeString = FALSE;
+    }
+    else
+#endif
+    {
     if (*pCurrentChar == ';' || *pCurrentChar == ',')
     {
        bHasMimeString = FALSE;
     }
     else
     {
-
        if (strncasecmp(pCurrentChar, BASE64_TOKEN, BASE64_TOKEN_SIZE))
        {
            pMimeStringStart = pCurrentChar;
@@ -1048,8 +1133,9 @@
            bHasMimeString = FALSE;
            pCurrentChar += BASE64_TOKEN_SIZE;
        }
-    }

+       }
+    }
     if (bHasMimeString)
     {
        // copy the mime string into the parameter
@@ -1061,9 +1147,79 @@
     }
     else
     {
+#ifdef HELIX_FEATURE_TONE_GENERATOR
+       if(bIstoneprotocol)
+       {
+           mimeString = "audio/x-hx-tonesequence";
+       }
+       else
+#endif
+       {
         mimeString = "text/plain";
     }
+    }

+#ifdef HELIX_FEATURE_TONE_GENERATOR
+       if(bIstoneprotocol)
+       {
+           UINT32 ulNote = 0;
+           UINT32 ulToneDuration = 0;
+           UINT32 ulToneVolume = 0;
+           BYTE* pOutput = NULL;
+           if (pCurrentChar)
+           {
+                   // Check for a Note parameter. If it exists, remove it
+                   // from the URL
+            const char *pEnd = NULL;
+            char ptemp[10] = {0};
+            char *pNote = strstr((char *)pCurrentChar,"Note=" );
+            if(pNote)
+            {
+                       pNote += strlen("Note=");
+                pEnd = pNote;
+                       while (*pEnd != '&')
+                       {
+                               pEnd++;
+                       }
+                       SafeStrCpy(ptemp,pNote,pEnd-pNote+1);
+                       ulNote = (UINT32) atol((const char*)(ptemp));
+            }
+            // Check for a ToneDuration parameter. If it exists,
+            //remove it from the URL
+            pNote = NULL;
+            pNote = strstr(pCurrentChar, "ToneDuration=");
+            if (pNote)
+            {
+                pNote += strlen("ToneDuration=");
+                       pEnd = pNote;
+                       while (*pEnd != '&')
+                       {
+                               pEnd++;
+                   }
+                   SafeStrCpy(ptemp,pNote,pEnd-pNote+1);
+                       ulToneDuration = (UINT32) atol((const char*)(ptemp));
+                   }
+                   // Check for a ToneVolume parameter. If it exists,
+                   //remove it from the URL
+                   pNote = NULL;
+            pNote = strstr(pCurrentChar, "ToneVolume=");
+                   if (pNote)
+                   {
+                pNote += strlen("ToneVolume=");
+                       pEnd = pNote;
+                       while (*pEnd)
+                       {
+                       pEnd++;
+                       }
+                   SafeStrCpy(ptemp,pNote,pEnd-pNote+1);
+                       ulToneVolume = (UINT32) atol((const char*)(ptemp));
+            }
+           }
+           SetSequence(ulNote,ulToneDuration,ulToneVolume,pBuffer);
+       }
+       else
+#endif
+       {
     // should be a comma between mediatype and data
     if (*pCurrentChar != ',')
     {
@@ -1116,17 +1272,57 @@
            }
        }
     }
+       }

 exit:
     return pnr;
 }
-
-
-
-
-
-
-
-
-
-
+#ifdef HELIX_FEATURE_TONE_GENERATOR
+//Generate simple tone based on specified parameters
+STDMETHODIMP DataFileObject::SetSequence(const UINT32 ulNote,
+const UINT32 ulToneDuration,const UINT32 ulToneVolume, IHXBuffer* pData)
+{
+    HX_RESULT pnr = HXR_OK;
+    UINT32 ulIndx = 0;
+    BYTE uTempo = 30;//default tempo
+    BYTE uResolution = 64;//default resolution
+    UINT32 ulabsdur = 0;
+    BYTE uRpt = 1;
+    BYTE uRemdur = 0;
+    pData->SetSize(50);
+    BYTE* pOutput = (BYTE*)pData->GetBuffer();
+    BYTE* pStart = pOutput;
+    *pStart++ = VERSION;    //VERSION := -2
+    *pStart++ = (UINT8)1;   //version_number = 1(default)
+    *pStart++ = TEMPO;      //TEMPO = -3
+    *pStart++ = (UINT8)(30);//tempo_modifier = 30(default)
+    *pStart++ = RESOLUTION; //RESOLUTION = -4
+    *pStart++ = (UINT8)64;  //resolution_unit = 64(default)
+    *pStart++ = BLOCK_START;//BLOCK_START = -5
+    *pStart++ = (UINT8)0;   //block_number = 0(default)
+    ulabsdur = (UINT32)((8* 60 * 1000)/( uResolution * uTempo));
+    *pStart++ = (UINT8)ulNote;  //Note
+    *pStart++ = (UINT8)8;       //ToneDuration
+    if(ulToneDuration > ulabsdur)
+    {
+        UINT32 ultemp = ulToneDuration/ulabsdur;
+
+        while(ultemp > 127)
+        {
+            *pStart++ = REPEAT; //REPEAT -9
+            *pStart++ = 127;    //REPEAT MULTIPLIER
+            ultemp = ulToneDuration/(127 * ulabsdur);
+        }
+        *pStart++ = REPEAT;     //REPEAT -9
+        *pStart++ = (UINT8)(ultemp-1); //REPEAT MULTIPLIER
+    }
+    *pStart++ = (UINT8)SET_VOLUME; //SET_VOLUME = -8;
+    *pStart++ = (UINT8)ulToneVolume;//volume
+    *pStart++ = BLOCK_END;      //BLOCK_END = -6
+    *pStart++ = (UINT8)0;       //block_number = 0(default)
+    *pStart++ = PLAY_BLOCK;     //PLAY_BLOCK = -7
+    *pStart++ = (UINT8)0;       //block_number = 0(default)
+    pData->SetSize(pStart - pOutput);
+    return pnr;
+}
+#endif
Index: pub/datafsys.h
===================================================================
RCS file: /cvsroot/filesystem/data/pub/datafsys.h,v
retrieving revision 1.2
diff -u -w -r1.2 datafsys.h
--- pub/datafsys.h      9 Jul 2004 18:40:05 -0000       1.2
+++ pub/datafsys.h      28 Apr 2006 04:19:47 -0000
@@ -307,7 +307,14 @@
     UINT32                     m_ulFilePointer;

     STDMETHOD(ParseURL)(THIS_ const char* pURL, CHXString& mimeString,
-       IHXBuffer* pData);
+       IHXBuffer* pData, IHXRequest* pRequest);
+
+#define HELIX_FEATURE_TONE_GENERATOR 1
+#ifdef HELIX_FEATURE_TONE_GENERATOR
+    STDMETHOD(SetSequence)(UINT32 ulNote, UINT32 ulToneDuration,
+               UINT32 ulToneVolume, IHXBuffer* pData);
+#endif
+
 };

 #endif // ndef _DATAFSYS_H_






_______________________________________________
Audio-dev mailing list
[email protected]
http://lists.helixcommunity.org/mailman/listinfo/audio-dev

Reply via email to