-
Notifications
You must be signed in to change notification settings - Fork 0
/
ComXtityModTiYukkuriModule.m
184 lines (149 loc) · 4.89 KB
/
ComXtityModTiYukkuriModule.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
/**
* Your Copyright Here
*
* Appcelerator Titanium is Copyright (c) 2009-2010 by Appcelerator, Inc.
* and licensed under the Apache Public License (version 2)
*/
#import "ComXtityModTiYukkuriModule.h"
#import "TiBase.h"
#import "TiHost.h"
#import "TiUtils.h"
#include <sys/stat.h>
@implementation ComXtityModTiYukkuriModule
#pragma mark Internal
// this is generated for your module, please do not change it
-(id)moduleGUID
{
return @"c88299ac-83d4-45a0-b17c-f32e07a1e6d2";
}
// this is generated for your module, please do not change it
-(NSString*)moduleId
{
return @"com.xtity.mod.TiYukkuri";
}
///// custom /////
void * file_load(const char * file, int * psize) {
FILE *fp;
char *data;
struct stat st;
*psize = 0;
if( stat(file, &st)!=0) return NULL;
if((data=(char *)malloc(st.st_size))==NULL){
fprintf(stderr,"can not alloc memory(file_load)\n");
return NULL;
}
if((fp=fopen(file,"rb"))==NULL) {
free(data);
perror(file);
return NULL;
}
if(fread(data, 1, st.st_size, fp)<(unsigned)st.st_size) {
fprintf(stderr,"can not read data (file_load)\n");
free(data);
fclose(fp);
return NULL;
}
fclose(fp);
*psize = st.st_size;
return data;
}
///// custom /////
#pragma mark Lifecycle
-(void)startup
{
// this method is called when the module is first loaded
// you *must* call the superclass
[super startup];
// prepare AquesTalk2
m_pAqTk = AquesTalk2Da_Create(); // AquesTalk2インスタンス生成
// Notificationの登録 発声終了を検知する必要がある場合に用いる
// メソッド名やnameは任意で
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(daDone:)
name: @"AquesTalk2DaDoneNotify"
object:nil];
NSLog(@"[INFO] %@ loaded",self);
}
-(void)shutdown:(id)sender
{
// this method is called when the module is being unloaded
// typically this is during shutdown. make sure you don't do too
// much processing here or the app will be quit forceably
// you *must* call the superclass
[super shutdown:sender];
}
#pragma mark Cleanup
-(void)dealloc
{
// release any resources that have been retained by the module
[super dealloc];
if(m_pAqTk) AquesTalk2Da_Release(m_pAqTk);
}
#pragma mark Internal Memory Management
-(void)didReceiveMemoryWarning:(NSNotification*)notification
{
// optionally release any resources that can be dynamically
// reloaded once memory is available - such as caches
[super didReceiveMemoryWarning:notification];
}
#pragma mark Listener Notifications
-(void)_listenerAdded:(NSString *)type count:(int)count
{
if (count == 1 && [type isEqualToString:@"my_event"])
{
// the first (of potentially many) listener is being added
// for event named 'my_event'
}
}
-(void)_listenerRemoved:(NSString *)type count:(int)count
{
if (count == 0 && [type isEqualToString:@"my_event"])
{
// the last listener called for event named 'my_event' has
// been removed, we can optionally clean up any resources
// since no body is listening at this point for that event
}
}
#pragma Public APIs
-(id)say:(id)args
{
ENSURE_SINGLE_ARG(args, NSDictionary);
NSString *word = [TiUtils stringValue:@"word" properties:args def:YES];
NSString *voiceKindName = [TiUtils stringValue:@"voiceKindName" properties:args def:YES];
NSLog(@"[INFO] word: %@", word);
NSLog(@"[INFO] voiceKindName: %@", voiceKindName);
// 文字コードをShiftJISに変換
char *sjis = (char*)[word cStringUsingEncoding:NSShiftJISStringEncoding];
// 音声合成 音声記号列->WAVデータ
if(m_pAqTk==0) return;
if(AquesTalk2Da_IsPlay(m_pAqTk)){
AquesTalk2Da_Stop(m_pAqTk);
}
//終了通知イベントの作成 name部分はNSNotificationCenterに設定した値に合わせる
NSNotification *notification = [NSNotification notificationWithName:@"AquesTalk2DaDoneNotify" object:self userInfo:nil];
NSString *path = [NSString stringWithFormat:@"modules/%@/phonts/%@", [self moduleId], voiceKindName];
NSLog(@"[INFO] path: %@", path);
NSURL *pathUrl = [TiUtils toURL:path relativeToURL:[[NSBundle mainBundle] bundleURL]];
NSString *pathUrlStr = [pathUrl path];
NSLog(@"[INFO] pathUrlStr: %@", pathUrlStr);
const char *pathUrlUTF8Str = pathUrlStr.UTF8String;
NSLog(@"[INFO] pathUrlUTF8Str: %s", pathUrlUTF8Str);
int size;
void *pPhont = file_load(pathUrlUTF8Str, &size);
//非同期の音声合成出力
int iret = AquesTalk2Da_Play(m_pAqTk, sjis, 100, pPhont, notification);
if(iret!=0){
// 合成失敗
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"音声記号列の指定が正しくありません"
delegate:self cancelButtonTitle:nil otherButtonTitles: @"OK", nil];
[alert show];
[alert release];
return;
}
}
- (void)daDone:(NSNotification*)notification
{
// TODO
}
@end