예제 #1
0
        /// <summary>
        /// Gets the collection of tags associated with the specified sound.
        /// </summary>
        private static SongTagCollection GetTags(FMOD_SOUND *sound, out String name, out String artist, out String album)
        {
            var numtags = 0;
            var result  = default(FMOD_RESULT);

            result = FMOD_Sound_GetNumTags(sound, &numtags, null);
            if (result != FMOD_OK)
            {
                throw new FMODException(result);
            }

            var tags = new SongTagCollection();

            for (int i = 0; i < numtags; i++)
            {
                var tag = GetTag(sound, i);
                if (tag != null)
                {
                    tags.Add(tag);
                }
            }

            name =
                tags["name"]?.Value ??
                tags["title"]?.Value;

            artist =
                tags["artist"]?.Value;

            album =
                tags["album"]?.Value;

            return(tags);
        }
예제 #2
0
        /// <summary>
        /// Gets the duration of the specified sound.
        /// </summary>
        private static TimeSpan GetDuration(FMOD_SOUND *sound)
        {
            var durationInMilliseconds = 0u;
            var result = FMOD_Sound_GetLength(sound, &durationInMilliseconds, FMOD_TIMEUNIT.FMOD_TIMEUNIT_MS);

            if (result != FMOD_OK)
            {
                throw new FMODException(result);
            }

            return(TimeSpan.FromMilliseconds(durationInMilliseconds));
        }
예제 #3
0
 public static FMOD_RESULT FMOD_Sound_Release(FMOD_SOUND *sound) => pFMOD_Sound_Release(sound);
 public override sealed FMOD_RESULT FMOD_Sound_GetNumTags(FMOD_SOUND *sound, Int32 *numtags, Int32 *numtagsupdated) => INTERNAL_FMOD_Sound_GetNumTags(sound, numtags, numtagsupdated);
예제 #5
0
 public static extern FMOD_RESULT FMOD_Sound_Release(FMOD_SOUND *sound);
예제 #6
0
 public abstract FMOD_RESULT FMOD_Sound_GetNumTags(FMOD_SOUND *sound, Int32 *numtags, Int32 *numtagsupdated);
예제 #7
0
 public abstract FMOD_RESULT FMOD_Sound_Release(FMOD_SOUND *sound);
예제 #8
0
 /// <inheritdoc cref="SongPlayer.Play(Song, Single, Single, Single, Boolean)"/>
 public Boolean Play(FMOD_SOUND *sound, FMOD_CHANNELGROUP *channelgroup, TimeSpan duration, Single volume, Single pitch, Single pan, Boolean loop = false)
 {
     return(PlayInternal(sound, channelgroup, duration, volume, pitch, pan,
                         loop ? TimeSpan.Zero : (TimeSpan?)null, null));
 }
예제 #9
0
 public abstract FMOD_RESULT FMOD_System_PlaySound(FMOD_SYSTEM *system, FMOD_SOUND *sound, FMOD_CHANNELGROUP *channelgroup, Boolean paused, FMOD_CHANNEL **channel);
예제 #10
0
 public override sealed FMOD_RESULT FMOD_System_PlaySound(FMOD_SYSTEM *system, FMOD_SOUND *sound, FMOD_CHANNELGROUP *channelgroup, Boolean paused, FMOD_CHANNEL **channel) => INTERNAL_FMOD_System_PlaySound(system, sound, channelgroup, paused, channel);
예제 #11
0
 public static FMOD_RESULT FMOD_System_PlaySound(FMOD_SYSTEM *system, FMOD_SOUND *sound, FMOD_CHANNELGROUP *channelgroup, Boolean paused, FMOD_CHANNEL **channel) => pFMOD_System_PlaySound(system, sound, channelgroup, paused, channel);
예제 #12
0
 public override sealed FMOD_RESULT FMOD_Sound_Release(FMOD_SOUND *sound) => INTERNAL_FMOD_Sound_Release(sound);
예제 #13
0
 private static extern FMOD_RESULT INTERNAL_FMOD_System_PlaySound(FMOD_SYSTEM *system, FMOD_SOUND *sound, FMOD_CHANNELGROUP *channelgroup, Boolean paused, FMOD_CHANNEL **channel);
예제 #14
0
 private static extern FMOD_RESULT INTERNAL_FMOD_Sound_Release(FMOD_SOUND *sound);
예제 #15
0
 public override sealed FMOD_RESULT FMOD_Sound_GetTag(FMOD_SOUND *sound, String name, Int32 index, FMOD_TAG *tag) => INTERNAL_FMOD_Sound_GetTag(sound, name, index, tag);
예제 #16
0
 private static extern FMOD_RESULT INTERNAL_FMOD_Sound_GetTag(FMOD_SOUND *sound, [MarshalAs(UnmanagedType.LPStr)] String name, Int32 index, FMOD_TAG *tag);
예제 #17
0
 /// <inheritdoc cref="SongPlayer.Play(Song, Boolean)"/>
 public Boolean Play(FMOD_SOUND *sound, FMOD_CHANNELGROUP *channelgroup, TimeSpan duration, Boolean loop = false)
 {
     return(PlayInternal(sound, channelgroup, duration, 1f, 0f, 0f,
                         loop ? TimeSpan.Zero : (TimeSpan?)null, null));
 }
