1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// This sub-API supports the following functionalities:
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  - File playback.
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  - File recording.
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  - File conversion.
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Usage example, omitting error checking:
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  using namespace webrtc;
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  VoiceEngine* voe = VoiceEngine::Create();
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  VoEBase* base = VoEBase::GetInterface(voe);
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  VoEFile* file  = VoEFile::GetInterface(voe);
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  base->Init();
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  int ch = base->CreateChannel();
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  ...
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  base->StartPlayout(ch);
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  file->StartPlayingFileAsMicrophone(ch, "data_file_16kHz.pcm", true);
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  ...
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  file->StopPlayingFileAsMicrophone(ch);
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  base->StopPlayout(ch);
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  ...
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  base->DeleteChannel(ch);
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  base->Terminate();
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  base->Release();
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  file->Release();
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//  VoiceEngine::Delete(voe);
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_VOICE_ENGINE_VOE_FILE_H
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_VOICE_ENGINE_VOE_FILE_H
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
41471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/common_types.h"
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VoiceEngine;
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass WEBRTC_DLLEXPORT VoEFile
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic:
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Factory for the VoEFile sub-API. Increases an internal
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // reference counter if successful. Returns NULL if the API is not
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // supported or if construction fails.
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    static VoEFile* GetInterface(VoiceEngine* voiceEngine);
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Releases the VoEFile sub-API and decreases an internal
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // reference counter. Returns the new reference count. This value should
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // be zero for all sub-API:s before the VoiceEngine object can be safely
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // deleted.
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int Release() = 0;
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Starts playing and mixing files with the local speaker signal for
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // playout.
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int StartPlayingFileLocally(
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        int channel,
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        const char fileNameUTF8[1024],
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        bool loop = false,
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        FileFormats format = kFileFormatPcm16kHzFile,
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        float volumeScaling = 1.0,
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        int startPointMs = 0,
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        int stopPointMs = 0) = 0;
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Starts playing and mixing streams with the local speaker signal for
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // playout.
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int StartPlayingFileLocally(
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        int channel,
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        InStream* stream,
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        FileFormats format = kFileFormatPcm16kHzFile,
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        float volumeScaling = 1.0,
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        int startPointMs = 0, int stopPointMs = 0) = 0;
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Stops playback of a file on a specific |channel|.
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int StopPlayingFileLocally(int channel) = 0;
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Returns the current file playing state for a specific |channel|.
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int IsPlayingFileLocally(int channel) = 0;
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Starts reading data from a file and transmits the data either
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // mixed with or instead of the microphone signal.
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int StartPlayingFileAsMicrophone(
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        int channel,
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        const char fileNameUTF8[1024],
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        bool loop = false ,
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        bool mixWithMicrophone = false,
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        FileFormats format = kFileFormatPcm16kHzFile,
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        float volumeScaling = 1.0) = 0;
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Starts reading data from a stream and transmits the data either
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // mixed with or instead of the microphone signal.
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int StartPlayingFileAsMicrophone(
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        int channel,
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        InStream* stream,
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        bool mixWithMicrophone = false,
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        FileFormats format = kFileFormatPcm16kHzFile,
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        float volumeScaling = 1.0) = 0;
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Stops playing of a file as microphone signal for a specific |channel|.
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int StopPlayingFileAsMicrophone(int channel) = 0;
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Returns whether the |channel| is currently playing a file as microphone.
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int IsPlayingFileAsMicrophone(int channel) = 0;
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Starts recording the mixed playout audio.
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int StartRecordingPlayout(int channel,
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                      const char* fileNameUTF8,
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                      CodecInst* compression = NULL,
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                      int maxSizeBytes = -1) = 0;
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Stops recording the mixed playout audio.
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int StopRecordingPlayout(int channel) = 0;
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int StartRecordingPlayout(int channel,
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                      OutStream* stream,
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                      CodecInst* compression = NULL) = 0;
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Starts recording the microphone signal to a file.
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int StartRecordingMicrophone(const char* fileNameUTF8,
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         CodecInst* compression = NULL,
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         int maxSizeBytes = -1) = 0;
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Starts recording the microphone signal to a stream.
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int StartRecordingMicrophone(OutStream* stream,
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         CodecInst* compression = NULL) = 0;
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Stops recording the microphone signal.
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int StopRecordingMicrophone() = 0;
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1377f5e2973967c6ef5859334eb4ccac2c7c0020565henrika@webrtc.org    // Don't use. To be removed.
1387f5e2973967c6ef5859334eb4ccac2c7c0020565henrika@webrtc.org    virtual int ScaleLocalFilePlayout(int channel, float scale) { return -1; }
1397f5e2973967c6ef5859334eb4ccac2c7c0020565henrika@webrtc.org    virtual int ScaleFileAsMicrophonePlayout(
1407f5e2973967c6ef5859334eb4ccac2c7c0020565henrika@webrtc.org            int channel, float scale) { return -1; }
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int GetFileDuration(const char* fileNameUTF8, int& durationMs,
1427f5e2973967c6ef5859334eb4ccac2c7c0020565henrika@webrtc.org            FileFormats format = kFileFormatPcm16kHzFile) { return -1; }
1437f5e2973967c6ef5859334eb4ccac2c7c0020565henrika@webrtc.org    virtual int GetPlaybackPosition(int channel, int& positionMs) { return -1; }
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int ConvertPCMToWAV(const char* fileNameInUTF8,
1457f5e2973967c6ef5859334eb4ccac2c7c0020565henrika@webrtc.org                                const char* fileNameOutUTF8) { return -1; }
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int ConvertPCMToWAV(InStream* streamIn,
1477f5e2973967c6ef5859334eb4ccac2c7c0020565henrika@webrtc.org                                OutStream* streamOut) { return -1; }
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int ConvertWAVToPCM(const char* fileNameInUTF8,
1497f5e2973967c6ef5859334eb4ccac2c7c0020565henrika@webrtc.org                                const char* fileNameOutUTF8) { return -1; }
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int ConvertWAVToPCM(InStream* streamIn,
1517f5e2973967c6ef5859334eb4ccac2c7c0020565henrika@webrtc.org                                OutStream* streamOut) { return -1; }
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int ConvertPCMToCompressed(const char* fileNameInUTF8,
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                       const char* fileNameOutUTF8,
1547f5e2973967c6ef5859334eb4ccac2c7c0020565henrika@webrtc.org                                       CodecInst* compression) { return -1; }
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int ConvertPCMToCompressed(InStream* streamIn,
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                       OutStream* streamOut,
1577f5e2973967c6ef5859334eb4ccac2c7c0020565henrika@webrtc.org                                       CodecInst* compression) { return -1; }
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int ConvertCompressedToPCM(const char* fileNameInUTF8,
1597f5e2973967c6ef5859334eb4ccac2c7c0020565henrika@webrtc.org            const char* fileNameOutUTF8) { return -1; }
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual int ConvertCompressedToPCM(InStream* streamIn,
1617f5e2973967c6ef5859334eb4ccac2c7c0020565henrika@webrtc.org                                       OutStream* streamOut) { return -1; }
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprotected:
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    VoEFile() {}
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual ~VoEFile() {}
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace webrtc
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // WEBRTC_VOICE_ENGINE_VOE_FILE_H
170