예제 #18
0
 public static extern FMOD_RESULT FMOD_Sound_GetLength(FMOD_SOUND *sound, UInt32 *length, FMOD_TIMEUNIT lengthtype);
예제 #19
0
 /// <inheritdoc cref="SongPlayer.Play(Song, TimeSpan, TimeSpan?)"/>
 public Boolean Play(FMOD_SOUND *sound, FMOD_CHANNELGROUP *channelgroup, TimeSpan duration, TimeSpan loopStart, TimeSpan?loopLength)
 {
     return(PlayInternal(sound, channelgroup, duration, 1f, 0f, 0f,
                         loopStart, loopLength ?? Duration - loopStart));
 }
예제 #20
0
 public static FMOD_RESULT FMOD_Sound_GetLength(FMOD_SOUND *sound, UInt32 *length, FMOD_TIMEUNIT lengthtype) => pFMOD_Sound_GetLength(sound, length, lengthtype);
예제 #21
0
 /// <inheritdoc cref="SongPlayer.Play(Song, Single, Single, Single, TimeSpan, TimeSpan?)"/>
 public Boolean Play(FMOD_SOUND *sound, FMOD_CHANNELGROUP *channelgroup, TimeSpan duration, Single volume, Single pitch, Single pan, TimeSpan loopStart, TimeSpan?loopLength)
 {
     return(PlayInternal(sound, channelgroup, duration, volume, pitch, pan,
                         loopStart, loopLength ?? Duration - loopStart));
 }
예제 #22
0
 public static extern FMOD_RESULT FMOD_Sound_GetNumTags(FMOD_SOUND *sound, Int32 *numtags, Int32 *numtagsupdated);
예제 #23
0
 public abstract FMOD_RESULT FMOD_Sound_GetLength(FMOD_SOUND *sound, UInt32 *length, FMOD_TIMEUNIT lengthtype);
예제 #24
0
        /// <summary>
        /// Gets the tag at the specified index within the specified sound.
        /// </summary>
        private static SongTag GetTag(FMOD_SOUND *sound, Int32 index)
        {
            var tag    = default(FMOD_TAG);
            var result = default(FMOD_RESULT);

            result = FMOD_Sound_GetTag(sound, null, index, &tag);
            if (result != FMOD_OK)
            {
                throw new FMODException(result);
            }

            var tagname  = Marshal.PtrToStringAnsi(tag.name);
            var tagvalue = String.Empty;

            String GetTagString(IntPtr ptr, UInt32 length, Encoding encoding)
            {
                var buffer = new byte[length];

                for (int offset = 0; offset < length; offset++)
                {
                    buffer[offset] = Marshal.ReadByte(ptr, offset);
                }

                var str = encoding.GetString(buffer);
                var nul = str.IndexOf('\0');

                return(nul < 0 ? str : str.Substring(0, nul));
            }

            switch (tag.datatype)
            {
            case FMOD_TAGDATATYPE_INT:
                tagvalue = (*(int *)tag.data).ToString();
                break;

            case FMOD_TAGDATATYPE_FLOAT:
                tagvalue = (*(float *)tag.data).ToString();
                break;

            case FMOD_TAGDATATYPE_STRING:
                tagvalue = GetTagString(tag.data, tag.datalen, Encoding.ASCII);
                break;

            case FMOD_TAGDATATYPE_STRING_UTF16:
                tagvalue = GetTagString(tag.data, tag.datalen, Encoding.Unicode);
                break;

            case FMOD_TAGDATATYPE_STRING_UTF16BE:
                tagvalue = GetTagString(tag.data, tag.datalen, Encoding.BigEndianUnicode);
                break;

            case FMOD_TAGDATATYPE_STRING_UTF8:
                tagvalue = GetTagString(tag.data, tag.datalen, Encoding.UTF8);
                break;

            default:
                return(null);
            }

            return(new SongTag(tagname, tagvalue));
        }
예제 #25
0
 public abstract FMOD_RESULT FMOD_Sound_GetTag(FMOD_SOUND *sound, String name, Int32 index, FMOD_TAG *tag);
예제 #26
0
 public override sealed FMOD_RESULT FMOD_Sound_GetLength(FMOD_SOUND *sound, UInt32 *length, FMOD_TIMEUNIT lengthtype) => INTERNAL_FMOD_Sound_GetLength(sound, length, lengthtype);
예제 #27
0
 public static FMOD_RESULT FMOD_Sound_GetNumTags(FMOD_SOUND *sound, Int32 *numtags, Int32 *numtagsupdated) => pFMOD_Sound_GetNumTags(sound, numtags, numtagsupdated);
예제 #28
0
 private static extern FMOD_RESULT INTERNAL_FMOD_Sound_GetNumTags(FMOD_SOUND *sound, Int32 *numtags, Int32 *numtagsupdated);
예제 #29
0
 public static FMOD_RESULT FMOD_Sound_GetTag(FMOD_SOUND *sound, [MarshalAs(UnmanagedType.LPStr)] String name, Int32 index, FMOD_TAG *tag) => pFMOD_Sound_GetTag(sound, name, index, tag);
예제 #30
0
 private static extern FMOD_RESULT INTERNAL_FMOD_Sound_GetLength(FMOD_SOUND *sound, UInt32 *length, FMOD_TIMEUNIT lengthtype);